///////////////////////////////////////////////////////////////////////////////
// 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
