7#ifndef _CGP_STD_ARRAY_TUPLE_OPERATIONS_HPP
8#define _CGP_STD_ARRAY_TUPLE_OPERATIONS_HPP
21 template<cgt::numerical_c H, cgt::numerical_c... Ts>
22 constexpr decltype(
auto)
tuple_to_array(std::tuple<H, Ts...>
const& tuple)
noexcept
29 return std::array{
static_cast<element_t>(std::get<i>(tuple)) ... };
33 template<cgt::tuple_flat_c H, cgt::tuple_flat_c... Ts>
34 requires (!cgt::all_same_flat_c<H, Ts...>) &&
35 (std::tuple_size_v<H> == ... == std::tuple_size_v<Ts>)
36 constexpr decltype(
auto)
tuple_to_array(std::tuple<H, Ts...>
const& tuple)
noexcept
43 return std::array{
tuple_to_array(
static_cast<tt
>(std::get<i>(tuple)))... };
47 template<cgt::tuple_flat_c H, cgt::tuple_flat_c... Ts>
48 requires cgt::all_same_flat_c<H, Ts...>
49 constexpr decltype(
auto)
tuple_to_array(std::tuple<H, Ts...>
const& tuple)
noexcept
58 template<cgt::numerical_c E, std::
size_t N>
59 constexpr decltype(
auto)
array_to_tuple(std::array<E, N>
const& array)
noexcept
61 return cgt::for_stallion<N>
64 return std::tuple{ std::get<i>(array)... };
68 template<cgt::std_array_flat_c E, std::
size_t N>
69 constexpr decltype(
auto)
array_to_tuple(std::array<E, N>
const& array)
noexcept
71 return cgt::for_stallion<N>
79 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
80 requires (N ==
sizeof...(Ts) + 1)
81 constexpr decltype(
auto)
operator+
86 if constexpr(cgt::all_same_c<H, Ts...>)
93 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
94 requires (N ==
sizeof...(Ts) + 1)
95 constexpr decltype(
auto)
operator+
100 if constexpr(cgt::all_same_c<H, Ts...>)
107 template<
typename E, std::size_t N,
typename H,
typename... Ts>
108 requires (N ==
sizeof...(Ts) + 1) &&
109 ( !(cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
110 constexpr decltype(
auto)
operator+
115 if constexpr(cgt::all_same_c<H, Ts...>)
116 return std::array{ std::get<i>(
A) + std::get<i>(T) ... };
118 return std::tuple{ std::get<i>(
A) + std::get<i>(T) ... };
122 template<
typename E, std::size_t N,
typename H,
typename... Ts>
123 requires (N ==
sizeof...(Ts) + 1) &&
124 ( !( cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
125 constexpr decltype(
auto)
operator+
130 if constexpr(cgt::all_same_c<H, Ts...>)
131 return std::array{ std::get<i>(T) + std::get<i>(
A) ... };
133 return std::tuple{ std::get<i>(T) + std::get<i>(
A) ... };
139 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
140 requires (N ==
sizeof...(Ts) + 1)
141 constexpr decltype(
auto)
operator-
146 if constexpr(cgt::all_same_c<H, Ts...>)
153 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
154 requires (N ==
sizeof...(Ts) + 1)
155 constexpr decltype(
auto)
operator-
160 if constexpr(cgt::all_same_c<H, Ts...>)
167 template<
typename E, std::size_t N,
typename H,
typename... Ts>
168 requires (N ==
sizeof...(Ts) + 1) &&
169 ( !(cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
170 constexpr decltype(
auto)
operator-
175 if constexpr(cgt::all_same_c<H, Ts...>)
176 return std::array{ std::get<i>(
A) - std::get<i>(T) ... };
178 return std::tuple{ std::get<i>(
A) - std::get<i>(T) ... };
182 template<
typename E, std::size_t N,
typename H,
typename... Ts>
183 requires (N ==
sizeof...(Ts) + 1) &&
184 ( !( cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
185 constexpr decltype(
auto)
operator-
190 if constexpr(cgt::all_same_c<H, Ts...>)
191 return std::array{ std::get<i>(T) - std::get<i>(
A) ... };
193 return std::tuple{ std::get<i>(T) - std::get<i>(
A) ... };
199 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
200 requires (N ==
sizeof...(Ts) + 1)
201 constexpr decltype(
auto)
operator*
206 if constexpr(cgt::all_same_c<H, Ts...>)
213 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
214 requires (N ==
sizeof...(Ts) + 1)
215 constexpr decltype(
auto)
operator*
220 if constexpr(cgt::all_same_c<H, Ts...>)
227 template<
typename E, std::size_t N,
typename H,
typename... Ts>
228 requires (N ==
sizeof...(Ts) + 1) &&
229 ( !(cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
230 constexpr decltype(
auto)
operator*
235 if constexpr(cgt::all_same_c<H, Ts...>)
236 return std::array{ std::get<i>(
A) * std::get<i>(T) ... };
238 return std::tuple{ std::get<i>(
A) * std::get<i>(T) ... };
242 template<
typename E, std::size_t N,
typename H,
typename... Ts>
243 requires (N ==
sizeof...(Ts) + 1) &&
244 ( !( cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
245 constexpr decltype(
auto)
operator*
250 if constexpr(cgt::all_same_c<H, Ts...>)
251 return std::array{ std::get<i>(T) * std::get<i>(
A) ... };
253 return std::tuple{ std::get<i>(T) * std::get<i>(
A) ... };
259 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
260 requires (N ==
sizeof...(Ts) + 1)
261 constexpr decltype(
auto)
operator/
266 if constexpr(cgt::all_same_c<H, Ts...>)
273 template<cgt::numerical_c E, std::size_t N, cgt::numerical_c H, cgt::numerical_c... Ts>
274 requires (N ==
sizeof...(Ts) + 1)
275 constexpr decltype(
auto)
operator/
280 if constexpr(cgt::all_same_c<H, Ts...>)
287 template<
typename E, std::size_t N,
typename H,
typename... Ts>
288 requires (N ==
sizeof...(Ts) + 1) &&
289 ( !(cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
290 constexpr decltype(
auto)
operator/
295 if constexpr(cgt::all_same_c<H, Ts...>)
296 return std::array{ std::get<i>(
A) / std::get<i>(T) ... };
298 return std::tuple{ std::get<i>(
A) / std::get<i>(T) ... };
302 template<
typename E, std::size_t N,
typename H,
typename... Ts>
303 requires (N ==
sizeof...(Ts) + 1) &&
304 ( !( cgt::numerical_c<E> && (cgt::numerical_c<H> && ... && cgt::numerical_c<Ts>)) )
305 constexpr decltype(
auto)
operator/
310 if constexpr(cgt::all_same_c<H, Ts...>)
311 return std::array{ std::get<i>(T) / std::get<i>(
A) ... };
313 return std::tuple{ std::get<i>(T) / std::get<i>(
A) ... };
constexpr decltype(auto) for_stallion(WorkType &&work, std::integer_sequence< T, Indices... >, ArgTypes &&... args)
make_signed_t< std::common_type_t< std::remove_cvref_t< Types >... > > common_signed_t
constexpr auto sbo(T &&value) noexcept(!cpg::bDetectOverFlow)
std::integer_sequence< std::common_type_t< std::remove_cvref_t< decltype(Indices)>... >, Indices... > sequence
constexpr const bool bDetectOverFlow
constexpr auto signed_tuple_operation(T arg, Tails... args) noexcept
constexpr decltype(auto) array_to_tuple(std::array< E, N > const &array) noexcept
constexpr decltype(auto) tuple_to_array(std::tuple< H, Ts... > const &tuple) noexcept