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