• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[#iterate]
2[section iterate]
3
4[h1 Synopsis]
5
6  template <class P, class N>
7  struct iterate;
8
9This is a [link parser_combinator parser combinator].
10
11[table Arguments
12  [[Name] [Type]]
13  [[`P`]  [[link parser parser]]]
14  [[`N`]  [[link boxed_value boxed] non-negative integer value]]
15]
16
17[h1 Description]
18
19It applies `P` on the input string `N` times. The result of parsing is a
20sequence of the results of the individual applications of `P`. `P` has to accept
21the input `N` times for `iterate` to accept it.
22
23[h1 Header]
24
25  #include <boost/metaparse/iterate.hpp>
26
27[h1 Expression semantics]
28
29For any `p` parser, `n` wrapped integer the following are equivalent:
30
31  iterate<p, n>
32
33  iterate_c<p, n::type::value>
34
35[h1 Example]
36
37  #include <boost/metaparse/iterate.hpp>
38  #include <boost/metaparse/digit.hpp>
39  #include <boost/metaparse/string.hpp>
40  #include <boost/metaparse/start.hpp>
41  #include <boost/metaparse/get_result.hpp>
42  #include <boost/metaparse/is_error.hpp>
43
44  #include <boost/mpl/vector.hpp>
45  #include <boost/mpl/equal.hpp>
46  #include <boost/mpl/char.hpp>
47
48  #include <type_traits>
49
50  using namespace boost::metaparse;
51
52  static_assert(
53    boost::mpl::equal<
54      boost::mpl::vector<
55        boost::mpl::char_<'1'>,
56        boost::mpl::char_<'2'>,
57        boost::mpl::char_<'3'>
58      >,
59      get_result<
60        iterate<digit, std::integral_constant<int, 3>>::apply<
61          BOOST_METAPARSE_STRING("123"),
62          start
63        >
64      >::type
65    >::type::value,
66    "the result should be the sequence of the individual applications of digit"
67  );
68
69  static_assert(
70    boost::mpl::equal<
71      boost::mpl::vector<
72        boost::mpl::char_<'1'>,
73        boost::mpl::char_<'2'>,
74        boost::mpl::char_<'3'>
75      >,
76      get_result<
77        iterate<digit, std::integral_constant<int, 3>>::apply<
78          BOOST_METAPARSE_STRING("1234"),
79          start
80        >
81      >::type
82    >::type::value,
83    "only three iterations should be made"
84  );
85
86  static_assert(
87    is_error<
88      iterate<digit, std::integral_constant<int, 3>>::apply<
89        BOOST_METAPARSE_STRING("12"),
90        start
91      >
92    >::type::value,
93    "it should fail when digit can not be applied three times"
94  );
95
96
97[endsect]
98
99