// Boost string_algo library string_funct.hpp header file ---------------------------// | |
// Copyright Pavol Droba 2002-2003. | |
// | |
// 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) | |
// See http://www.boost.org/ for updates, documentation, and revision history. | |
#ifndef BOOST_STRING_CASE_CONV_DETAIL_HPP | |
#define BOOST_STRING_CASE_CONV_DETAIL_HPP | |
#include <boost/algorithm/string/config.hpp> | |
#include <locale> | |
#include <functional> | |
namespace boost { | |
namespace algorithm { | |
namespace detail { | |
// case conversion functors -----------------------------------------------// | |
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) | |
#pragma warning(push) | |
#pragma warning(disable:4512) //assignment operator could not be generated | |
#endif | |
// a tolower functor | |
template<typename CharT> | |
struct to_lowerF : public std::unary_function<CharT, CharT> | |
{ | |
// Constructor | |
to_lowerF( const std::locale& Loc ) : m_Loc( &Loc ) {} | |
// Operation | |
CharT operator ()( CharT Ch ) const | |
{ | |
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) | |
return std::tolower( Ch); | |
#else | |
return std::tolower<CharT>( Ch, *m_Loc ); | |
#endif | |
} | |
private: | |
const std::locale* m_Loc; | |
}; | |
// a toupper functor | |
template<typename CharT> | |
struct to_upperF : public std::unary_function<CharT, CharT> | |
{ | |
// Constructor | |
to_upperF( const std::locale& Loc ) : m_Loc( &Loc ) {} | |
// Operation | |
CharT operator ()( CharT Ch ) const | |
{ | |
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) | |
return std::toupper( Ch); | |
#else | |
return std::toupper<CharT>( Ch, *m_Loc ); | |
#endif | |
} | |
private: | |
const std::locale* m_Loc; | |
}; | |
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) | |
#pragma warning(pop) | |
#endif | |
// algorithm implementation ------------------------------------------------------------------------- | |
// Transform a range | |
template<typename OutputIteratorT, typename RangeT, typename FunctorT> | |
OutputIteratorT transform_range_copy( | |
OutputIteratorT Output, | |
const RangeT& Input, | |
FunctorT Functor) | |
{ | |
return std::transform( | |
::boost::begin(Input), | |
::boost::end(Input), | |
Output, | |
Functor); | |
} | |
// Transform a range (in-place) | |
template<typename RangeT, typename FunctorT> | |
void transform_range( | |
const RangeT& Input, | |
FunctorT Functor) | |
{ | |
std::transform( | |
::boost::begin(Input), | |
::boost::end(Input), | |
::boost::begin(Input), | |
Functor); | |
} | |
template<typename SequenceT, typename RangeT, typename FunctorT> | |
inline SequenceT transform_range_copy( | |
const RangeT& Input, | |
FunctorT Functor) | |
{ | |
return SequenceT( | |
::boost::make_transform_iterator( | |
::boost::begin(Input), | |
Functor), | |
::boost::make_transform_iterator( | |
::boost::end(Input), | |
Functor)); | |
} | |
} // namespace detail | |
} // namespace algorithm | |
} // namespace boost | |
#endif // BOOST_STRING_CASE_CONV_DETAIL_HPP |