di 0.1.0
Loading...
Searching...
No Matches
transform.h
Go to the documentation of this file.
1#pragma once
2
8
9namespace di::parser {
10namespace detail {
11 template<typename Parser, typename Fun>
12 class TransformParser : public ParserBase<TransformParser<Parser, Fun>> {
13 public:
14 template<typename P, typename F>
15 constexpr explicit TransformParser(InPlace, P&& parser, F&& function)
16 : m_parser(util::forward<P>(parser)), m_function(util::forward<F>(function)) {}
17
18 template<concepts::ParserContext Context, typename Value = meta::ParserValue<Context, Parser>>
19 requires(concepts::Parser<Parser, Context>)
20 constexpr auto parse(Context& context) const {
21 return m_parser.parse(context).transform(m_function);
22 }
23
24 private:
25 Parser m_parser;
26 Fun m_function;
27 };
28
29 struct TransformFunction {
30 template<concepts::DecayConstructible Parser, concepts::DecayConstructible Fun>
31 constexpr auto operator()(Parser&& parser, Fun&& function) const {
32 return TransformParser<meta::Decay<Parser>, meta::Decay<Fun>>(in_place, util::forward<Parser>(parser),
33 util::forward<Fun>(function));
34 }
35 };
36}
37
38constexpr inline auto transform = detail::TransformFunction {};
39
40template<concepts::DecayConstructible Parser, concepts::DecayConstructible Fun>
42constexpr auto operator%(Parser&& parser, Fun&& function) {
43 return transform(util::forward<Parser>(parser), util::forward<Fun>(function));
44}
45}
Definition operations.h:114
Definition as_bool.h:8
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
Definition code_point_parser.h:10
constexpr auto transform
Definition transform.h:38
constexpr auto parse
Definition parse.h:23
constexpr auto in_place
Definition in_place.h:8