• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  Copyright (c) 2001-2011 Hartmut Kaiser
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #if !defined(BOOST_SPIRIT_LEX_TEST_MAR_23_2007_0721PM)
7 #define BOOST_SPIRIT_LEX_TEST_MAR_23_2007_0721PM
8 
9 #include <boost/variant.hpp>
10 #include <boost/range/iterator_range_core.hpp>
11 
12 namespace spirit_test
13 {
14     ///////////////////////////////////////////////////////////////////////////
15     struct display_type
16     {
17         template<typename T>
operator ()spirit_test::display_type18         void operator()(T const &) const
19         {
20             std::cout << typeid(T).name() << std::endl;
21         }
22 
23         template<typename T>
printspirit_test::display_type24         static void print()
25         {
26             std::cout << typeid(T).name() << std::endl;
27         }
28     };
29 
30     ///////////////////////////////////////////////////////////////////////////
31     display_type const display = {};
32 
33     ///////////////////////////////////////////////////////////////////////////
34     template <typename Iterator>
35     inline boost::iterator_range<Iterator> const&
get_iterpair(boost::iterator_range<Iterator> const & itp)36     get_iterpair(boost::iterator_range<Iterator> const& itp)
37     {
38         return itp;
39     }
40 
41     template <typename Iterator, BOOST_VARIANT_ENUM_PARAMS(typename T)>
42     inline boost::iterator_range<Iterator> const&
get_iterpair(boost::variant<BOOST_VARIANT_ENUM_PARAMS (T)> const & v)43     get_iterpair(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& v)
44     {
45         return boost::get<boost::iterator_range<Iterator> >(v);
46     }
47 
48     ///////////////////////////////////////////////////////////////////////////
49     template <typename Lexer, typename Char>
50     inline bool
test(Lexer & lex,Char const * input,std::size_t token_id=0,Char const * state=NULL)51     test(Lexer& lex, Char const* input, std::size_t token_id = 0,
52         Char const* state = NULL)
53     {
54         typedef typename Lexer::iterator_type iterator_type;
55         typedef std::basic_string<Char> string_type;
56 
57         string_type str(input);
58         typename string_type::iterator it = str.begin();
59 
60         iterator_type first = lex.begin(it, str.end());
61         iterator_type last = lex.end();
62 
63         bool r = true;
64 
65         if (NULL != state) {
66             std::size_t stateid = lex.map_state(state);
67             r = r && (static_cast<unsigned>(~0) != stateid);
68             first.set_state(stateid);
69         }
70 
71         r = r && lex;
72         r = r && first != last;
73 
74         if (token_id != 0)
75             r = r && (*first).id() == token_id;
76         else
77             r = r && (*first).id() != 0;
78 
79         using namespace boost;
80 
81         typedef typename Lexer::iterator_type::base_iterator_type iterator;
82         typedef iterator_range<iterator> iterpair_type;
83         iterpair_type const& ip = get_iterpair<iterator>((*first).value());
84 
85         r = r && string_type(ip.begin(), ip.end()) == str;
86         return r && first != last && ++first == last;
87     }
88 }
89 
90 #endif
91 
92 
93