Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2003 Joel de Guzman Chris@16: Copyright (c) 2001-2003 Daniel Nuffer Chris@16: http://spirit.sourceforge.net/ Chris@16: Chris@16: Use, modification and distribution is subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: #ifndef BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_HPP_EAN_10_04_2005 Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // basic_chset: basic character set implementation using range_run Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct basic_chset Chris@16: { Chris@16: basic_chset(); Chris@16: basic_chset(basic_chset const &arg); Chris@16: Chris@16: bool empty() const; Chris@16: void set(Char from, Char to); Chris@16: template Chris@16: void set(Char from, Char to, Traits const &tr); Chris@16: void set(Char c); Chris@16: template Chris@16: void set(Char c, Traits const &tr); Chris@16: Chris@16: void clear(Char from, Char to); Chris@16: template Chris@16: void clear(Char from, Char to, Traits const &tr); Chris@16: void clear(Char c); Chris@16: template Chris@16: void clear(Char c, Traits const &tr); Chris@16: void clear(); Chris@16: Chris@16: template Chris@16: bool test(Char v, Traits const &tr, mpl::false_) const; // case-sensitive Chris@16: template Chris@16: bool test(Char v, Traits const &tr, mpl::true_) const; // case-insensitive Chris@16: Chris@16: void inverse(); Chris@16: void swap(basic_chset& x); Chris@16: Chris@16: basic_chset &operator |=(basic_chset const &x); Chris@16: basic_chset &operator &=(basic_chset const &x); Chris@16: basic_chset &operator -=(basic_chset const &x); Chris@16: basic_chset &operator ^=(basic_chset const &x); Chris@16: Chris@16: private: Chris@16: range_run rr_; Chris@16: }; Chris@16: Chris@16: #if(CHAR_BIT == 8) Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // basic_chset: specializations for 8 bit chars using std::bitset Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct basic_chset_8bit Chris@16: { Chris@16: basic_chset_8bit(); Chris@16: basic_chset_8bit(basic_chset_8bit const &arg); Chris@16: Chris@16: bool empty() const; Chris@16: Chris@16: void set(Char from, Char to); Chris@16: template Chris@16: void set(Char from, Char to, Traits const &tr); Chris@16: void set(Char c); Chris@16: template Chris@16: void set(Char c, Traits const &tr); Chris@16: Chris@16: void clear(Char from, Char to); Chris@16: template Chris@16: void clear(Char from, Char to, Traits const &tr); Chris@16: void clear(Char c); Chris@16: template Chris@16: void clear(Char c, Traits const &tr); Chris@16: void clear(); Chris@16: Chris@16: template Chris@16: bool test(Char v, Traits const &tr, mpl::false_) const; // case-sensitive Chris@16: template Chris@16: bool test(Char v, Traits const &tr, mpl::true_) const; // case-insensitive Chris@16: Chris@16: void inverse(); Chris@16: void swap(basic_chset_8bit& x); Chris@16: Chris@16: basic_chset_8bit &operator |=(basic_chset_8bit const &x); Chris@16: basic_chset_8bit &operator &=(basic_chset_8bit const &x); Chris@16: basic_chset_8bit &operator -=(basic_chset_8bit const &x); Chris@16: basic_chset_8bit &operator ^=(basic_chset_8bit const &x); Chris@16: Chris@16: std::bitset<256> const &base() const; Chris@16: Chris@16: private: Chris@16: std::bitset<256> bset_; // BUGBUG range-checking slows this down Chris@16: }; Chris@16: Chris@16: ///////////////////////////////// Chris@16: template<> Chris@16: struct basic_chset Chris@16: : basic_chset_8bit Chris@16: { Chris@16: }; Chris@16: Chris@16: ///////////////////////////////// Chris@16: template<> Chris@16: struct basic_chset Chris@16: : basic_chset_8bit Chris@16: { Chris@16: }; Chris@16: Chris@16: ///////////////////////////////// Chris@16: template<> Chris@16: struct basic_chset Chris@16: : basic_chset_8bit Chris@16: { Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // is_narrow_char Chris@16: template Chris@16: struct is_narrow_char Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct is_narrow_char Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct is_narrow_char Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct is_narrow_char Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // helpers Chris@16: template Chris@16: void set_char(basic_chset &chset, Char ch, Traits const &tr, bool icase); Chris@16: Chris@16: template Chris@16: void set_range(basic_chset &chset, Char from, Char to, Traits const &tr, bool icase); Chris@16: Chris@16: template Chris@16: void set_class(basic_chset &chset, typename Traits::char_class_type char_class, bool no, Traits const &tr); Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif