124 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//  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>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/make_unsigned.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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( static_cast<typename boost::make_unsigned <CharT>::type> ( 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( static_cast<typename boost::make_unsigned <CharT>::type> ( 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
							 |