1// Boost string_algo library string_funct.hpp header file ---------------------------//
2
3// Copyright Pavol Droba 2002-2003.
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8
9// See http://www.boost.org/ for updates, documentation, and revision history.
10
11#ifndef BOOST_STRING_CASE_CONV_DETAIL_HPP
12#define BOOST_STRING_CASE_CONV_DETAIL_HPP
13
14#include <boost/algorithm/string/config.hpp>
15#include <locale>
16#include <functional>
17
18#include <boost/type_traits/make_unsigned.hpp>
19
20namespace boost {
21 namespace algorithm {
22 namespace detail {
23
24// case conversion functors -----------------------------------------------//
25
26#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
27#pragma warning(push)
28#pragma warning(disable:4512) //assignment operator could not be generated
29#endif
30
31 // a tolower functor
32 template<typename CharT>
33 struct to_lowerF
34 {
35 typedef CharT argument_type;
36 typedef CharT result_type;
37 // Constructor
38 to_lowerF( const std::locale& Loc ) : m_Loc( &Loc ) {}
39
40 // Operation
41 CharT operator ()( CharT Ch ) const
42 {
43 #if defined(BOOST_BORLANDC) && (BOOST_BORLANDC >= 0x560) && (BOOST_BORLANDC <= 0x564) && !defined(_USE_OLD_RW_STL)
44 return std::tolower( static_cast<typename boost::make_unsigned <CharT>::type> ( Ch ));
45 #else
46 return std::tolower<CharT>( Ch, *m_Loc );
47 #endif
48 }
49 private:
50 const std::locale* m_Loc;
51 };
52
53 // a toupper functor
54 template<typename CharT>
55 struct to_upperF
56 {
57 typedef CharT argument_type;
58 typedef CharT result_type;
59 // Constructor
60 to_upperF( const std::locale& Loc ) : m_Loc( &Loc ) {}
61
62 // Operation
63 CharT operator ()( CharT Ch ) const
64 {
65 #if defined(BOOST_BORLANDC) && (BOOST_BORLANDC >= 0x560) && (BOOST_BORLANDC <= 0x564) && !defined(_USE_OLD_RW_STL)
66 return std::toupper( static_cast<typename boost::make_unsigned <CharT>::type> ( Ch ));
67 #else
68 return std::toupper<CharT>( Ch, *m_Loc );
69 #endif
70 }
71 private:
72 const std::locale* m_Loc;
73 };
74
75#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
76#pragma warning(pop)
77#endif
78
79// algorithm implementation -------------------------------------------------------------------------
80
81 // Transform a range
82 template<typename OutputIteratorT, typename RangeT, typename FunctorT>
83 OutputIteratorT transform_range_copy(
84 OutputIteratorT Output,
85 const RangeT& Input,
86 FunctorT Functor)
87 {
88 return std::transform(
89 ::boost::begin(Input),
90 ::boost::end(Input),
91 Output,
92 Functor);
93 }
94
95 // Transform a range (in-place)
96 template<typename RangeT, typename FunctorT>
97 void transform_range(
98 const RangeT& Input,
99 FunctorT Functor)
100 {
101 std::transform(
102 ::boost::begin(Input),
103 ::boost::end(Input),
104 ::boost::begin(Input),
105 Functor);
106 }
107
108 template<typename SequenceT, typename RangeT, typename FunctorT>
109 inline SequenceT transform_range_copy(
110 const RangeT& Input,
111 FunctorT Functor)
112 {
113 return SequenceT(
114 ::boost::make_transform_iterator(
115 ::boost::begin(Input),
116 Functor),
117 ::boost::make_transform_iterator(
118 ::boost::end(Input),
119 Functor));
120 }
121
122 } // namespace detail
123 } // namespace algorithm
124} // namespace boost
125
126
127#endif // BOOST_STRING_CASE_CONV_DETAIL_HPP
128

source code of include/boost/algorithm/string/detail/case_conv.hpp