charset.hpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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_LEXER_CHARSET_HPP
  7. #define BOOST_LEXER_CHARSET_HPP
  8. #include <set>
  9. #include "../size_t.hpp"
  10. #include "../string_token.hpp"
  11. namespace boost
  12. {
  13. namespace lexer
  14. {
  15. namespace detail
  16. {
  17. template<typename CharT>
  18. struct basic_charset
  19. {
  20. typedef basic_string_token<CharT> token;
  21. typedef std::set<std::size_t> index_set;
  22. token _token;
  23. index_set _index_set;
  24. basic_charset ()
  25. {
  26. }
  27. basic_charset (const token &token_, const std::size_t index_) :
  28. _token (token_)
  29. {
  30. _index_set.insert (index_);
  31. }
  32. bool empty () const
  33. {
  34. return _token.empty () && _index_set.empty ();
  35. }
  36. void intersect (basic_charset &rhs_, basic_charset &overlap_)
  37. {
  38. _token.intersect (rhs_._token, overlap_._token);
  39. if (!overlap_._token.empty ())
  40. {
  41. typename index_set::const_iterator iter_ = _index_set.begin ();
  42. typename index_set::const_iterator end_ = _index_set.end ();
  43. for (; iter_ != end_; ++iter_)
  44. {
  45. overlap_._index_set.insert (*iter_);
  46. }
  47. iter_ = rhs_._index_set.begin ();
  48. end_ = rhs_._index_set.end ();
  49. for (; iter_ != end_; ++iter_)
  50. {
  51. overlap_._index_set.insert (*iter_);
  52. }
  53. if (_token.empty ())
  54. {
  55. _index_set.clear ();
  56. }
  57. if (rhs_._token.empty ())
  58. {
  59. rhs_._index_set.clear ();
  60. }
  61. }
  62. }
  63. };
  64. }
  65. }
  66. }
  67. #endif