blob: e0f2f0c029799ddfeaa11ba1068d9ed01bc2aa39 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// 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