]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/spirit/home/support/iterators/detail/lex_input_policy.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / spirit / home / support / iterators / detail / lex_input_policy.hpp
1 // Copyright (c) 2001 Daniel C. Nuffer
2 // Copyright (c) 2001-2011 Hartmut Kaiser
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7 #if !defined(BOOST_SPIRIT_ITERATOR_LEX_INPUT_POLICY_MAR_16_2007_1205PM)
8 #define BOOST_SPIRIT_ITERATOR_LEX_INPUT_POLICY_MAR_16_2007_1205PM
9
10 #include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>
11 #include <boost/spirit/home/support/iterators/detail/multi_pass.hpp>
12
13 namespace boost { namespace spirit { namespace iterator_policies
14 {
15 ///////////////////////////////////////////////////////////////////////////////
16 // class lex_input
17 // Implementation of the InputPolicy used by multi_pass
18 //
19 // The lex_input class gets tokens (integers) from yylex()
20 ///////////////////////////////////////////////////////////////////////////
21 struct lex_input
22 {
23 typedef int value_type;
24
25 ///////////////////////////////////////////////////////////////////////
26 template <typename T>
27 class unique : public detail::default_input_policy
28 {
29 public:
30 typedef std::ptrdiff_t difference_type;
31 typedef std::ptrdiff_t distance_type;
32 typedef int* pointer;
33 typedef int& reference;
34
35 protected:
36 unique() {}
37 explicit unique(T) {}
38
39 public:
40 template <typename MultiPass>
41 static typename MultiPass::reference get_input(MultiPass& mp)
42 {
43 value_type& curtok = mp.shared()->curtok;
44 if (-1 == curtok)
45 {
46 extern int yylex();
47 curtok = yylex();
48 }
49 return curtok;
50 }
51
52 template <typename MultiPass>
53 static void advance_input(MultiPass& mp)
54 {
55 extern int yylex();
56 mp.shared()->curtok = yylex();
57 }
58
59 // test, whether we reached the end of the underlying stream
60 template <typename MultiPass>
61 static bool input_at_eof(MultiPass const& mp)
62 {
63 return mp.shared()->curtok == 0;
64 }
65
66 template <typename MultiPass>
67 static bool input_is_valid(MultiPass const&, value_type const& t)
68 {
69 return -1 != t;
70 }
71 };
72
73 ///////////////////////////////////////////////////////////////////////
74 template <typename T>
75 struct shared
76 {
77 explicit shared(T) : curtok(-1) {}
78
79 value_type curtok;
80 };
81 };
82
83 }}}
84
85 #endif
86