6#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_TRANSFORM_HPP_
7#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_ALGORITHM_TRANSFORM_HPP_
13#include "arene/base/compiler_support/cpp14_inline.hpp"
14#include "arene/base/constraints/constraints.hpp"
15#include "arene/base/stdlib_choice/cstddef.hpp"
16#include "arene/base/stdlib_choice/decay.hpp"
17#include "arene/base/stdlib_choice/declval.hpp"
18#include "arene/base/stdlib_choice/enable_if.hpp"
19#include "arene/base/stdlib_choice/forward.hpp"
20#include "arene/base/stdlib_choice/integer_sequence.hpp"
21#include "arene/base/stdlib_choice/make_tuple.hpp"
22#include "arene/base/stdlib_choice/move.hpp"
23#include "arene/base/stdlib_choice/pair.hpp"
24#include "arene/base/stdlib_choice/remove_cv.hpp"
25#include "arene/base/stdlib_choice/remove_reference.hpp"
26#include "arene/base/stdlib_choice/tuple.hpp"
27#include "arene/base/stdlib_choice/tuple_size.hpp"
28#include "arene/base/tuple/detail/get.hpp"
29#include "arene/base/type_traits/comparison_traits.hpp"
30#include "arene/base/type_traits/is_instantiation_of.hpp"
31#include "arene/base/type_traits/iterator_category_traits.hpp"
32#include "arene/base/type_traits/remove_cvref.hpp"
33#include "arene/base/utility/forward_like.hpp"
39namespace transform_detail {
50template <
class F,
typename TupleType, std::size_t... Is>
51constexpr auto transform_tuple_impl(F&& func, TupleType&& tuple, std::index_sequence<Is...>) ->
decltype(
auto) {
52 return std::make_tuple(func(std::get<Is>(std::forward<TupleType>(tuple)))...);
63template <
template <
typename U, std::size_t N>
class ToType,
typename F,
typename FromArrayType>
64constexpr auto transform_array_impl(F&& func, FromArrayType&& array)
65 -> ToType<std::decay_t<
decltype(func(*array.begin()))>, 0U> {
66 return ToType<std::decay_t<
decltype(func(*array.begin()))>, 0U>{};
77template <
template <
typename U, std::size_t N>
class ToType,
typename F,
typename FromArrayType, std::size_t... Is>
78constexpr auto transform_array_impl(F&& func, FromArrayType&& array, std::index_sequence<Is...>)
79 -> ToType<std::decay_t<
decltype(func(*array.begin()))>,
sizeof...(Is)> {
80 return ToType<std::decay_t<
decltype(func(*array.begin()))>,
sizeof...(Is)>{
81 func(tuple_detail::get<Is>(std::forward<FromArrayType>(array)))...
108 typename UnaryOperation,
110 std::enable_if_t<is_input_iterator_v<StartItr>>,
111 std::enable_if_t<is_output_iterator_v<OutputItr>>,
112 std::enable_if_t<is_inequality_comparable_v<StartItr, EndItr>>> =
nullptr>
113 constexpr auto operator()(StartItr start, EndItr end, OutputItr out, UnaryOperation transform_op)
const noexcept(
114 arene::base::is_nothrow_inequality_comparable_v<StartItr&, EndItr&>&&
115 noexcept(*std::declval<OutputItr&>()++ = transform_op(*std::declval<StartItr&>()++))
117 while (start != end) {
120 *out++ = transform_op(*start++);
146 typename LhsStartItr,
150 typename BinaryOperation,
152 std::enable_if_t<is_input_iterator_v<LhsStartItr>>,
153 std::enable_if_t<is_input_iterator_v<RhsItr>>,
154 std::enable_if_t<is_output_iterator_v<OutputItr>>,
155 std::enable_if_t<is_inequality_comparable_v<LhsStartItr, LhsEndItr>>> =
nullptr>
156 constexpr auto operator()(
157 LhsStartItr lhs_start,
161 BinaryOperation transform_op
163 arene::base::is_nothrow_inequality_comparable_v<LhsStartItr&, LhsEndItr&>&&
165 *std::declval<OutputItr&>()++ = transform_op(*std::declval<LhsStartItr&>()++, *std::declval<RhsItr&>()++)
168 while (lhs_start != lhs_end) {
171 *out++ = transform_op(*lhs_start++, *rhs_start++);
186 constraints<std::enable_if_t<is_instantiation_of_v<remove_cvref_t<PairType>, std::pair>>> =
nullptr>
187 constexpr auto operator()(F&& func, PairType&& pair)
const {
188 return std::make_pair(func(forward_like<PairType>(pair.first)), func(forward_like<PairType>(pair.second)));
200 constraints<std::enable_if_t<is_instantiation_of_v<remove_cvref_t<TupleType>, std::tuple>>> =
nullptr>
201 constexpr auto operator()(F&& func, TupleType&& tuple)
const {
202 return transform_tuple_impl(
203 std::forward<F>(func),
204 std::forward<TupleType>(tuple),
205 std::make_index_sequence<std::tuple_size<remove_cvref_t<TupleType>>::value>{}
218 template <
typename T, std::size_t N>
222 constraints<std::enable_if_t<N != 0>, std::enable_if_t<std::tuple_size<ArrayLikeType<T, N>>::value == N>> =
224 constexpr auto operator()(F&& func, ArrayLikeType<T, N>
const& array)
const {
225 return transform_array_impl<ArrayLikeType>(std::forward<F>(func), array, std::make_index_sequence<N>{});
236 template <
typename T, std::size_t N>
240 constraints<std::enable_if_t<N != 0>, std::enable_if_t<std::tuple_size<ArrayLikeType<T, N>>::value == N>> =
242 constexpr auto operator()(F&& func, ArrayLikeType<T, N>&& array)
const {
243 return transform_array_impl<ArrayLikeType>(std::forward<F>(func), std::move(array), std::make_index_sequence<N>{});
253 template <
typename T, std::size_t N>
256 constraints<std::enable_if_t<std::tuple_size<ArrayLikeType<T, 0U>>::value == 0>> =
nullptr>
257 constexpr auto operator()(F&& func, ArrayLikeType<T, 0U>
const& array)
const {
258 return transform_array_impl<ArrayLikeType>(std::forward<F>(func), array);
Definition array_exceptions_disabled.cpp:11
ARENE_CPP14_INLINE_VARIABLE(transform_detail::transform_fn, transform)
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10