7#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_TRANSFORM_REDUCE_HPP_
8#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_TRANSFORM_REDUCE_HPP_
16#include "arene/base/algorithm/detail/generalized_transform_reduce.hpp"
17#include "arene/base/algorithm/detail/traits.hpp"
18#include "arene/base/compiler_support/cpp14_inline.hpp"
19#include "arene/base/constraints/constraints.hpp"
20#include "arene/base/optional/optional.hpp"
21#include "arene/base/stdlib_choice/enable_if.hpp"
22#include "arene/base/stdlib_choice/forward.hpp"
23#include "arene/base/stdlib_choice/is_constructible.hpp"
24#include "arene/base/stdlib_choice/is_destructible.hpp"
25#include "arene/base/stdlib_choice/is_move_assignable.hpp"
26#include "arene/base/stdlib_choice/is_move_constructible.hpp"
27#include "arene/base/stdlib_choice/move.hpp"
28#include "arene/base/stdlib_choice/multiplies.hpp"
29#include "arene/base/stdlib_choice/plus.hpp"
30#include "arene/base/type_traits/is_invocable.hpp"
31#include "arene/base/type_traits/iterator_category_traits.hpp"
40namespace algorithm_detail {
41namespace transform_reduce_detail {
44class transform_reduce_fn {
50 template <
class Invocable,
class... Iterator>
51 using iter_result_t = invoke_result_t<Invocable, iter_reference_t<Iterator>...>;
60 template <
class Value,
bool = std::is_move_assignable<Value>::value>
61 class reduce_value_policy {
64 using value_type = optional<Value>;
74 template <
class Result>
75 static auto assign(value_type& acc, Result&& result)
noexcept(
76 std::is_nothrow_destructible<value_type>::value &&
77 std::is_nothrow_constructible<Value, Result&&>::value
79 acc.emplace(std::forward<Result>(result));
85 static auto access(value_type& acc)
noexcept -> Value&& {
return *std::move(acc); }
90 static auto access(value_type&& acc)
noexcept -> Value&& {
return *std::move(acc); }
98 template <
class Value>
99 class reduce_value_policy<Value,
true>
100 :
public generalized_transform_reduce::default_reduce_value_policy<Value> {};
159 std::enable_if_t<is_input_iterator_v<InputIt1>>,
160 std::enable_if_t<is_input_iterator_v<InputIt2>>,
161 std::enable_if_t<std::is_move_constructible<Value>::value>,
162 std::enable_if_t<is_invocable_r_v<
167 std::enable_if_t<is_invocable_r_v<
171 iter_result_t<Transform&, InputIt1, InputIt2>>>,
172 std::enable_if_t<is_invocable_r_v<
175 iter_result_t<Transform&, InputIt1, InputIt2>,
177 std::enable_if_t<is_invocable_r_v<
180 iter_result_t<Transform&, InputIt1, InputIt2>,
181 iter_result_t<Transform&, InputIt1, InputIt2>>>> =
nullptr>
182 constexpr auto operator()(
192 std::is_nothrow_constructible<
193 typename reduce_value_policy<Value>::value_type,
196 std::is_nothrow_move_constructible<Value>::value &&
197 is_nothrow_invocable_v<
198 generalized_transform_reduce,
199 reduce_value_policy<Value>,
203 typename reduce_value_policy<Value>::value_type,
209 using value_policy = reduce_value_policy<Value>;
211 return value_policy::access(
212 generalized_transform_reduce{}(
217 typename value_policy::value_type{std::move(init)},
272 std::enable_if_t<is_input_iterator_v<InputIt1>>,
273 std::enable_if_t<is_input_iterator_v<InputIt2>>,
274 std::enable_if_t<std::is_move_constructible<Value>::value>,
275 std::enable_if_t<is_invocable_r_v<
280 std::enable_if_t<is_invocable_r_v<
284 iter_result_t<std::multiplies<>&, InputIt1, InputIt2>>>,
285 std::enable_if_t<is_invocable_r_v<
288 iter_result_t<std::multiplies<>&, InputIt1, InputIt2>,
290 std::enable_if_t<is_invocable_r_v<
293 iter_result_t<std::multiplies<>&, InputIt1, InputIt2>,
294 iter_result_t<std::multiplies<>&, InputIt1, InputIt2>>>> =
nullptr>
295 constexpr auto operator()(
301 is_nothrow_invocable_v<
Definition array_exceptions_disabled.cpp:11
ARENE_CPP14_INLINE_VARIABLE(algorithm_detail::transform_reduce_detail::transform_reduce_fn, transform_reduce)
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10