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_IPP Chris@16: #define BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // basic_chset: character set implementation Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: inline basic_chset::basic_chset() Chris@16: { Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline basic_chset::basic_chset(basic_chset const &arg) Chris@16: : rr_(arg.rr_) Chris@16: { Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline bool basic_chset::empty() const Chris@16: { Chris@16: return this->rr_.empty(); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline bool basic_chset::test(Char v, Traits const &, mpl::false_) const // case-sensitive Chris@16: { Chris@16: return this->rr_.test(v); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline bool basic_chset::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive Chris@16: { Chris@16: return this->rr_.test(v, tr); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::set(Char from, Char to) Chris@16: { Chris@16: this->rr_.set(range(from, to)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset::set(Char from, Char to, Traits const &) Chris@16: { Chris@16: this->rr_.set(range(from, to)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::set(Char c) Chris@16: { Chris@16: this->rr_.set(range(c, c)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset::set(Char c, Traits const &) Chris@16: { Chris@16: this->rr_.set(range(c, c)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::clear(Char c) Chris@16: { Chris@16: this->rr_.clear(range(c, c)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset::clear(Char c, Traits const &) Chris@16: { Chris@16: this->rr_.clear(range(c, c)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::clear(Char from, Char to) Chris@16: { Chris@16: this->rr_.clear(range(from, to)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset::clear(Char from, Char to, Traits const &) Chris@16: { Chris@16: this->rr_.clear(range(from, to)); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::clear() Chris@16: { Chris@16: this->rr_.clear(); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::inverse() Chris@16: { Chris@16: // BUGBUG is this right? Does this handle icase correctly? Chris@16: basic_chset inv; Chris@16: inv.set((std::numeric_limits::min)(), (std::numeric_limits::max)()); Chris@16: inv -= *this; Chris@16: this->swap(inv); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset::swap(basic_chset &that) Chris@16: { Chris@16: this->rr_.swap(that.rr_); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset & Chris@16: basic_chset::operator |=(basic_chset const &that) Chris@16: { Chris@16: typedef typename range_run::const_iterator const_iterator; Chris@16: for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter) Chris@16: { Chris@16: this->rr_.set(*iter); Chris@16: } Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset & Chris@16: basic_chset::operator &=(basic_chset const &that) Chris@16: { Chris@16: basic_chset inv; Chris@16: inv.set((std::numeric_limits::min)(), (std::numeric_limits::max)()); Chris@16: inv -= that; Chris@16: *this -= inv; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset & Chris@16: basic_chset::operator -=(basic_chset const &that) Chris@16: { Chris@16: typedef typename range_run::const_iterator const_iterator; Chris@16: for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter) Chris@16: { Chris@16: this->rr_.clear(*iter); Chris@16: } Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset & Chris@16: basic_chset::operator ^=(basic_chset const &that) Chris@16: { Chris@16: basic_chset bma = that; Chris@16: bma -= *this; Chris@16: *this -= that; Chris@16: *this |= bma; Chris@16: return *this; 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: inline basic_chset_8bit::basic_chset_8bit() Chris@16: { Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset_8bit::basic_chset_8bit(basic_chset_8bit const &arg) Chris@16: : bset_(arg.bset_) Chris@16: { Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline bool basic_chset_8bit::empty() const Chris@16: { Chris@16: return !this->bset_.any(); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline bool basic_chset_8bit::test(Char v, Traits const &, mpl::false_) const // case-sensitive Chris@16: { Chris@16: return this->bset_.test((unsigned char)v); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline bool basic_chset_8bit::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive Chris@16: { Chris@16: return this->bset_.test((unsigned char)tr.translate_nocase(v)); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::set(Char from, Char to) Chris@16: { Chris@16: for(int i = from; i <= to; ++i) Chris@16: { Chris@16: this->bset_.set((unsigned char)i); Chris@16: } Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset_8bit::set(Char from, Char to, Traits const &tr) Chris@16: { Chris@16: for(int i = from; i <= to; ++i) Chris@16: { Chris@16: this->bset_.set((unsigned char)tr.translate_nocase((Char)i)); Chris@16: } Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::set(Char c) Chris@16: { Chris@16: this->bset_.set((unsigned char)c); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset_8bit::set(Char c, Traits const &tr) Chris@16: { Chris@16: this->bset_.set((unsigned char)tr.translate_nocase(c)); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::clear(Char from, Char to) Chris@16: { Chris@16: for(int i = from; i <= to; ++i) Chris@16: { Chris@16: this->bset_.reset((unsigned char)i); Chris@16: } Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset_8bit::clear(Char from, Char to, Traits const &tr) Chris@16: { Chris@16: for(int i = from; i <= to; ++i) Chris@16: { Chris@16: this->bset_.reset((unsigned char)tr.translate_nocase((Char)i)); Chris@16: } Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::clear(Char c) Chris@16: { Chris@16: this->bset_.reset((unsigned char)c); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: template Chris@16: inline void basic_chset_8bit::clear(Char c, Traits const &tr) Chris@16: { Chris@16: this->bset_.reset((unsigned char)tr.tranlsate_nocase(c)); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::clear() Chris@16: { Chris@16: this->bset_.reset(); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::inverse() Chris@16: { Chris@16: this->bset_.flip(); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline void basic_chset_8bit::swap(basic_chset_8bit &that) Chris@16: { Chris@16: std::swap(this->bset_, that.bset_); Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset_8bit & Chris@16: basic_chset_8bit::operator |=(basic_chset_8bit const &that) Chris@16: { Chris@16: this->bset_ |= that.bset_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset_8bit & Chris@16: basic_chset_8bit::operator &=(basic_chset_8bit const &that) Chris@16: { Chris@16: this->bset_ &= that.bset_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset_8bit & Chris@16: basic_chset_8bit::operator -=(basic_chset_8bit const &that) Chris@16: { Chris@16: this->bset_ &= ~that.bset_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ///////////////////////////////// Chris@16: template Chris@16: inline basic_chset_8bit & Chris@16: basic_chset_8bit::operator ^=(basic_chset_8bit const &that) Chris@16: { Chris@16: this->bset_ ^= that.bset_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline std::bitset<256> const & Chris@16: basic_chset_8bit::base() const Chris@16: { Chris@16: return this->bset_; Chris@16: } Chris@16: Chris@16: #endif // if(CHAR_BIT == 8) Chris@16: Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // helpers Chris@16: template Chris@16: inline void set_char(basic_chset &chset, Char ch, Traits const &tr, bool icase) Chris@16: { Chris@16: icase ? chset.set(ch, tr) : chset.set(ch); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void set_range(basic_chset &chset, Char from, Char to, Traits const &tr, bool icase) Chris@16: { Chris@16: icase ? chset.set(from, to, tr) : chset.set(from, to); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void set_class(basic_chset &chset, typename Traits::char_class_type char_class, bool no, Traits const &tr) Chris@16: { Chris@16: BOOST_MPL_ASSERT_RELATION(1, ==, sizeof(Char)); Chris@16: for(std::size_t i = 0; i <= UCHAR_MAX; ++i) Chris@16: { Chris@16: typedef typename std::char_traits::int_type int_type; Chris@16: Char ch = std::char_traits::to_char_type(static_cast(i)); Chris@16: if(no != tr.isctype(ch, char_class)) Chris@16: { Chris@16: chset.set(ch); Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif Chris@16: