traits_utils.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 146 行

HPP
146
字号
///////////////////////////////////////////////////////////////////////////////// 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 &traits, typename disable_if<is_same<ToChar, FromChar> >::type * = 0)    {        BOOST_MPL_ASSERT((is_same<FromChar, char>));        return traits.widen(from);    }    ///////////////////////////////////////////////////////////////////////////////    // widen_fun    //    template<typename Traits>    struct widen_fun    {        typedef typename Traits::char_type result_type;        explicit widen_fun(Traits const &traits)          : traits_(traits)        {}        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 &traits) const        {            widen_fun<Traits> widen(traits);            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 &traits)    {        return string_cast_<To, From>()(from, traits);    }    ///////////////////////////////////////////////////////////////////////////////    // translate    //    template<typename Char, typename Traits>    inline Char translate(Char ch, Traits const &traits, mpl::false_) // case-sensitive    {        return traits.translate(ch);    }    template<typename Char, typename Traits>    inline Char translate(Char ch, Traits const &traits, mpl::true_) // case-insensitive    {        return traits.translate_nocase(ch);    }}}} // namespace boost::xpressive::detail#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma warning(pop)#endif#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?