~ai.tron/armagetronad/0.4-winlibs-updated

« back to all changes in this revision

Viewing changes to boost/includes/boost/xpressive/detail/utility/traits_utils.hpp

  • Committer: Manuel Moos
  • Date: 2013-08-10 16:21:05 UTC
  • mfrom: (118.1.64 winlibs-refactor)
  • Revision ID: z-man@users.sf.net-20130810162105-e6v55tas5si5gb3e
Updating boost to 1.53

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
///////////////////////////////////////////////////////////////////////////////
 
2
// traits_utils.hpp
 
3
//
 
4
//  Copyright 2008 Eric Niebler. Distributed under the Boost
 
5
//  Software License, Version 1.0. (See accompanying file
 
6
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
7
 
 
8
#ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_TRAITS_UTILS_HPP_EAN_10_04_2005
 
9
#define BOOST_XPRESSIVE_DETAIL_UTILITY_TRAITS_UTILS_HPP_EAN_10_04_2005
 
10
 
 
11
// MS compatible compilers support #pragma once
 
12
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 
13
# pragma once
 
14
# pragma warning(push)
 
15
# pragma warning(disable : 4100) // unreferenced formal parameter
 
16
#endif
 
17
 
 
18
#include <string>
 
19
#include <boost/mpl/bool.hpp>
 
20
#include <boost/mpl/assert.hpp>
 
21
#include <boost/utility/enable_if.hpp>
 
22
#include <boost/type_traits/is_same.hpp>
 
23
#include <boost/iterator/transform_iterator.hpp>
 
24
#include <boost/xpressive/detail/utility/algorithm.hpp>
 
25
 
 
26
namespace boost { namespace xpressive { namespace detail
 
27
{
 
28
 
 
29
    ///////////////////////////////////////////////////////////////////////////////
 
30
    // char_cast
 
31
    //
 
32
    template<typename ToChar, typename FromChar, typename Traits>
 
33
    inline ToChar
 
34
    char_cast(FromChar from, Traits const &, typename enable_if<is_same<ToChar, FromChar> >::type * = 0)
 
35
    {
 
36
        return from;
 
37
    }
 
38
 
 
39
    template<typename ToChar, typename FromChar, typename Traits>
 
40
    inline ToChar
 
41
    char_cast(FromChar from, Traits const &tr, typename disable_if<is_same<ToChar, FromChar> >::type * = 0)
 
42
    {
 
43
        BOOST_MPL_ASSERT((is_same<FromChar, char>));
 
44
        return tr.widen(from);
 
45
    }
 
46
 
 
47
    ///////////////////////////////////////////////////////////////////////////////
 
48
    // widen_fun
 
49
    //
 
50
    template<typename Traits>
 
51
    struct widen_fun
 
52
    {
 
53
        typedef typename Traits::char_type result_type;
 
54
        explicit widen_fun(Traits const &tr)
 
55
          : traits_(tr)
 
56
        {}
 
57
 
 
58
        result_type operator()(char ch) const
 
59
        {
 
60
            return this->traits_.widen(ch);
 
61
        }
 
62
 
 
63
        Traits const &traits_;
 
64
    };
 
65
 
 
66
    ///////////////////////////////////////////////////////////////////////////////
 
67
    // string_cast_
 
68
    //
 
69
    template<
 
70
        typename To
 
71
      , typename From
 
72
      , typename ToChar = typename detail::range_data<To>::type
 
73
      , typename FromChar = typename detail::range_data<From>::type
 
74
    >
 
75
    struct string_cast_
 
76
    {
 
77
        BOOST_MPL_ASSERT((is_same<FromChar, char>));
 
78
        typedef To const result_type;
 
79
        template<typename Traits>
 
80
        result_type operator()(From const &from, Traits const &tr) const
 
81
        {
 
82
            widen_fun<Traits> widen(tr);
 
83
            To to(
 
84
                boost::make_transform_iterator(detail::data_begin(from), widen)
 
85
              , boost::make_transform_iterator(detail::data_end(from), widen)
 
86
            );
 
87
            return to;
 
88
        }
 
89
    };
 
90
 
 
91
    template<typename To, typename From, typename Char>
 
92
    struct string_cast_<To, From, Char, Char>
 
93
    {
 
94
        typedef To const result_type;
 
95
        template<typename Traits>
 
96
        result_type operator()(From const &from, Traits const &) const
 
97
        {
 
98
            To to(detail::data_begin(from), detail::data_end(from));
 
99
            return to;
 
100
        }
 
101
    };
 
102
 
 
103
    template<typename From, typename Char>
 
104
    struct string_cast_<From, From, Char, Char>
 
105
    {
 
106
        typedef From const &result_type;
 
107
        template<typename Traits>
 
108
        result_type operator()(From const &from, Traits const &) const
 
109
        {
 
110
            return from;
 
111
        }
 
112
    };
 
113
 
 
114
    ///////////////////////////////////////////////////////////////////////////////
 
115
    // string_cast
 
116
    //
 
117
    template<typename To, typename From, typename Traits>
 
118
    typename string_cast_<To, From>::result_type
 
119
    string_cast(From const &from, Traits const &tr)
 
120
    {
 
121
        return string_cast_<To, From>()(from, tr);
 
122
    }
 
123
 
 
124
    ///////////////////////////////////////////////////////////////////////////////
 
125
    // translate
 
126
    //
 
127
    template<typename Char, typename Traits>
 
128
    inline Char translate(Char ch, Traits const &tr, mpl::false_) // case-sensitive
 
129
    {
 
130
        return tr.translate(ch);
 
131
    }
 
132
 
 
133
    template<typename Char, typename Traits>
 
134
    inline Char translate(Char ch, Traits const &tr, mpl::true_) // case-insensitive
 
135
    {
 
136
        return tr.translate_nocase(ch);
 
137
    }
 
138
 
 
139
}}} // namespace boost::xpressive::detail
 
140
 
 
141
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 
142
# pragma warning(pop)
 
143
#endif
 
144
 
 
145
#endif