| // charset.hpp |
| // Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/) |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| #ifndef BOOST_LEXER_CHARSET_HPP |
| #define BOOST_LEXER_CHARSET_HPP |
| |
| #include <set> |
| #include "../size_t.hpp" |
| #include "../string_token.hpp" |
| |
| namespace boost |
| { |
| namespace lexer |
| { |
| namespace detail |
| { |
| template<typename CharT> |
| struct basic_charset |
| { |
| typedef basic_string_token<CharT> token; |
| typedef std::set<std::size_t> index_set; |
| |
| token _token; |
| index_set _index_set; |
| |
| basic_charset () |
| { |
| } |
| |
| basic_charset (const token &token_, const std::size_t index_) : |
| _token (token_) |
| { |
| _index_set.insert (index_); |
| } |
| |
| bool empty () const |
| { |
| return _token.empty () && _index_set.empty (); |
| } |
| |
| void intersect (basic_charset &rhs_, basic_charset &overlap_) |
| { |
| _token.intersect (rhs_._token, overlap_._token); |
| |
| if (!overlap_._token.empty ()) |
| { |
| typename index_set::const_iterator iter_ = _index_set.begin (); |
| typename index_set::const_iterator end_ = _index_set.end (); |
| |
| for (; iter_ != end_; ++iter_) |
| { |
| overlap_._index_set.insert (*iter_); |
| } |
| |
| iter_ = rhs_._index_set.begin (); |
| end_ = rhs_._index_set.end (); |
| |
| for (; iter_ != end_; ++iter_) |
| { |
| overlap_._index_set.insert (*iter_); |
| } |
| |
| if (_token.empty ()) |
| { |
| _index_set.clear (); |
| } |
| |
| if (rhs_._token.empty ()) |
| { |
| rhs_._index_set.clear (); |
| } |
| } |
| } |
| }; |
| } |
| } |
| } |
| |
| #endif |