1 // tokeniser_state.hpp
2 // Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_SPIRIT_SUPPORT_DETAIL_LEXER_PARSER_TOKENISER_RE_TOKENISER_STATE_HPP
7 #define BOOST_SPIRIT_SUPPORT_DETAIL_LEXER_PARSER_TOKENISER_RE_TOKENISER_STATE_HPP
8 
9 #include "../../consts.hpp"
10 #include <locale>
11 #include "../../size_t.hpp"
12 #include <stack>
13 
14 namespace boost
15 {
16 namespace lexer
17 {
18 namespace detail
19 {
20 template<typename CharT>
21 struct basic_re_tokeniser_state
22 {
23     const CharT * const _start;
24     const CharT * const _end;
25     const CharT *_curr;
26     regex_flags _flags;
27     std::stack<regex_flags> _flags_stack;
28     std::locale _locale;
29     long _paren_count;
30     bool _in_string;
31     bool _seen_BOL_assertion;
32     bool _seen_EOL_assertion;
33 
basic_re_tokeniser_stateboost::lexer::detail::basic_re_tokeniser_state34     basic_re_tokeniser_state (const CharT *start_, const CharT * const end_,
35         const regex_flags flags_, const std::locale locale_) :
36         _start (start_),
37         _end (end_),
38         _curr (start_),
39         _flags (flags_),
40         _locale (locale_),
41         _paren_count (0),
42         _in_string (false),
43         _seen_BOL_assertion (false),
44         _seen_EOL_assertion (false)
45     {
46     }
47 
48     // prevent VC++ 7.1 warning:
operator =boost::lexer::detail::basic_re_tokeniser_state49     const basic_re_tokeniser_state &operator =
50         (const basic_re_tokeniser_state &rhs_)
51     {
52         _start = rhs_._start;
53         _end = rhs_._end;
54         _curr = rhs_._curr;
55         _flags = rhs_._flags;
56         _locale = rhs_._locale;
57         _paren_count = rhs_._paren_count;
58         _in_string = rhs_._in_string;
59         _seen_BOL_assertion = rhs_._seen_BOL_assertion;
60         _seen_EOL_assertion = rhs_._seen_EOL_assertion;
61         return this;
62     }
63 
nextboost::lexer::detail::basic_re_tokeniser_state64     inline bool next (CharT &ch_)
65     {
66         if (_curr >= _end)
67         {
68             ch_ = 0;
69             return true;
70         }
71         else
72         {
73             ch_ = *_curr;
74             increment ();
75             return false;
76         }
77     }
78 
incrementboost::lexer::detail::basic_re_tokeniser_state79     inline void increment ()
80     {
81         ++_curr;
82     }
83 
indexboost::lexer::detail::basic_re_tokeniser_state84     inline std::size_t index ()
85     {
86         return _curr - _start;
87     }
88 
eosboost::lexer::detail::basic_re_tokeniser_state89     inline bool eos ()
90     {
91         return _curr >= _end;
92     }
93 };
94 }
95 }
96 }
97 
98 #endif
99