Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // transmogrify.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_STATIC_TRANSMOGRIFY_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_DETAIL_STATIC_TRANSMOGRIFY_HPP_EAN_10_04_2005 Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include // for std::strlen Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: template Chris@16: struct is_char_literal Chris@16: : mpl::or_, is_same > Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // transmogrify Chris@16: // Chris@16: template Chris@16: struct default_transmogrify Chris@16: { Chris@16: typedef typename Traits::char_type char_type; Chris@16: typedef typename Traits::string_type string_type; Chris@16: Chris@16: typedef typename mpl::if_c Chris@16: < Chris@16: is_char_literal::value Chris@16: , literal_matcher Chris@16: , string_matcher Chris@16: >::type type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, Visitor &visitor) Chris@16: { Chris@16: return default_transmogrify::call_(m, visitor, is_char_literal()); Chris@16: } Chris@16: Chris@16: template Chris@16: static type call_(Matcher2 const &m, Visitor &visitor, mpl::true_) Chris@16: { Chris@16: char_type ch = char_cast(m, visitor.traits()); Chris@16: return type(ch, visitor.traits()); Chris@16: } Chris@16: Chris@16: template Chris@16: static type call_(Matcher2 const &m, Visitor &visitor, mpl::false_) Chris@16: { Chris@16: string_type str = string_cast(m, visitor.traits()); Chris@16: return type(str, visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct default_transmogrify Chris@16: { Chris@16: typedef Matcher type; Chris@16: Chris@16: template Chris@16: static Matcher2 const &call(Matcher2 const &m, dont_care) Chris@16: { Chris@16: return m; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: : default_transmogrify Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef assert_bol_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2, Visitor &visitor) Chris@16: { Chris@16: return type(visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef assert_eol_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2, Visitor &visitor) Chris@16: { Chris@16: return type(visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef logical_newline_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2, Visitor &visitor) Chris@16: { Chris@16: return type(visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify > Chris@16: { Chris@16: // By design, we don't widen character ranges. Chris@16: typedef typename iterator_value::type char_type; Chris@16: BOOST_MPL_ASSERT((is_same)); Chris@16: typedef range_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, Visitor &visitor) Chris@16: { Chris@16: return type(m.ch_min_, m.ch_max_, m.not_, visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef mark_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, Visitor &visitor) Chris@16: { Chris@16: return type(m.mark_number_, visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef posix_charset_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, Visitor &visitor) Chris@16: { Chris@16: char const *name_end = m.name_ + std::strlen(m.name_); Chris@16: return type(visitor.traits().lookup_classname(m.name_, name_end, ICase::value), m.not_); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify > Chris@16: { Chris@16: typedef set_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 m, Visitor &visitor) Chris@16: { Chris@16: m.nocase(visitor.traits()); Chris@16: return m; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify > Chris@16: { Chris@16: typedef assert_word_matcher type; Chris@16: Chris@16: template Chris@16: static type call(dont_care, Visitor &visitor) Chris@16: { Chris@16: return type(visitor.traits()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify > > Chris@16: { Chris@16: typedef regex_byref_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, dont_care) Chris@16: { Chris@16: return type(detail::core_access::get_regex_impl(m.get())); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify const> > Chris@16: { Chris@16: typedef regex_byref_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, dont_care) Chris@16: { Chris@16: return type(detail::core_access::get_regex_impl(m.get())); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify > > Chris@16: { Chris@16: typedef regex_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2 const &m, dont_care) Chris@16: { Chris@16: return type(m.get()); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transmogrify Chris@16: { Chris@16: typedef regex_byref_matcher type; Chris@16: Chris@16: template Chris@16: static type call(Matcher2, Visitor &visitor) Chris@16: { Chris@16: return type(visitor.self()); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif