35 using value_type = uint64_t;
50 constexpr friend
bool operator==(
character const&,
character const&) noexcept = default;
51 constexpr friend auto operator<=>(
character const&,
character const&) noexcept = default;
54 _value((attributes.intrinsic() << 21) | g.intrinsic())
59 character(hi::grapheme{code_point}, attributes)
63 constexpr character(
char code_point, character_attributes attributes) noexcept :
64 character(hi::grapheme{code_point}, attributes)
68 template<character_attribute... Attributes>
69 constexpr character(hi::grapheme g, Attributes
const&...attributes) noexcept :
70 character(g, character_attributes{attributes...})
74 template<character_attribute... Attributes>
75 constexpr character(
char32_t code_point, Attributes
const&...attributes) noexcept :
76 character(code_point, character_attributes{attributes...})
80 template<character_attribute... Attributes>
81 constexpr character(
char code_point, Attributes
const&...attributes) noexcept :
82 character(code_point, character_attributes{attributes...})
86 constexpr character(intrinsic_t, value_type value) noexcept :
_value(value) {}
88 constexpr value_type& intrinsic() noexcept
93 constexpr value_type
const& intrinsic() const noexcept
98 constexpr character& operator=(hi::grapheme grapheme)
noexcept
100 return set_grapheme(grapheme);
103 constexpr character& operator=(
char32_t code_point)
noexcept
105 return set_grapheme(hi::grapheme{code_point});
108 constexpr character& operator=(
char code_point)
noexcept
110 return set_grapheme(hi::grapheme{code_point});
113 [[nodiscard]]
constexpr hi::grapheme grapheme() const noexcept
115 return hi::grapheme{intrinsic_t{},
_value & 0x1f'ffff};
118 constexpr character& set_grapheme(hi::grapheme grapheme)
noexcept
122 _value |= grapheme.intrinsic();
126 [[nodiscard]]
size_t size() const noexcept
128 return grapheme().size();
131 [[nodiscard]]
char32_t operator[](
size_t i)
const noexcept
133 return grapheme()[i];
136 [[nodiscard]]
constexpr character_attributes attributes() const noexcept
138 return character_attributes{intrinsic_t{},
_value >> 21};
141 constexpr character& set_attributes(character_attributes attributes)
noexcept
144 _value |= attributes.intrinsic() << 21;