1 // charset.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_PARTITION_CHARSET_HPP
7 #define BOOST_SPIRIT_SUPPORT_DETAIL_LEXER_PARTITION_CHARSET_HPP
8 
9 #include <set>
10 #include "../size_t.hpp"
11 #include "../string_token.hpp"
12 
13 namespace boost
14 {
15 namespace lexer
16 {
17 namespace detail
18 {
19 template<typename CharT>
20 struct basic_charset
21 {
22     typedef basic_string_token<CharT> token;
23     typedef std::set<std::size_t> index_set;
24 
25     token _token;
26     index_set _index_set;
27 
basic_charsetboost::lexer::detail::basic_charset28     basic_charset ()
29     {
30     }
31 
basic_charsetboost::lexer::detail::basic_charset32     basic_charset (const token &token_, const std::size_t index_) :
33         _token (token_)
34     {
35         _index_set.insert (index_);
36     }
37 
emptyboost::lexer::detail::basic_charset38     bool empty () const
39     {
40         return _token.empty () && _index_set.empty ();
41     }
42 
intersectboost::lexer::detail::basic_charset43     void intersect (basic_charset &rhs_, basic_charset &overlap_)
44     {
45         _token.intersect (rhs_._token, overlap_._token);
46 
47         if (!overlap_._token.empty ())
48         {
49             typename index_set::const_iterator iter_ = _index_set.begin ();
50             typename index_set::const_iterator end_ = _index_set.end ();
51 
52             for (; iter_ != end_; ++iter_)
53             {
54                 overlap_._index_set.insert (*iter_);
55             }
56 
57             iter_ = rhs_._index_set.begin ();
58             end_ = rhs_._index_set.end ();
59 
60             for (; iter_ != end_; ++iter_)
61             {
62                 overlap_._index_set.insert (*iter_);
63             }
64 
65             if (_token.empty ())
66             {
67                 _index_set.clear ();
68             }
69 
70             if (rhs_._token.empty ())
71             {
72                 rhs_._index_set.clear ();
73             }
74         }
75     }
76 };
77 }
78 }
79 }
80 
81 #endif
82