di 0.1.0
Loading...
Searching...
No Matches
create_parser.h
Go to the documentation of this file.
1#pragma once
2
5
6namespace di::parser {
7namespace detail {
8 struct CreateParserInPlaceFunction {
9 template<typename T, concepts::ParserContext Context>
10 requires(concepts::TagInvocable<CreateParserInPlaceFunction, InPlaceType<T>, Context&> ||
11 concepts::TagInvocable<CreateParserInPlaceFunction, InPlaceType<T>>)
12 constexpr auto operator()(InPlaceType<T>, Context& context) const -> concepts::Parser<Context> auto {
13 if constexpr (concepts::TagInvocable<CreateParserInPlaceFunction, InPlaceType<T>, Context&>) {
14 return function::tag_invoke(*this, in_place_type<T>, context);
15 } else {
16 return (*this)(in_place_type<T>);
17 }
18 }
19
20 template<typename T>
21 requires(concepts::TagInvocable<CreateParserInPlaceFunction, InPlaceType<T>>)
22 constexpr auto operator()(InPlaceType<T>) const {
24 }
25 };
26}
27
28constexpr inline auto create_parser_in_place = detail::CreateParserInPlaceFunction {};
29}
30
31namespace di::concepts {
32template<typename T, typename Context>
33concept Parsable = requires(Context& context) { parser::create_parser_in_place(in_place_type<T>, context); };
34}
35
36namespace di::parser {
37namespace detail {
38 template<typename T>
39 struct CreateParserFunction {
40 template<concepts::ParserContext Context>
42 constexpr auto operator()(Context& context) const {
44 }
45
46 constexpr auto operator()() const
47 requires(requires { create_parser_in_place(in_place_type<T>); })
48 {
50 }
51 };
52}
53
54template<typename T>
55constexpr inline auto create_parser = detail::CreateParserFunction<T> {};
56}
57
58namespace di {
61}
Definition create_parser.h:33
Definition any_storable.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition code_point_parser.h:10
constexpr auto create_parser
Definition create_parser.h:55
constexpr auto create_parser_in_place
Definition create_parser.h:28
Definition any_storable.h:9
constexpr auto in_place_type
Definition in_place_type.h:12