annotate DEPENDENCIES/generic/include/boost/xpressive/detail/utility/traits_utils.hpp @ 133:4acb5d8d80b6 tip

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