27 struct UniversalFunction {
38 struct ContiguousFunction {
49 struct NullTerminatedFunction {
61constexpr inline auto universal = detail::UniversalFunction {};
62constexpr inline auto contiguous = detail::ContiguousFunction {};
75 struct ValidateFunction {
88 struct ValidByteOffsetFunction {
89 template<
typename T,
typename U = meta::EncodingCodeUnit<T>>
90 requires(Contiguous<T> ||
92 constexpr auto operator()(T
const& encoding,
Span<U const> code_units,
size_t offset)
const ->
bool {
93 if constexpr (Contiguous<T>) {
94 return offset <= code_units.size();
101 struct MakeIteratorFunction {
102 template<
typename T,
typename U = meta::EncodingCodeUnit<T>,
typename Iter = meta::EncodingIterator<T>>
103 requires(concepts::TagInvocableTo<MakeIteratorFunction, Iter, T const&, Span<U const>,
size_t> ||
104 concepts::ConstructibleFrom<Iter, U const*>)
105 constexpr auto operator()(T
const& encoding, Span<U const> code_units,
size_t offset)
const -> Iter {
106 if constexpr (concepts::TagInvocableTo<MakeIteratorFunction, Iter, T const&, Span<U const>,
size_t>) {
109 return Iter(code_units.data() + offset);
114 struct IteratorDataFunction {
115 template<
typename T,
typename U = meta::EncodingCodeUnit<T>,
typename Iter = meta::EncodingIterator<T>>
116 requires(concepts::ExplicitlyConvertibleTo<Iter, U const*>)
117 constexpr auto operator()(T
const&, Span<U>, Iter
iterator)
const -> U* {
119 return const_cast<U*
>(
static_cast<U const*
>(
iterator));
123 struct ConvertToCodeUnitsFunction {
124 template<
typename T,
typename U = meta::EncodingCodeUnit<T>,
typename P = meta::EncodingCodePo
int<T>>
125 requires(concepts::TagInvocable<ConvertToCodeUnitsFunction, T const&, P> || concepts::SameAs<U, P>)
126 constexpr auto operator()(T
const& encoding, P
code_point)
const -> concepts::ContainerOf<U>
auto {
127 if constexpr (concepts::TagInvocable<ConvertToCodeUnitsFunction, T const&, P>) {
135constexpr inline auto validate = detail::ValidateFunction {};
142 template<
typename V,
typename P>
146 struct CodePointViewFunction {
147 template<
typename T,
typename U = meta::EncodingCodeUnit<T>,
typename P = meta::EncodingCodePo
int<T>>
148 constexpr auto operator()(T
const&
encoding,
Span<U const> code_units)
const -> CodePointView<P>
auto {
165 struct UnicodeCodePointViewFunction {
166 template<
typename T,
typename U = meta::EncodingCodePo
int<T>,
typename P = meta::EncodingCodePo
int<T>>
169 constexpr auto operator()(T
const&
encoding,
Span<U const> code_units)
const -> UnicodeCodePointView
auto {
176 return c32(code_point);
182 struct UnicodeCodePointUnwrapFunction {
183 template<
typename T,
typename Input,
typename U = meta::EncodingCodePo
int<T>,
184 typename P = meta::EncodingCodePo
int<T>>
185 requires(concepts::TagInvocable<UnicodeCodePointUnwrapFunction, T const&, Input> || concepts::SameAs<P, c32> ||
186 concepts::ConstructibleFrom<c32, P>)
188 if constexpr (concepts::TagInvocable<UnicodeCodePointViewFunction, T const&, Input>) {
190 }
else if constexpr (concepts::SameAs<P, c32>) {