Iros
 
Loading...
Searching...
No Matches
parse_impl.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/core.h"
6#include "di/parser/prelude.h"
10
11namespace di::parser::detail {
12template<concepts::SameAs<types::Tag<parser::create_parser_in_place>> Tag = types::Tag<parser::create_parser_in_place>,
13 concepts::ReflectableToEnumerators T>
14constexpr auto tag_invoke(Tag, InPlaceType<T>) {
15 auto valid_code_point = [](c32 code_point) {
16 constexpr auto valid_char_table = [] {
17 auto table = vocab::Array<bool, 256> {};
19 [&](auto enumerator) {
20 for (auto ch : enumerator.name) {
21 table[ch] = true;
22 }
23 },
25 return table;
26 }();
27
28 return code_point < 256 && valid_char_table[code_point];
29 };
30
31 return parser::match_one_or_more(valid_code_point) <<
32 []<typename Context>(Context& context,
34 auto result = vocab::Optional<T> {};
36 [&](auto enumerator) {
37 if (container::equal(results, enumerator.name)) {
38 result = enumerator.value;
39 }
40 },
42
43 if (!result) {
45 }
46 return *result;
47 };
48}
49}
Definition optional_forward_declaration.h:5
Definition operations.h:34
constexpr auto equal
Definition equal.h:46
vocab::Expected< T, meta::ParserContextError< Context > > ParserContextResult
Definition parser_context_result.h:8
Definition zstring_parser.h:10
constexpr auto code_point
Definition code_point_parser.h:35
constexpr auto make_error
Definition make_error.h:19
constexpr auto match_one_or_more
Definition match_one_or_more.h:32
constexpr auto reflect
Definition reflect.h:46
char32_t c32
Definition char.h:6
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto enumerator
Definition enumerator.h:36
constexpr auto in_place_type
Definition in_place_type.h:12
Definition in_place_type.h:5
Definition span_fixed_size.h:37