123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- /*=============================================================================
- Copyright (c) 2001-2003 Joel de Guzman
- Copyright (c) 2001-2003 Daniel Nuffer
- http://spirit.sourceforge.net/
- Use, modification and distribution is subject to the Boost Software
- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #ifndef BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
- #define BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
- ///////////////////////////////////////////////////////////////////////////////
- #include <bitset>
- #include <boost/xpressive/detail/utility/chset/basic_chset.hpp>
- ///////////////////////////////////////////////////////////////////////////////
- namespace boost { namespace xpressive { namespace detail
- {
- ///////////////////////////////////////////////////////////////////////////////
- //
- // basic_chset: character set implementation
- //
- ///////////////////////////////////////////////////////////////////////////////
- template<typename Char>
- inline basic_chset<Char>::basic_chset()
- {
- }
- //////////////////////////////////
- template<typename Char>
- inline basic_chset<Char>::basic_chset(basic_chset const &arg)
- : rr_(arg.rr_)
- {
- }
- //////////////////////////////////
- template<typename Char>
- inline bool basic_chset<Char>::empty() const
- {
- return this->rr_.empty();
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline bool basic_chset<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
- {
- return this->rr_.test(v);
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline bool basic_chset<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
- {
- return this->rr_.test(v, tr);
- }
- //////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::set(Char from, Char to)
- {
- this->rr_.set(range<Char>(from, to));
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset<Char>::set(Char from, Char to, Traits const &)
- {
- this->rr_.set(range<Char>(from, to));
- }
- //////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::set(Char c)
- {
- this->rr_.set(range<Char>(c, c));
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset<Char>::set(Char c, Traits const &)
- {
- this->rr_.set(range<Char>(c, c));
- }
- //////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::clear(Char c)
- {
- this->rr_.clear(range<Char>(c, c));
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset<Char>::clear(Char c, Traits const &)
- {
- this->rr_.clear(range<Char>(c, c));
- }
- //////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::clear(Char from, Char to)
- {
- this->rr_.clear(range<Char>(from, to));
- }
- //////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset<Char>::clear(Char from, Char to, Traits const &)
- {
- this->rr_.clear(range<Char>(from, to));
- }
- //////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::clear()
- {
- this->rr_.clear();
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::inverse()
- {
- // BUGBUG is this right? Does this handle icase correctly?
- basic_chset<Char> inv;
- inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
- inv -= *this;
- this->swap(inv);
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset<Char>::swap(basic_chset<Char> &that)
- {
- this->rr_.swap(that.rr_);
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset<Char> &
- basic_chset<Char>::operator |=(basic_chset<Char> const &that)
- {
- typedef typename range_run<Char>::const_iterator const_iterator;
- for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
- {
- this->rr_.set(*iter);
- }
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset<Char> &
- basic_chset<Char>::operator &=(basic_chset<Char> const &that)
- {
- basic_chset<Char> inv;
- inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
- inv -= that;
- *this -= inv;
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset<Char> &
- basic_chset<Char>::operator -=(basic_chset<Char> const &that)
- {
- typedef typename range_run<Char>::const_iterator const_iterator;
- for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
- {
- this->rr_.clear(*iter);
- }
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset<Char> &
- basic_chset<Char>::operator ^=(basic_chset<Char> const &that)
- {
- basic_chset bma = that;
- bma -= *this;
- *this -= that;
- *this |= bma;
- return *this;
- }
- #if(CHAR_BIT == 8)
- ///////////////////////////////////////////////////////////////////////////////
- //
- // basic_chset: specializations for 8 bit chars using std::bitset
- //
- ///////////////////////////////////////////////////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char>::basic_chset_8bit()
- {
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char>::basic_chset_8bit(basic_chset_8bit<Char> const &arg)
- : bset_(arg.bset_)
- {
- }
- /////////////////////////////////
- template<typename Char>
- inline bool basic_chset_8bit<Char>::empty() const
- {
- return !this->bset_.any();
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline bool basic_chset_8bit<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
- {
- return this->bset_.test((unsigned char)v);
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline bool basic_chset_8bit<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
- {
- return this->bset_.test((unsigned char)tr.translate_nocase(v));
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::set(Char from, Char to)
- {
- for(int i = from; i <= to; ++i)
- {
- this->bset_.set((unsigned char)i);
- }
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset_8bit<Char>::set(Char from, Char to, Traits const &tr)
- {
- for(int i = from; i <= to; ++i)
- {
- this->bset_.set((unsigned char)tr.translate_nocase((Char)i));
- }
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::set(Char c)
- {
- this->bset_.set((unsigned char)c);
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset_8bit<Char>::set(Char c, Traits const &tr)
- {
- this->bset_.set((unsigned char)tr.translate_nocase(c));
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::clear(Char from, Char to)
- {
- for(int i = from; i <= to; ++i)
- {
- this->bset_.reset((unsigned char)i);
- }
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset_8bit<Char>::clear(Char from, Char to, Traits const &tr)
- {
- for(int i = from; i <= to; ++i)
- {
- this->bset_.reset((unsigned char)tr.translate_nocase((Char)i));
- }
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::clear(Char c)
- {
- this->bset_.reset((unsigned char)c);
- }
- /////////////////////////////////
- template<typename Char>
- template<typename Traits>
- inline void basic_chset_8bit<Char>::clear(Char c, Traits const &tr)
- {
- this->bset_.reset((unsigned char)tr.tranlsate_nocase(c));
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::clear()
- {
- this->bset_.reset();
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::inverse()
- {
- this->bset_.flip();
- }
- /////////////////////////////////
- template<typename Char>
- inline void basic_chset_8bit<Char>::swap(basic_chset_8bit<Char> &that)
- {
- std::swap(this->bset_, that.bset_);
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char> &
- basic_chset_8bit<Char>::operator |=(basic_chset_8bit<Char> const &that)
- {
- this->bset_ |= that.bset_;
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char> &
- basic_chset_8bit<Char>::operator &=(basic_chset_8bit<Char> const &that)
- {
- this->bset_ &= that.bset_;
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char> &
- basic_chset_8bit<Char>::operator -=(basic_chset_8bit<Char> const &that)
- {
- this->bset_ &= ~that.bset_;
- return *this;
- }
- /////////////////////////////////
- template<typename Char>
- inline basic_chset_8bit<Char> &
- basic_chset_8bit<Char>::operator ^=(basic_chset_8bit<Char> const &that)
- {
- this->bset_ ^= that.bset_;
- return *this;
- }
- template<typename Char>
- inline std::bitset<256> const &
- basic_chset_8bit<Char>::base() const
- {
- return this->bset_;
- }
- #endif // if(CHAR_BIT == 8)
- ///////////////////////////////////////////////////////////////////////////////
- // helpers
- template<typename Char, typename Traits>
- inline void set_char(basic_chset<Char> &chset, Char ch, Traits const &tr, bool icase)
- {
- icase ? chset.set(ch, tr) : chset.set(ch);
- }
- template<typename Char, typename Traits>
- inline void set_range(basic_chset<Char> &chset, Char from, Char to, Traits const &tr, bool icase)
- {
- icase ? chset.set(from, to, tr) : chset.set(from, to);
- }
- template<typename Char, typename Traits>
- inline void set_class(basic_chset<Char> &chset, typename Traits::char_class_type char_class, bool no, Traits const &tr)
- {
- BOOST_MPL_ASSERT_RELATION(1, ==, sizeof(Char));
- for(std::size_t i = 0; i <= UCHAR_MAX; ++i)
- {
- typedef typename std::char_traits<Char>::int_type int_type;
- Char ch = std::char_traits<Char>::to_char_type(static_cast<int_type>(i));
- if(no != tr.isctype(ch, char_class))
- {
- chset.set(ch);
- }
- }
- }
- }}} // namespace boost::xpressive::detail
- #endif
|