///////////////////////////////////////////////////////////////////////////////
// as_inverse.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_STATIC_TRANSFORMS_AS_INVERSE_HPP_EAN_04_05_2007
#define BOOST_XPRESSIVE_DETAIL_STATIC_TRANSFORMS_AS_INVERSE_HPP_EAN_04_05_2007

// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/not.hpp>
#include <boost/xpressive/detail/detail_fwd.hpp>
#include <boost/xpressive/detail/static/static.hpp>
#include <boost/proto/core.hpp>

#define UNCV(x) typename remove_const<x>::type
#define UNREF(x) typename remove_reference<x>::type
#define UNCVREF(x) UNCV(UNREF(x))

namespace boost { namespace xpressive { namespace grammar_detail
{

    template<typename T>
    struct inverter
    {
        typedef T type;
        static T call(T t)
        {
            t.inverse();
            return t;
        }
    };

    template<typename Traits, typename ICase, typename Not>
    struct inverter<detail::literal_matcher<Traits, ICase, Not> >
    {
        typedef detail::literal_matcher<Traits, ICase, typename mpl::not_<Not>::type> type;
        static type call(detail::literal_matcher<Traits, ICase, Not> t)
        {
            return type(t.ch_);
        }
    };

    template<typename Traits>
    struct inverter<detail::logical_newline_matcher<Traits> >
    {
        // ~_ln matches any one character that is not in the "newline" character class
        typedef detail::posix_charset_matcher<Traits> type;
        static type call(detail::logical_newline_matcher<Traits> t)
        {
            return type(t.newline(), true);
        }
    };

    template<typename Traits>
    struct inverter<detail::assert_word_matcher<detail::word_boundary<mpl::true_>, Traits> >
    {
        typedef detail::assert_word_matcher<detail::word_boundary<mpl::false_>, Traits> type;
        static type call(detail::assert_word_matcher<detail::word_boundary<mpl::true_>, Traits> t)
        {
            return type(t.word());
        }
    };

    struct as_inverse : proto::callable
    {
        template<typename Sig>
        struct result;

        template<typename This, typename Matcher>
        struct result<This(Matcher)>
          : inverter<UNCVREF(Matcher)>
        {};

        template<typename Matcher>
        typename inverter<Matcher>::type operator ()(Matcher const &matcher) const
        {
            return inverter<Matcher>::call(matcher);
        }
    };

}}}

#undef UNCV
#undef UNREF
#undef UNCVREF

#endif
