]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | [#unless_error] |
2 | [section unless_error] | |
3 | ||
4 | [h1 Synopsis] | |
5 | ||
6 | template <class T, class NotErrorCase> | |
7 | struct unless_error; | |
8 | ||
9 | This is a [link lazy_metafunction lazy template metafunction]. | |
10 | ||
11 | [table Arguments | |
12 | [[Name] [Type]] | |
13 | [[`T`] [[link accept accept] or [link reject reject] value]] | |
14 | [[`NotErrorCase`] [[link metaprogramming_value template metaprogramming value]]] | |
15 | ] | |
16 | ||
17 | [h1 Description] | |
18 | ||
19 | Checks if `T` is a parsing error or not. When it is, the result is `T`. When it | |
20 | is not, the result is `NotErrorCase`. | |
21 | ||
22 | [h1 Header] | |
23 | ||
24 | #include <boost/metaparse/unless_error.hpp> | |
25 | ||
26 | [h1 Expression semantics] | |
27 | ||
28 | For any `t` and `c` classes the following are equivalent: | |
29 | ||
30 | unless_error<t, c> | |
31 | ||
32 | boost::mpl::if_<is_error<t::type>::type, t, c> | |
33 | ||
34 | [h1 Example] | |
35 | ||
36 | #include <boost/metaparse/unless_error.hpp> | |
37 | #include <boost/metaparse/accept.hpp> | |
38 | #include <boost/metaparse/reject.hpp> | |
39 | #include <boost/metaparse/start.hpp> | |
40 | #include <boost/metaparse/string.hpp> | |
41 | #include <boost/metaparse/define_error.hpp> | |
42 | ||
43 | #include <type_traits> | |
44 | ||
45 | using namespace boost::metaparse; | |
46 | ||
47 | BOOST_METAPARSE_DEFINE_ERROR(sample_error, "Sample error message"); | |
48 | ||
49 | using accept1 = | |
50 | accept<std::integral_constant<int, 11>, BOOST_METAPARSE_STRING("foo"), start>; | |
51 | ||
52 | using accept2 = | |
53 | accept<std::integral_constant<int, 13>, BOOST_METAPARSE_STRING("bar"), start>; | |
54 | ||
55 | using reject1 = reject<sample_error, start>; | |
56 | ||
57 | struct returns_accept1 { using type = accept1; }; | |
58 | struct returns_accept2 { using type = accept2; }; | |
59 | ||
60 | static_assert( | |
61 | std::is_same<accept2, unless_error<accept1, accept2>::type>::type::value, | |
62 | "it returns the second argument when the first argument is an accept" | |
63 | ); | |
64 | ||
65 | static_assert( | |
66 | std::is_same<reject1, unless_error<reject1, accept2>::type>::type::value, | |
67 | "it returns the first argument when that is a reject" | |
68 | ); | |
69 | ||
70 | static_assert( | |
71 | std::is_same< | |
72 | accept2, | |
73 | unless_error<returns_accept1, returns_accept2>::type | |
74 | >::type::value, | |
75 | "it supports lazy evaluation" | |
76 | ); | |
77 | ||
78 | [endsect] | |
79 |