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 : public std::unary_function<CharT, CharT>
34 {
35 // Constructor
36 to_lowerF( const std::locale& Loc ) : m_Loc( &Loc ) {}
37
38 // Operation
39 CharT operator ()( CharT Ch ) const
40 {
41 #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
42 return std::tolower( static_cast<typename boost::make_unsigned <CharT>::type> ( Ch ));
43 #else
44 return std::tolower<CharT>( Ch, *m_Loc );
45 #endif
46 }
47 private:
48 const std::locale* m_Loc;
49 };
50
51 // a toupper functor
52 template<typename CharT>
53 struct to_upperF : public std::unary_function<CharT, CharT>
54 {
55 // Constructor
56 to_upperF( const std::locale& Loc ) : m_Loc( &Loc ) {}
57
58 // Operation
59 CharT operator ()( CharT Ch ) const
60 {
61 #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
62 return std::toupper( static_cast<typename boost::make_unsigned <CharT>::type> ( Ch ));
63 #else
64 return std::toupper<CharT>( Ch, *m_Loc );
65 #endif
66 }
67 private:
68 const std::locale* m_Loc;
69 };
70
71#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
72#pragma warning(pop)
73#endif
74
75// algorithm implementation -------------------------------------------------------------------------
76
77 // Transform a range
78 template<typename OutputIteratorT, typename RangeT, typename FunctorT>
79 OutputIteratorT transform_range_copy(
80 OutputIteratorT Output,
81 const RangeT& Input,
82 FunctorT Functor)
83 {
84 return std::transform(
85 ::boost::begin(Input),
86 ::boost::end(Input),
87 Output,
88 Functor);
89 }
90
91 // Transform a range (in-place)
92 template<typename RangeT, typename FunctorT>
93 void transform_range(
94 const RangeT& Input,
95 FunctorT Functor)
96 {
97 std::transform(
98 ::boost::begin(Input),
99 ::boost::end(Input),
100 ::boost::begin(Input),
101 Functor);
102 }
103
104 template<typename SequenceT, typename RangeT, typename FunctorT>
105 inline SequenceT transform_range_copy(
106 const RangeT& Input,
107 FunctorT Functor)
108 {
109 return SequenceT(
110 ::boost::make_transform_iterator(
111 ::boost::begin(Input),
112 Functor),
113 ::boost::make_transform_iterator(
114 ::boost::end(Input),
115 Functor));
116 }
117
118 } // namespace detail
119 } // namespace algorithm
120} // namespace boost
121
122
123#endif // BOOST_STRING_CASE_CONV_DETAIL_HPP
124