Loading [MathJax]/extensions/tex2jax.js
Iros
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
Loading...
Searching...
No Matches
sequence.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/constexpr.h"
9#include "di/vocab/prelude.h"
10
11namespace di::parser {
12namespace detail {
14
15 template<typename... Parsers>
17 : public ParserBase<SequenceParser<Parsers...>>
18 , public SequenceParserMarker {
19 public:
20 template<typename... Ps>
21 constexpr explicit SequenceParser(InPlace, Ps&&... parsers) : m_parsers(util::forward<Ps>(parsers)...) {}
22
23 template<concepts::ParserContext Context>
25 constexpr auto parse(Context& context) const {
26 constexpr auto make_result = function::overload(
27 [] {
29 },
30 []<typename T>(T&& value) {
31 return meta::ParserContextResult<T, Context>(in_place, util::forward<T>(value));
32 },
33 []<typename... Types>(Types&&... values) {
34 return meta::ParserContextResult<Tuple<Types...>, Context>(in_place,
35 util::forward<Types>(values)...);
36 });
37
38 auto process_index = function::ycombinator([&]<size_t index, typename... Types>(
39 auto& self, Constexpr<index>, Types&&... values) {
40 if constexpr (index >= sizeof...(Parsers)) {
41 return make_result(util::forward<Types>(values)...);
42 } else {
43 using Value = meta::ExpectedValue<
44 decltype(util::get<index>(util::declval<Tuple<Parsers...> const&>()).parse(context))>;
45 if constexpr (concepts::LanguageVoid<Value>) {
46 return util::get<index>(m_parsers).parse(context).and_then([&] {
47 return self(c_<index + 1>, util::forward<Types>(values)...);
48 });
49 } else {
50 return util::get<index>(m_parsers).parse(context).and_then([&](Value&& value) {
51 return self(c_<index + 1>, util::forward<Types>(values)..., util::forward<Value>(value));
52 });
53 }
54 }
55 });
56
57 return process_index(c_<0ZU>);
58 }
59
60 Tuple<Parsers...> m_parsers;
61 };
62
64 template<concepts::DecayConstructible... Parsers>
65 constexpr auto operator()(Parsers&&... parsers) const {
66 return SequenceParser<meta::Decay<Parsers>...>(in_place, util::forward<Parsers>(parsers)...);
67 }
68 };
69}
70
71constexpr inline auto sequence = detail::SequenceFunction {};
72
73template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
75constexpr auto operator>>(Left&& left, Right&& right) {
76 return sequence(util::forward<Left>(left), util::forward<Right>(right));
77}
78
79template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
83constexpr auto operator>>(Left&& left, Right&& right) {
84 return vocab::apply(
85 [&]<typename... Rs>(Rs&&... rs) {
86 return sequence(util::forward<Left>(left), util::forward<Rs>(rs)...);
87 },
88 util::forward<Right>(right).m_parsers);
89}
90
91template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
95constexpr auto operator>>(Left&& left, Right&& right) {
96 return vocab::apply(
97 [&]<typename... Ls>(Ls&&... ls) {
98 return sequence(util::forward<Ls>(ls)..., util::forward<Right>(right));
99 },
100 util::forward<Left>(left).m_parsers);
101}
102
103template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
107constexpr auto operator>>(Left&& left, Right&& right) {
108 return vocab::apply(
109 [&]<typename... Ls>(Ls&&... ls) {
110 return vocab::apply(
111 [&]<typename... Rs>(Rs&&... rs) {
112 return sequence(util::forward<Ls>(ls)..., util::forward<Rs>(rs)...);
113 },
114 util::forward<Right>(right).m_parsers);
115 },
116 util::forward<Left>(left).m_parsers);
117}
118}
Definition parser_base.h:5
Definition sequence.h:18
Tuple< Parsers... > m_parsers
Definition sequence.h:60
constexpr auto parse(Context &context) const
Definition sequence.h:25
constexpr SequenceParser(InPlace, Ps &&... parsers)
Definition sequence.h:21
Definition tuple_forward_declaration.h:5
Definition operations.h:114
Definition core.h:128
Definition parser.h:10
constexpr auto ycombinator
Definition ycombinator.h:63
constexpr auto overload
Definition overload.h:28
vocab::Expected< T, meta::ParserContextError< Context > > ParserContextResult
Definition parser_context_result.h:8
meta::RemoveCVRef< T >::Value ExpectedValue
Definition vocab.h:35
Definition zstring_parser.h:10
Definition zstring_parser.h:9
constexpr auto sequence
Definition sequence.h:71
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place
Definition in_place.h:8
Definition ls.cpp:4
A wrapper for a constexpr value.
Definition core.h:77
Definition sequence.h:63
constexpr auto operator()(Parsers &&... parsers) const
Definition sequence.h:65
Definition in_place.h:4