Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

iterate

Synopsis

template <class P, class N>
struct iterate;

This is a parser combinator.

Table 52. Arguments

Name

Type

P

parser

N

boxed non-negative integer value


Description

It applies P on the input string N times. The result of parsing is a sequence of the results of the individual applications of P. P has to accept the input N times for iterate to accept it.

Header

#include <boost/metaparse/iterate.hpp>

Expression semantics

For any p parser, n wrapped integer the following are equivalent:

iterate<p, n>

iterate_c<p, n::type::value>

Example

#include <boost/metaparse/iterate.hpp>
#include <boost/metaparse/digit.hpp>
#include <boost/metaparse/string.hpp>
#include <boost/metaparse/start.hpp>
#include <boost/metaparse/get_result.hpp>
#include <boost/metaparse/is_error.hpp>

#include <boost/mpl/vector.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/char.hpp>

#include <type_traits>

using namespace boost::metaparse;

static_assert(
  boost::mpl::equal<
    boost::mpl::vector<
      boost::mpl::char_<'1'>,
      boost::mpl::char_<'2'>,
      boost::mpl::char_<'3'>
    >,
    get_result<
      iterate<digit, std::integral_constant<int, 3>>::apply<
        BOOST_METAPARSE_STRING("123"),
        start
      >
    >::type
  >::type::value,
  "the result should be the sequence of the individual applications of digit"
);

static_assert(
  boost::mpl::equal<
    boost::mpl::vector<
      boost::mpl::char_<'1'>,
      boost::mpl::char_<'2'>,
      boost::mpl::char_<'3'>
    >,
    get_result<
      iterate<digit, std::integral_constant<int, 3>>::apply<
        BOOST_METAPARSE_STRING("1234"),
        start
      >
    >::type
  >::type::value,
  "only three iterations should be made"
);

static_assert(
  is_error<
    iterate<digit, std::integral_constant<int, 3>>::apply<
      BOOST_METAPARSE_STRING("12"),
      start
    >
  >::type::value,
  "it should fail when digit can not be applied three times"
);

PrevUpHomeNext