| /////////////////////////////////////////////////////////////////////////////// |
| // set.hpp |
| // |
| // Copyright 2008 Eric Niebler. Distributed under 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_DETAIL_SET_HPP_EAN_10_04_2005 |
| #define BOOST_XPRESSIVE_DETAIL_SET_HPP_EAN_10_04_2005 |
| |
| // MS compatible compilers support #pragma once |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
| # pragma once |
| # pragma warning(push) |
| # pragma warning(disable : 4127) // conditional expression constant |
| # pragma warning(disable : 4100) // unreferenced formal parameter |
| # pragma warning(disable : 4351) // vc8 new behavior: elements of array 'foo' will be default initialized |
| #endif |
| |
| #include <algorithm> |
| #include <boost/mpl/assert.hpp> |
| #include <boost/type_traits/same_traits.hpp> |
| #include <boost/xpressive/detail/detail_fwd.hpp> |
| #include <boost/xpressive/detail/core/quant_style.hpp> |
| #include <boost/xpressive/detail/core/state.hpp> |
| |
| namespace boost { namespace xpressive { namespace detail |
| { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // set_matcher |
| // |
| template<typename Traits, typename Size> |
| struct set_matcher |
| : quant_style_fixed_width<1> |
| { |
| typedef typename Traits::char_type char_type; |
| char_type set_[ Size::value ]; |
| bool not_; |
| bool icase_; |
| |
| set_matcher() |
| : set_() |
| , not_(false) |
| , icase_(false) |
| { |
| } |
| |
| void inverse() |
| { |
| this->not_ = !this->not_; |
| } |
| |
| void nocase(Traits const &tr) |
| { |
| this->icase_ = true; |
| |
| for(int i = 0; i < Size::value; ++i) |
| { |
| this->set_[i] = tr.translate_nocase(this->set_[i]); |
| } |
| } |
| |
| bool in_set(Traits const &tr, char_type ch) const |
| { |
| char_type const *begin = &this->set_[0], *end = begin + Size::value; |
| ch = this->icase_ ? tr.translate_nocase(ch) : tr.translate(ch); |
| return end != std::find(begin, end, ch); |
| } |
| |
| template<typename BidiIter, typename Next> |
| bool match(match_state<BidiIter> &state, Next const &next) const |
| { |
| if(state.eos() || this->not_ == this->in_set(traits_cast<Traits>(state), *state.cur_)) |
| { |
| return false; |
| } |
| |
| if(++state.cur_, next.match(state)) |
| { |
| return true; |
| } |
| |
| return --state.cur_, false; |
| } |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // set_initializer |
| struct set_initializer |
| { |
| }; |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
| # pragma warning(pop) |
| #endif |
| |
| }}} // namespace boost::xpressive::detail |
| |
| #endif |