/////////////////////////////////////////////////////////////////////////////// // 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 #include #include #include #include #define UNCV(x) typename remove_const::type #define UNREF(x) typename remove_reference::type #define UNCVREF(x) UNCV(UNREF(x)) namespace boost { namespace xpressive { namespace grammar_detail { template struct inverter { typedef T type; static T call(T t) { t.inverse(); return t; } }; template struct inverter > { typedef detail::literal_matcher::type> type; static type call(detail::literal_matcher t) { return type(t.ch_); } }; template struct inverter > { // ~_ln matches any one character that is not in the "newline" character class typedef detail::posix_charset_matcher type; static type call(detail::logical_newline_matcher t) { return type(t.newline(), true); } }; template struct inverter, Traits> > { typedef detail::assert_word_matcher, Traits> type; static type call(detail::assert_word_matcher, Traits> t) { return type(t.word()); } }; struct as_inverse : proto::callable { template struct result; template struct result : inverter {}; template typename inverter::type operator ()(Matcher const &matcher) const { return inverter::call(matcher); } }; }}} #undef UNCV #undef UNREF #undef UNCVREF #endif