Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // traits_utils.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_UTILITY_TRAITS_UTILS_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_DETAIL_UTILITY_TRAITS_UTILS_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: # pragma warning(push) Chris@16: # pragma warning(disable : 4100) // unreferenced formal parameter Chris@16: #endif Chris@16: 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: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // char_cast Chris@16: // Chris@16: template Chris@16: inline ToChar Chris@16: char_cast(FromChar from, Traits const &, typename enable_if >::type * = 0) Chris@16: { Chris@16: return from; Chris@16: } Chris@16: Chris@16: template Chris@16: inline ToChar Chris@16: char_cast(FromChar from, Traits const &tr, typename disable_if >::type * = 0) Chris@16: { Chris@16: BOOST_MPL_ASSERT((is_same)); Chris@16: return tr.widen(from); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // widen_fun Chris@16: // Chris@16: template Chris@16: struct widen_fun Chris@16: { Chris@16: typedef typename Traits::char_type result_type; Chris@16: explicit widen_fun(Traits const &tr) Chris@16: : traits_(tr) Chris@16: {} Chris@16: Chris@16: result_type operator()(char ch) const Chris@16: { Chris@16: return this->traits_.widen(ch); Chris@16: } Chris@16: Chris@16: Traits const &traits_; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // string_cast_ Chris@16: // Chris@16: template< Chris@16: typename To Chris@16: , typename From Chris@16: , typename ToChar = typename detail::range_data::type Chris@16: , typename FromChar = typename detail::range_data::type Chris@16: > Chris@16: struct string_cast_ Chris@16: { Chris@16: BOOST_MPL_ASSERT((is_same)); Chris@16: typedef To const result_type; Chris@16: template Chris@16: result_type operator()(From const &from, Traits const &tr) const Chris@16: { Chris@16: widen_fun widen(tr); Chris@16: To to( Chris@16: boost::make_transform_iterator(detail::data_begin(from), widen) Chris@16: , boost::make_transform_iterator(detail::data_end(from), widen) Chris@16: ); Chris@16: return to; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct string_cast_ Chris@16: { Chris@16: typedef To const result_type; Chris@16: template Chris@16: result_type operator()(From const &from, Traits const &) const Chris@16: { Chris@16: To to(detail::data_begin(from), detail::data_end(from)); Chris@16: return to; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct string_cast_ Chris@16: { Chris@16: typedef From const &result_type; Chris@16: template Chris@16: result_type operator()(From const &from, Traits const &) const Chris@16: { Chris@16: return from; Chris@16: } Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // string_cast Chris@16: // Chris@16: template Chris@16: typename string_cast_::result_type Chris@16: string_cast(From const &from, Traits const &tr) Chris@16: { Chris@16: return string_cast_()(from, tr); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // translate Chris@16: // Chris@16: template Chris@16: inline Char translate(Char ch, Traits const &tr, mpl::false_) // case-sensitive Chris@16: { Chris@16: return tr.translate(ch); Chris@16: } Chris@16: Chris@16: template Chris@16: inline Char translate(Char ch, Traits const &tr, mpl::true_) // case-insensitive Chris@16: { Chris@16: return tr.translate_nocase(ch); Chris@16: } Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif