From 510a265ea5f3098ab08a6909aa78616be05a6f23 Mon Sep 17 00:00:00 2001 From: bolero-MURAKAMI Date: Thu, 20 Oct 2011 13:15:24 +0900 Subject: [PATCH] =?UTF-8?q?numeric/partial=5Fsum.hpp=20=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=20numeric/adjacent=5Fdifference.hpp=20=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sprout/algorithm/fixed/pop_heap.hpp | 2 +- sprout/algorithm/fixed/sort.hpp | 2 +- sprout/numeric/adjacent_difference.hpp | 8 + sprout/numeric/fit.hpp | 2 + sprout/numeric/fit/adjacent_difference.hpp | 77 ++++++ sprout/numeric/fit/partial_sum.hpp | 77 ++++++ sprout/numeric/fixed.hpp | 2 + sprout/numeric/fixed/adjacent_difference.hpp | 247 +++++++++++++++++++ sprout/numeric/fixed/partial_sum.hpp | 247 +++++++++++++++++++ sprout/numeric/partial_sum.hpp | 8 + 10 files changed, 670 insertions(+), 2 deletions(-) create mode 100644 sprout/numeric/adjacent_difference.hpp create mode 100644 sprout/numeric/fit/adjacent_difference.hpp create mode 100644 sprout/numeric/fit/partial_sum.hpp create mode 100644 sprout/numeric/fixed/adjacent_difference.hpp create mode 100644 sprout/numeric/fixed/partial_sum.hpp create mode 100644 sprout/numeric/partial_sum.hpp diff --git a/sprout/algorithm/fixed/pop_heap.hpp b/sprout/algorithm/fixed/pop_heap.hpp index cb6ba2c4..6ddd02da 100644 --- a/sprout/algorithm/fixed/pop_heap.hpp +++ b/sprout/algorithm/fixed/pop_heap.hpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL diff --git a/sprout/algorithm/fixed/sort.hpp b/sprout/algorithm/fixed/sort.hpp index 5cd5d4df..bd935201 100644 --- a/sprout/algorithm/fixed/sort.hpp +++ b/sprout/algorithm/fixed/sort.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT_DETAIL diff --git a/sprout/numeric/adjacent_difference.hpp b/sprout/numeric/adjacent_difference.hpp new file mode 100644 index 00000000..622083c4 --- /dev/null +++ b/sprout/numeric/adjacent_difference.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_NUMERIC_ADJACENT_DIFFERENCE_HPP +#define SPROUT_NUMERIC_ADJACENT_DIFFERENCE_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_NUMERIC_ADJACENT_DIFFERENCE_HPP diff --git a/sprout/numeric/fit.hpp b/sprout/numeric/fit.hpp index e57351a5..dd5a6a6f 100644 --- a/sprout/numeric/fit.hpp +++ b/sprout/numeric/fit.hpp @@ -2,6 +2,8 @@ #define SPROUT_NUMERIC_FIT_HPP #include +#include +#include #include #endif // #ifndef SPROUT_NUMERIC_FIT_HPP diff --git a/sprout/numeric/fit/adjacent_difference.hpp b/sprout/numeric/fit/adjacent_difference.hpp new file mode 100644 index 00000000..637e3ef3 --- /dev/null +++ b/sprout/numeric/fit/adjacent_difference.hpp @@ -0,0 +1,77 @@ +#ifndef SPROUT_NUMERIC_FIT_ADJACENT_DIFFERENCE_HPP +#define SPROUT_NUMERIC_FIT_ADJACENT_DIFFERENCE_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fit { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type adjacent_difference_impl( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::get_fixed(sprout::fixed::adjacent_difference(first, last, result)), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // adjacent_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type adjacent_difference( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return sprout::fit::detail::adjacent_difference_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type adjacent_difference_impl( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::get_fixed(sprout::fixed::adjacent_difference(first, last, result, binary_op)), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // adjacent_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type adjacent_difference( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return sprout::fit::detail::adjacent_difference_impl(first, last, result, binary_op, sprout::fixed_begin_offset(result)); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_NUMERIC_FIT_ADJACENT_DIFFERENCE_HPP diff --git a/sprout/numeric/fit/partial_sum.hpp b/sprout/numeric/fit/partial_sum.hpp new file mode 100644 index 00000000..3f5cca59 --- /dev/null +++ b/sprout/numeric/fit/partial_sum.hpp @@ -0,0 +1,77 @@ +#ifndef SPROUT_NUMERIC_FIT_PARTIAL_SUM_HPP +#define SPROUT_NUMERIC_FIT_PARTIAL_SUM_HPP + +#include +#include +#include +#include +#include +#include +#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL +#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT_DETAIL + +namespace sprout { + namespace fit { + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type partial_sum_impl( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::get_fixed(sprout::fixed::partial_sum(first, last, result)), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // partial_sum + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type partial_sum( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return sprout::fit::detail::partial_sum_impl(first, last, result, sprout::fixed_begin_offset(result)); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type partial_sum_impl( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::difference_type offset + ) + { + return sprout::sub_copy( + sprout::get_fixed(sprout::fixed::partial_sum(first, last, result, binary_op)), + offset, + offset + NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(NS_SSCRISK_CEL_OR_SPROUT_DETAIL::distance(first, last), sprout::size(result)) + ); + } + } // namespace detail + // + // partial_sum + // + template + SPROUT_CONSTEXPR inline typename sprout::fit::result_of::algorithm::type partial_sum( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return sprout::fit::detail::partial_sum_impl(first, last, result, binary_op, sprout::fixed_begin_offset(result)); + } + } // namespace fit +} // namespace sprout + +#endif // #ifndef SPROUT_NUMERIC_FIT_PARTIAL_SUM_HPP diff --git a/sprout/numeric/fixed.hpp b/sprout/numeric/fixed.hpp index 083ecfa9..15a9640c 100644 --- a/sprout/numeric/fixed.hpp +++ b/sprout/numeric/fixed.hpp @@ -2,6 +2,8 @@ #define SPROUT_NUMERIC_FIXED_HPP #include +#include +#include #include #endif // #ifndef SPROUT_NUMERIC_FIXED_HPP diff --git a/sprout/numeric/fixed/adjacent_difference.hpp b/sprout/numeric/fixed/adjacent_difference.hpp new file mode 100644 index 00000000..62ed286b --- /dev/null +++ b/sprout/numeric/fixed/adjacent_difference.hpp @@ -0,0 +1,247 @@ +#ifndef SPROUT_NUMERIC_FIXED_ADJACENT_DIFFERENCE_HPP +#define SPROUT_NUMERIC_FIXED_ADJACENT_DIFFERENCE_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type adjacent_difference_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 adjacent_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return adjacent_difference_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 adjacent_difference_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::value_type const& 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 adjacent_difference_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::value_type const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < static_cast(offset) + ? adjacent_difference_impl_2(sprout::next(first), last, result, *first, offset, args..., *first - value) + : adjacent_difference_impl_3(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 adjacent_difference_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + 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 adjacent_difference_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < static_cast(offset) + ? adjacent_difference_impl_1(first, last, result, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) + : first != last + ? adjacent_difference_impl_2(sprout::next(first), last, result, *first, offset + sprout::size(result), args..., *first) + : adjacent_difference_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type adjacent_difference_impl( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return adjacent_difference_impl_1(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // adjacent_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type adjacent_difference( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return sprout::fixed::detail::adjacent_difference_impl(first, last, result); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type adjacent_difference_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 adjacent_difference_impl_3( + Result const& result, + Args const&... args + ) + { + return adjacent_difference_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 adjacent_difference_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::value_type const& 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 adjacent_difference_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::value_type const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < static_cast(offset) + ? adjacent_difference_impl_2(sprout::next(first), last, result, binary_op, *first, offset, args..., binary_op(*first, value)) + : adjacent_difference_impl_3(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 adjacent_difference_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + 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 adjacent_difference_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < static_cast(offset) + ? adjacent_difference_impl_1(first, last, result, binary_op, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) + : first != last + ? adjacent_difference_impl_2(sprout::next(first), last, result, binary_op, *first, offset + sprout::size(result), args..., *first) + : adjacent_difference_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type adjacent_difference_impl( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return adjacent_difference_impl_1(first, last, result, binary_op, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // adjacent_difference + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type adjacent_difference( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return sprout::fixed::detail::adjacent_difference_impl(first, last, result, binary_op); + } + } // namespace fixed + + using sprout::fixed::adjacent_difference; +} // namespace sprout + +#endif // #ifndef SPROUT_NUMERIC_FIXED_ADJACENT_DIFFERENCE_HPP diff --git a/sprout/numeric/fixed/partial_sum.hpp b/sprout/numeric/fixed/partial_sum.hpp new file mode 100644 index 00000000..502627be --- /dev/null +++ b/sprout/numeric/fixed/partial_sum.hpp @@ -0,0 +1,247 @@ +#ifndef SPROUT_NUMERIC_FIXED_PARTIAL_SUM_HPP +#define SPROUT_NUMERIC_FIXED_PARTIAL_SUM_HPP + +#include +#include +#include +#include +#include +#include + +namespace sprout { + namespace fixed { + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type partial_sum_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 partial_sum_impl_3( + Result const& result, + Args const&... args + ) + { + return partial_sum_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 partial_sum_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::value_type const& 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 partial_sum_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::value_type const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < static_cast(offset) + ? partial_sum_impl_2(sprout::next(first), last, result, value + *first, offset, args..., value) + : partial_sum_impl_3(result, args..., value) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type partial_sum_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + 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 partial_sum_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < static_cast(offset) + ? partial_sum_impl_1(first, last, result, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) + : first != last + ? partial_sum_impl_2(sprout::next(first), last, result, *first, offset + sprout::size(result), args...) + : partial_sum_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type partial_sum_impl( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return partial_sum_impl_1(first, last, result, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // partial_sum + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type partial_sum( + InputIterator first, + InputIterator last, + Result const& result + ) + { + return sprout::fixed::detail::partial_sum_impl(first, last, result); + } + + namespace detail { + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type partial_sum_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 partial_sum_impl_3( + Result const& result, + Args const&... args + ) + { + return partial_sum_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 partial_sum_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::value_type const& 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 partial_sum_impl_2( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::value_type const& value, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return first != last && sizeof...(Args) < static_cast(offset) + ? partial_sum_impl_2(sprout::next(first), last, result, binary_op, binary_op(value, *first), offset, args..., value) + : partial_sum_impl_3(result, args..., value) + ; + } + template + SPROUT_CONSTEXPR inline typename std::enable_if< + sprout::fixed_container_traits::fixed_size == sizeof...(Args), + typename sprout::fixed::result_of::algorithm::type + >::type partial_sum_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + 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 partial_sum_impl_1( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op, + typename sprout::fixed_container_traits::difference_type offset, + Args const&... args + ) + { + return sizeof...(Args) < static_cast(offset) + ? partial_sum_impl_1(first, last, result, binary_op, offset, args..., *sprout::next(sprout::fixed_begin(result), sizeof...(Args))) + : first != last + ? partial_sum_impl_2(sprout::next(first), last, result, binary_op, *first, offset + sprout::size(result), args...) + : partial_sum_impl_3(result, args...) + ; + } + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type partial_sum_impl( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return partial_sum_impl_1(first, last, result, binary_op, sprout::fixed_begin_offset(result)); + } + } // namespace detail + // + // partial_sum + // + template + SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::algorithm::type partial_sum( + InputIterator first, + InputIterator last, + Result const& result, + BinaryOperation binary_op + ) + { + return sprout::fixed::detail::partial_sum_impl(first, last, result, binary_op); + } + } // namespace fixed + + using sprout::fixed::partial_sum; +} // namespace sprout + +#endif // #ifndef SPROUT_NUMERIC_FIXED_PARTIAL_SUM_HPP diff --git a/sprout/numeric/partial_sum.hpp b/sprout/numeric/partial_sum.hpp new file mode 100644 index 00000000..002cd83e --- /dev/null +++ b/sprout/numeric/partial_sum.hpp @@ -0,0 +1,8 @@ +#ifndef SPROUT_NUMERIC_PARTIAL_SUM_HPP +#define SPROUT_NUMERIC_PARTIAL_SUM_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_NUMERIC_PARTIAL_SUM_HPP