diff --git a/include/boost/algorithm/string/case_conv.hpp b/include/boost/algorithm/string/case_conv.hpp index 46ddbc3..fce60b0 100644 --- a/include/boost/algorithm/string/case_conv.hpp +++ b/include/boost/algorithm/string/case_conv.hpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -56,11 +57,10 @@ namespace boost { const RangeT& Input, const std::locale& Loc=std::locale()) { - return std::transform( - begin(Input), - end(Input), - Output, - ::boost::algorithm::detail::to_lowerF< + return ::boost::algorithm::detail::transform_range_copy( + Output, + as_literal(Input), + ::boost::algorithm::detail::to_lowerF< typename range_value::type >(Loc)); } @@ -73,15 +73,10 @@ namespace boost { const SequenceT& Input, const std::locale& Loc=std::locale()) { - return SequenceT( - make_transform_iterator( - begin(Input), - ::boost::algorithm::detail::to_lowerF< - typename range_value::type >(Loc)), - make_transform_iterator( - end(Input), - ::boost::algorithm::detail::to_lowerF< - typename range_value::type >(Loc))); + return ::boost::algorithm::detail::transform_range_copy( + as_literal(Input), + ::boost::algorithm::detail::to_lowerF< + typename range_value::type >(Loc)); } //! Convert to lower case @@ -97,10 +92,8 @@ namespace boost { WritableRangeT& Input, const std::locale& Loc=std::locale()) { - std::transform( - begin(Input), - end(Input), - begin(Input), + ::boost::algorithm::detail::transform_range( + as_literal(Input), ::boost::algorithm::detail::to_lowerF< typename range_value::type >(Loc)); } @@ -129,11 +122,10 @@ namespace boost { const RangeT& Input, const std::locale& Loc=std::locale()) { - return std::transform( - begin(Input), - end(Input), - Output, - ::boost::algorithm::detail::to_upperF< + return ::boost::algorithm::detail::transform_range_copy( + Output, + as_literal(Input), + ::boost::algorithm::detail::to_upperF< typename range_value::type >(Loc)); } @@ -146,16 +138,10 @@ namespace boost { const SequenceT& Input, const std::locale& Loc=std::locale()) { - return SequenceT( - make_transform_iterator( - begin(Input), - ::boost::algorithm::detail::to_upperF< - typename range_value::type >(Loc)), - make_transform_iterator( - end(Input), - ::boost::algorithm::detail::to_upperF< - typename range_value::type >(Loc))); - + return ::boost::algorithm::detail::transform_range_copy( + as_literal(Input), + ::boost::algorithm::detail::to_upperF< + typename range_value::type >(Loc)); } //! Convert to upper case @@ -171,10 +157,8 @@ namespace boost { WritableRangeT& Input, const std::locale& Loc=std::locale()) { - std::transform( - begin(Input), - end(Input), - begin(Input), + ::boost::algorithm::detail::transform_range( + as_literal(Input), ::boost::algorithm::detail::to_upperF< typename range_value::type >(Loc)); } diff --git a/include/boost/algorithm/string/detail/case_conv.hpp b/include/boost/algorithm/string/detail/case_conv.hpp index d4161f0..73e6bd8 100644 --- a/include/boost/algorithm/string/detail/case_conv.hpp +++ b/include/boost/algorithm/string/detail/case_conv.hpp @@ -61,6 +61,49 @@ namespace boost { const std::locale& m_Loc; }; +// algorithm implementation ------------------------------------------------------------------------- + + // Transform a range + template + OutputIteratorT transform_range_copy( + OutputIteratorT Output, + const RangeT& Input, + FunctorT Functor) + { + return std::transform( + begin(Input), + end(Input), + Output, + Functor); + } + + // Transform a range (in-place) + template + void transform_range( + const RangeT& Input, + FunctorT Functor) + { + std::transform( + begin(Input), + end(Input), + begin(Input), + Functor); + } + + template + inline SequenceT transform_range_copy( + const RangeT& Input, + FunctorT Functor) + { + return SequenceT( + make_transform_iterator( + begin(Input), + Functor), + make_transform_iterator( + end(Input), + Functor)); + } + } // namespace detail } // namespace algorithm } // namespace boost