dius 0.1.0
Loading...
Searching...
No Matches
property_range.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/container/algorithm/lower_bound.h"
4#include "di/reflect/prelude.h"
5
6namespace dius::unicode {
7template<di::concepts::Enum Property>
9 u32 start { 0 };
10 u32 end { 0 };
11 Property property {};
12
13 constexpr auto contains(c32 code_point) const -> bool { return code_point >= start && code_point < end; }
14
15 auto operator==(PropertyRange const&) const -> bool = default;
16 constexpr auto operator==(c32 code_point) const -> bool { return contains(code_point); }
17
18 auto operator<=>(PropertyRange const&) const = default;
19 constexpr auto operator<=>(c32 code_point) const {
20 if (contains(code_point)) {
21 return di::strong_ordering::equal;
22 }
23 return start <=> code_point;
24 }
25
26 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<PropertyRange>) {
27 return di::make_fields<"Range">(di::field<"start", &PropertyRange::start>,
28 di::field<"end", &PropertyRange::end>,
29 di::field<"property", &PropertyRange::property>);
30 }
31};
32
33namespace detail {
34 template<di::concepts::Enum Property, Property fallback>
36 di::Span<PropertyRange<Property> const> ranges;
37
38 constexpr auto operator()(c32 code_point) const {
39 auto const* range = di::lower_bound(ranges, code_point);
40 if (range == ranges.end() || !range->contains(code_point)) {
41 return fallback;
42 }
43 return range->property;
44 }
45 };
46}
47}
Definition print.h:8
Definition default_ignorable_code_point.h:8
Definition property_range.h:8
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< PropertyRange >)
Definition property_range.h:26
auto operator==(PropertyRange const &) const -> bool=default
u32 start
Definition property_range.h:9
u32 end
Definition property_range.h:10
constexpr auto contains(c32 code_point) const -> bool
Definition property_range.h:13
Property property
Definition property_range.h:11
constexpr auto operator==(c32 code_point) const -> bool
Definition property_range.h:16
auto operator<=>(PropertyRange const &) const =default
constexpr auto operator<=>(c32 code_point) const
Definition property_range.h:19
Definition property_range.h:35
constexpr auto operator()(c32 code_point) const
Definition property_range.h:38
di::Span< PropertyRange< Property > const > ranges
Definition property_range.h:36