From 05e51dc01f09b8542f3717772dad5b078d1a17e4 Mon Sep 17 00:00:00 2001 From: bolero-MURAKAMI Date: Fri, 28 Oct 2011 20:34:24 +0900 Subject: [PATCH] =?UTF-8?q?replace=5Fcopy.hpp=20replace=5Fcopy=5Fif.hpp=20?= =?UTF-8?q?transform.hpp=20=E5=AE=9F=E8=A3=85=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sprout/algorithm/fixed/replace_copy.hpp | 104 ++--------- sprout/algorithm/fixed/replace_copy_if.hpp | 104 ++--------- sprout/algorithm/fixed/transform.hpp | 199 ++++++++++++++++----- 3 files changed, 183 insertions(+), 224 deletions(-) diff --git a/sprout/algorithm/fixed/replace_copy.hpp b/sprout/algorithm/fixed/replace_copy.hpp index badf6ce3..6c6da3df 100644 --- a/sprout/algorithm/fixed/replace_copy.hpp +++ b/sprout/algorithm/fixed/replace_copy.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL @@ -21,9 +22,9 @@ namespace sprout { RandomAccessIterator first, RandomAccessIterator last, Result const& result, - sprout::index_tuple, T const& old_value, T const& new_value, + sprout::index_tuple, typename sprout::fixed_container_traits::difference_type offset, typename sprout::fixed_container_traits::size_type size, typename sprout::fixed_container_traits::size_type input_size @@ -52,47 +53,25 @@ namespace sprout { first, last, result, - typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), old_value, new_value, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), sprout::fixed_begin_offset(result), sprout::size(result), NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) ); } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size == sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_3( - Result const& result, - Args const&... args - ) - { - return sprout::remake_clone(result, sprout::size(result), args...); - } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size != sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_3( - Result const& result, - Args const&... args - ) - { - return replace_copy_impl_3(result, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))); - } template SPROUT_CONSTEXPR inline typename std::enable_if< sprout::fixed_container_traits::fixed_size == sizeof...(Args), typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_2( + >::type replace_copy_impl( InputIterator first, InputIterator last, Result const& result, T const& old_value, T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, Args const&... args ) { @@ -102,67 +81,21 @@ namespace sprout { SPROUT_CONSTEXPR inline typename std::enable_if< sprout::fixed_container_traits::fixed_size != sizeof...(Args), typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_2( + >::type replace_copy_impl( InputIterator first, InputIterator last, Result const& result, T const& old_value, T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, Args const&... args ) { - return first != last && sizeof...(Args) < static_cast(offset) - ? replace_copy_impl_2(sprout::next(first), last, result, old_value, new_value, offset, args..., *first == old_value ? new_value : *first) - : replace_copy_impl_3(result, args...) + return first != last && sizeof...(Args) < size + ? replace_copy_impl(sprout::next(first), last, result, old_value, new_value, size, args..., *first == old_value ? new_value : *first) + : sprout::detail::container_complate(result, args...) ; } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size == sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_1( - InputIterator first, - InputIterator last, - Result const& result, - T const& old_value, - T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, - Args const&... args - ) - { - return sprout::remake_clone(result, sprout::size(result), args...); - } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size != sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_impl_1( - InputIterator first, - InputIterator last, - Result const& result, - T const& old_value, - T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, - Args const&... args - ) - { - return sizeof...(Args) < static_cast(offset) - ? replace_copy_impl_1(first, last, result, old_value, new_value, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) - : replace_copy_impl_2(first, last, result, old_value, new_value, offset + sprout::size(result), args...) - ; - } - template - SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type replace_copy_impl( - InputIterator first, - InputIterator last, - Result const& result, - T const& old_value, - T const& new_value - ) - { - return replace_copy_impl_1(first, last, result, old_value, new_value, sprout::fixed_begin_offset(result)); - } template SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type replace_copy( InputIterator first, @@ -173,13 +106,7 @@ namespace sprout { void* ) { - return sprout::fixed::detail::replace_copy_impl( - first, - last, - result, - old_value, - new_value - ); + return sprout::fixed::detail::replace_copy_impl(first, last, result, old_value, new_value, sprout::size(result)); } } // namespace detail // @@ -195,14 +122,7 @@ namespace sprout { ) { typedef typename std::iterator_traits::iterator_category* category; - return sprout::fixed::detail::replace_copy( - first, - last, - result, - old_value, - new_value, - category() - ); + return sprout::fixed::detail::replace_copy(first, last, result, old_value, new_value, category()); } } // namespace fixed diff --git a/sprout/algorithm/fixed/replace_copy_if.hpp b/sprout/algorithm/fixed/replace_copy_if.hpp index 583fa08e..317021ef 100644 --- a/sprout/algorithm/fixed/replace_copy_if.hpp +++ b/sprout/algorithm/fixed/replace_copy_if.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL namespace sprout { @@ -20,9 +21,9 @@ namespace sprout { RandomAccessIterator first, RandomAccessIterator last, Result const& result, - sprout::index_tuple, Predicate pred, T const& new_value, + sprout::index_tuple, typename sprout::fixed_container_traits::difference_type offset, typename sprout::fixed_container_traits::size_type size, typename sprout::fixed_container_traits::size_type input_size @@ -51,47 +52,25 @@ namespace sprout { first, last, result, - typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), pred, new_value, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), sprout::fixed_begin_offset(result), sprout::size(result), NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) ); } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size == sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_3( - Result const& result, - Args const&... args - ) - { - return sprout::remake_clone(result, sprout::size(result), args...); - } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size != sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_3( - Result const& result, - Args const&... args - ) - { - return replace_copy_if_impl_3(result, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))); - } template SPROUT_CONSTEXPR inline typename std::enable_if< sprout::fixed_container_traits::fixed_size == sizeof...(Args), typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_2( + >::type replace_copy_if_impl( InputIterator first, InputIterator last, Result const& result, Predicate pred, T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, Args const&... args ) { @@ -101,67 +80,21 @@ namespace sprout { SPROUT_CONSTEXPR inline typename std::enable_if< sprout::fixed_container_traits::fixed_size != sizeof...(Args), typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_2( + >::type replace_copy_if_impl( InputIterator first, InputIterator last, Result const& result, Predicate pred, T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, + typename sprout::fixed_container_traits::size_type size, Args const&... args ) { - return first != last && sizeof...(Args) < static_cast(offset) - ? replace_copy_if_impl_2(sprout::next(first), last, result, pred, new_value, offset, args..., pred(*first) ? new_value : *first) - : replace_copy_if_impl_3(result, args...) + return first != last && sizeof...(Args) < size + ? replace_copy_if_impl(sprout::next(first), last, result, pred, new_value, size, args..., pred(*first) ? new_value : *first) + : sprout::detail::container_complate(result, args...) ; } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size == sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_1( - InputIterator first, - InputIterator last, - Result const& result, - Predicate pred, - T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, - Args const&... args - ) - { - return sprout::remake_clone(result, sprout::size(result), args...); - } - template - SPROUT_CONSTEXPR inline typename std::enable_if< - sprout::fixed_container_traits::fixed_size != sizeof...(Args), - typename sprout::fixed::result_of::algorithm::type - >::type replace_copy_if_impl_1( - InputIterator first, - InputIterator last, - Result const& result, - Predicate pred, - T const& new_value, - typename sprout::fixed_container_traits::difference_type offset, - Args const&... args - ) - { - return sizeof...(Args) < static_cast(offset) - ? replace_copy_if_impl_1(first, last, result, pred, new_value, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) - : replace_copy_if_impl_2(first, last, result, pred, new_value, offset + sprout::size(result), args...) - ; - } - template - SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type replace_copy_if_impl( - InputIterator first, - InputIterator last, - Result const& result, - Predicate pred, - T const& new_value - ) - { - return replace_copy_if_impl_1(first, last, result, pred, new_value, sprout::fixed_begin_offset(result)); - } template SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type replace_copy_if( InputIterator first, @@ -172,13 +105,7 @@ namespace sprout { void* ) { - return sprout::fixed::detail::replace_copy_if_impl( - first, - last, - result, - pred, - new_value - ); + return sprout::fixed::detail::replace_copy_if_impl(first, last, result, pred, new_value, sprout::size(result)); } } // namespace detail // @@ -194,14 +121,7 @@ namespace sprout { ) { typedef typename std::iterator_traits::iterator_category* category; - return sprout::fixed::detail::replace_copy_if( - first, - last, - result, - pred, - new_value, - category() - ); + return sprout::fixed::detail::replace_copy_if(first, last, result, pred, new_value, category()); } } // namespace fixed diff --git a/sprout/algorithm/fixed/transform.hpp b/sprout/algorithm/fixed/transform.hpp index 9d8e2b8b..813378a8 100644 --- a/sprout/algorithm/fixed/transform.hpp +++ b/sprout/algorithm/fixed/transform.hpp @@ -2,24 +2,27 @@ #define SPROUT_ALGORITHM_FIXED_TRANSFORM_HPP #include +#include +#include #include #include #include #include -#include +#include #include +#include #include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL namespace sprout { namespace fixed { namespace detail { - template - SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform_impl( - Iterator first, - Iterator last, + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform_impl_ra( + RandomAccessIterator first, + RandomAccessIterator last, Result const& result, - sprout::index_tuple, UnaryOperation op, + sprout::index_tuple, typename sprout::fixed_container_traits::difference_type offset, typename sprout::fixed_container_traits::size_type size, typename sprout::fixed_container_traits::size_type input_size @@ -34,39 +37,95 @@ namespace sprout { )... ); } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform( + RandomAccessIterator first, + RandomAccessIterator last, + Result const& result, + UnaryOperation op, + std::random_access_iterator_tag* + ) + { + return sprout::fixed::detail::transform_impl_ra( + first, + last, + result, + op, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) + ); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type transform_impl( + InputIterator first, + InputIterator last, + Result const& result, + UnaryOperation op, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return sprout::remake_clone(result, sprout::size(result), args...); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type transform_impl( + InputIterator first, + InputIterator last, + Result const& result, + UnaryOperation op, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return first != last && sizeof...(Args) < size + ? sprout::fixed::detail::transform_impl(sprout::next(first), last, result, op, size, args..., op(*first)) + : sprout::detail::container_complate(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform( + InputIterator first, + InputIterator last, + Result const& result, + UnaryOperation op, + void* + ) + { + return sprout::fixed::detail::transform_impl(first, last, result, op, sprout::size(result)); + } } // namespace detail // // transform // - template + template SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform( - Iterator first, - Iterator last, + InputIterator first, + InputIterator last, Result const& result, UnaryOperation op ) { - return sprout::fixed::detail::transform_impl( - first, - last, - result, - typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), - op, - sprout::fixed_begin_offset(result), - sprout::size(result), - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last) - ); + typedef typename std::iterator_traits::iterator_category* category; + return sprout::fixed::detail::transform(first, last, result, op, category()); } namespace detail { - template - SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform_impl( - Iterator1 first1, - Iterator1 last1, - Iterator2 first2, + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform2_impl_ra( + RandomAccessIterator1 first1, + RandomAccessIterator1 last1, + RandomAccessIterator2 first2, Result const& result, - sprout::index_tuple, BinaryOperation op, + sprout::index_tuple, typename sprout::fixed_container_traits::difference_type offset, typename sprout::fixed_container_traits::size_type size, typename sprout::fixed_container_traits::size_type input_size @@ -81,30 +140,90 @@ namespace sprout { )... ); } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform2( + RandomAccessIterator1 first1, + RandomAccessIterator1 last1, + RandomAccessIterator2 first2, + Result const& result, + BinaryOperation op, + std::random_access_iterator_tag* + ) + { + return sprout::fixed::detail::transform2_impl_ra( + first1, + last1, + first2, + result, + op, + typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), + sprout::fixed_begin_offset(result), + sprout::size(result), + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) + ); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type transform2_impl( + InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + Result const& result, + BinaryOperation op, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return sprout::remake_clone(result, sprout::size(result), args...); + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size != sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type transform2_impl( + InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + Result const& result, + BinaryOperation op, + typename sprout::fixed_container_traits::size_type size, + Args const&... args + ) + { + return first1 != last1 && sizeof...(Args) < size + ? sprout::fixed::detail::transform2_impl(sprout::next(first1), last1, sprout::next(first2), result, op, size, args..., op(*first1, *first2)) + : sprout::detail::container_complate(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform2( + InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + Result const& result, + BinaryOperation op, + void* + ) + { + return sprout::fixed::detail::transform2_impl(first1, last1, first2, result, op, sprout::size(result)); + } } // namespace detail // // transform // - template + template SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type transform( - Iterator1 first1, - Iterator1 last1, - Iterator2 first2, + InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, Result const& result, BinaryOperation op ) { - return sprout::fixed::detail::transform_impl( - first1, - last1, - first2, - result, - typename sprout::index_range<0, sprout::fixed_container_traits::fixed_size>::type(), - op, - sprout::fixed_begin_offset(result), - sprout::size(result), - NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first1, last1) - ); + typedef typename std::iterator_traits::iterator_category* category; + return sprout::fixed::detail::transform2(first1, last1, first2, result, op, category()); } } // namespace fixed