9#ifndef _CGP_VECTOR_OPERATIONS_HPP
10#define _CGP_VECTOR_OPERATIONS_HPP
22 template<cgt::vector_c LeftType, cgt::vector_c RightType>
23 requires cgt::common_vector_c<LeftType, RightType>
26 assert(
A.size() ==
B.size());
31 std::size_t Size =
A.size();
33 if constexpr( std::same_as<element_t_a, element_t_b> &&
34 std::is_rvalue_reference_v<
decltype(
A) >)
36 for(std::size_t i=0; i < Size; ++i)
41 else if constexpr( std::same_as<element_t_a, element_t_b> &&
42 std::is_rvalue_reference_v<
decltype(
B) >)
44 for(std::size_t i=0; i < Size; ++i)
53 for(std::size_t i=0; i < Size; ++i)
60 template<cgt::vector_c LeftType, cgt::vector_c RightType>
61 requires cgt::common_vector_c<LeftType, RightType>
64 assert(
A.size() ==
B.size());
69 std::size_t Size =
A.size();
71 if constexpr( std::same_as<element_t_a, element_t_b> &&
72 std::is_rvalue_reference_v<
decltype(
A) >)
74 for(std::size_t i=0; i < Size; ++i)
79 else if constexpr( std::same_as<element_t_a, element_t_b> &&
80 std::is_rvalue_reference_v<
decltype(
B) >)
82 for(std::size_t i=0; i < Size; ++i)
91 for(std::size_t i=0; i < Size; ++i)
98 template<cgt::vector_c LeftType, cgt::vector_c RightType>
99 requires cgt::common_vector_c<LeftType, RightType>
102 assert(
A.size() ==
B.size());
107 std::size_t Size =
A.size();
109 if constexpr( std::same_as<element_t_a, element_t_b> &&
110 std::is_rvalue_reference_v<
decltype(
A) >)
112 for(std::size_t i=0; i < Size; ++i)
117 else if constexpr( std::same_as<element_t_a, element_t_b> &&
118 std::is_rvalue_reference_v<
decltype(
B) >)
120 for(std::size_t i=0; i < Size; ++i)
129 for(std::size_t i=0; i < Size; ++i)
136 template<cgt::vector_c LeftType, cgt::vector_c RightType>
137 requires cgt::common_vector_c<LeftType, RightType>
140 assert(
A.size() ==
B.size());
145 std::size_t Size =
A.size();
147 if constexpr( std::same_as<element_t_a, element_t_b> &&
148 std::is_rvalue_reference_v<
decltype(
A) >)
150 for(std::size_t i=0; i < Size; ++i)
155 else if constexpr( std::same_as<element_t_a, element_t_b> &&
156 std::is_rvalue_reference_v<
decltype(
B) >)
158 for(std::size_t i=0; i < Size; ++i)
167 for(std::size_t i=0; i < Size; ++i)
175 template<cgt::vector_c LeftType, cgt::vector_c RightType>
176 requires cgt::common_vector_c<LeftType, RightType>
177 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
181 assert(
A.size() ==
B.size());
186 std::size_t Size =
A.size();
188 if constexpr( std::same_as<element_t_a, element_t_b> &&
189 std::is_rvalue_reference_v<
decltype(
A) >)
191 for(std::size_t i=0; i < Size; ++i)
196 else if constexpr( std::same_as<element_t_a, element_t_b> &&
197 std::is_rvalue_reference_v<
decltype(
B) >)
199 for(std::size_t i=0; i < Size; ++i)
208 for(std::size_t i=0; i < Size; ++i)
216 template<cgt::vector_c LeftType, cgt::vector_c RightType>
217 requires cgt::common_vector_c<LeftType, RightType>
218 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
222 assert(
A.size() ==
B.size());
227 std::size_t Size =
A.size();
230 using element_t =std::tuple_element_t<0, cgt::first_type_t<c_t>>;
231 using vector_t = std::vector<element_t>;
235 for(std::size_t i=0; i <
A.size(); ++i)
242 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
243 requires cgt::common_vector_c<LeftType, RightType>
244 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
248 std::size_t Size =
A.size();
250 if constexpr(std::is_rvalue_reference_v<
decltype(
A)>)
252 for(std::size_t i=0; i < Size; ++i)
A[i] =
A[i] +
B;
260 for(std::size_t i=0; i < Size; ++i) C[i] =
A[i] +
B;
266 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
267 requires cgt::common_vector_c<LeftType, RightType>
268 && (cgt::numerical_c<cgt::first_type_t<LeftType>>)
272 std::size_t Size =
B.size();
274 if constexpr(std::is_rvalue_reference_v<
decltype(
B)>)
276 for(std::size_t i=0; i < Size; ++i)
B[i] =
A +
B[i];
284 for(std::size_t i=0; i < Size; ++i) C[i] =
A +
B[i];
291 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
292 requires cgt::common_vector_c<LeftType, RightType>
293 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
297 std::size_t Size =
A.size();
299 if constexpr(std::is_rvalue_reference_v<
decltype(
A)>)
301 for(std::size_t i=0; i < Size; ++i)
A[i] =
A[i] -
B;
309 for(std::size_t i=0; i < Size; ++i) C[i] =
A[i] -
B;
315 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
316 requires cgt::common_vector_c<LeftType, RightType>
317 && (cgt::numerical_c<cgt::first_type_t<LeftType>>)
321 std::size_t Size =
B.size();
323 if constexpr(std::is_rvalue_reference_v<
decltype(
B)>)
325 for(std::size_t i=0; i < Size; ++i)
B[i] =
A -
B[i];
333 for(std::size_t i=0; i < Size; ++i) C[i] =
A -
B[i];
340 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
341 requires cgt::common_vector_c<LeftType, RightType>
342 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
346 std::size_t Size =
A.size();
348 if constexpr(std::is_rvalue_reference_v<
decltype(
A)>)
350 for(std::size_t i=0; i < Size; ++i)
A[i] =
A[i] *
B;
358 for(std::size_t i=0; i < Size; ++i) C[i] =
A[i] *
B;
364 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
365 requires cgt::common_vector_c<LeftType, RightType>
366 && (cgt::numerical_c<cgt::first_type_t<LeftType>>)
370 std::size_t Size =
B.size();
372 if constexpr(std::is_rvalue_reference_v<
decltype(
B)>)
374 for(std::size_t i=0; i < Size; ++i)
B[i] =
A *
B[i];
382 for(std::size_t i=0; i < Size; ++i) C[i] =
A *
B[i];
389 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
390 requires cgt::common_vector_c<LeftType, RightType>
391 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
395 std::size_t Size =
A.size();
397 if constexpr(std::is_rvalue_reference_v<
decltype(
A)>)
399 for(std::size_t i=0; i < Size; ++i)
A[i] =
A[i] /
B;
407 for(std::size_t i=0; i < Size; ++i) C[i] =
A[i] /
B;
413 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
414 requires cgt::common_vector_c<LeftType, RightType>
415 && (cgt::numerical_c<cgt::first_type_t<LeftType>>)
419 std::size_t Size =
B.size();
421 if constexpr(std::is_rvalue_reference_v<
decltype(
B)>)
423 for(std::size_t i=0; i < Size; ++i)
B[i] =
A /
B[i];
431 for(std::size_t i=0; i < Size; ++i) C[i] =
A /
B[i];
438 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
439 requires cgt::common_vector_c<LeftType, RightType>
440 && (cgt::std_array_c<cgt::first_type_t<LeftType>>)
444 std::size_t Size =
A.size();
449 if constexpr(std::is_rvalue_reference_v<
decltype(
A)>)
451 for(std::size_t i=0; i < Size; ++i)
A[i] =
A[i] %
B;
459 for(std::size_t i=0; i < Size; ++i) C[i] =
A[i] %
B;
465 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
466 requires cgt::common_vector_c<LeftType, RightType>
467 && (cgt::numerical_c<cgt::first_type_t<LeftType>>)
471 std::size_t Size =
B.size();
473 if constexpr(std::is_rvalue_reference_v<
decltype(
B)>)
475 for(std::size_t i=0; i < Size; ++i)
B[i] =
A %
B[i];
483 for(std::size_t i=0; i < Size; ++i) C[i] =
A %
B[i];
490 template<cgt::vector_c LeftType, cgt::std_array_flat_c RightType>
491 requires cgt::std_array_c<cgt::first_type_t<LeftType>>
492 && cgt::numerical_c<cgt::first_type_t<RightType>>
493 && (std::tuple_size_v<cgt::first_type_t<LeftType>>
494 == std::tuple_size_v<std::remove_cvref_t<RightType>>)
500 std::size_t Size =
A.size();
503 using vector_t = std::vector<element_t>;
507 for(std::size_t i=0; i < Size; ++i) R[i] =
A[i] &
B;
512 template<cgt::std_array_flat_c LeftType, cgt::vector_c RightType>
513 requires cgt::numerical_c<cgt::first_type_t<LeftType>>
514 && cgt::std_array_c<cgt::first_type_t<RightType>>
515 && (std::tuple_size_v<std::remove_cvref_t<LeftType>>
516 == std::tuple_size_v<cgt::first_type_t<RightType>>)
522 std::size_t Size =
B.size();
525 using vector_t = std::vector<element_t>;
529 for(std::size_t i=0; i < Size; ++i) R[i] =
A &
B[i];
535 template<cgt::vector_c LeftType, cgt::numerical_c RightType>
536 requires cgt::common_vector_c<LeftType, RightType>
541 std::size_t Size =
A.size();
543 if constexpr( std::same_as<c_t, std::remove_cvref_t<LeftType>> &&
544 std::is_rvalue_reference_v<
decltype(
A)>)
546 for(std::size_t i=0; i < Size; ++i)
555 for(std::size_t i=0; i < Size; ++i)
562 template<cgt::numerical_c LeftType, cgt::vector_c RightType>
563 requires cgt::common_vector_c<LeftType, RightType>
568 std::size_t Size =
B.size();
570 if constexpr(std::same_as<c_t, std::remove_cvref_t<RightType>> &&
571 std::is_rvalue_reference_v<
decltype(
B)>)
573 for(std::size_t i=0; i < Size; ++i)
582 for(std::size_t i=0; i < Size; ++i)
589 template<cgt::vector_c LeftType, cgt::numerical_c RightType>
590 requires cgt::common_vector_c<LeftType, RightType>
595 std::size_t Size =
A.size();
597 if constexpr( std::same_as<c_t, std::remove_cvref_t<LeftType>> &&
598 std::is_rvalue_reference_v<
decltype(
A)>)
600 for(std::size_t i=0; i < Size; ++i)
609 for(std::size_t i=0; i < Size; ++i)
616 template<cgt::numerical_c LeftType, cgt::vector_c RightType>
617 requires cgt::common_vector_c<LeftType, RightType>
622 std::size_t Size =
B.size();
624 if constexpr(std::same_as<c_t, std::remove_cvref_t<RightType>> &&
625 std::is_rvalue_reference_v<
decltype(
B)>)
627 for(std::size_t i=0; i < Size; ++i)
636 for(std::size_t i=0; i < Size; ++i)
643 template<cgt::vector_c LeftType, cgt::numerical_c RightType>
644 requires cgt::common_vector_c<LeftType, RightType>
649 std::size_t Size =
A.size();
651 if constexpr( std::same_as<c_t, std::remove_cvref_t<LeftType>> &&
652 std::is_rvalue_reference_v<
decltype(
A)>)
654 for(std::size_t i=0; i < Size; ++i)
663 for(std::size_t i=0; i < Size; ++i)
670 template<cgt::numerical_c LeftType, cgt::vector_c RightType>
671 requires cgt::common_vector_c<LeftType, RightType>
676 std::size_t Size =
B.size();
678 if constexpr(std::same_as<c_t, std::remove_cvref_t<RightType>> &&
679 std::is_rvalue_reference_v<
decltype(
B)>)
681 for(std::size_t i=0; i < Size; ++i)
690 for(std::size_t i=0; i < Size; ++i)
697 template<cgt::vector_c LeftType, cgt::numerical_c RightType>
698 requires cgt::common_vector_c<LeftType, RightType>
703 std::size_t Size =
A.size();
705 if constexpr( std::same_as<c_t, std::remove_cvref_t<LeftType>> &&
706 std::is_rvalue_reference_v<
decltype(
A)>)
708 for(std::size_t i=0; i < Size; ++i)
717 for(std::size_t i=0; i < Size; ++i)
724 template<cgt::numerical_c LeftType, cgt::vector_c RightType>
725 requires cgt::common_vector_c<LeftType, RightType>
730 std::size_t Size =
B.size();
732 if constexpr(std::same_as<c_t, std::remove_cvref_t<RightType>> &&
733 std::is_rvalue_reference_v<
decltype(
B)>)
735 for(std::size_t i=0; i < Size; ++i)
744 for(std::size_t i=0; i < Size; ++i)
std::vector< Type > vector_t
typename hidden::st_first_element< std::remove_cvref_t< T > >::type first_type_t
typename hidden::st_common_vector< std::remove_cvref_t< A >, std::remove_cvref_t< B > >::type common_vector_t
constexpr auto sbo(T &&value) noexcept(!cpg::bDetectOverFlow)
Includes subnamespace conversion.
constexpr const bool bDetectOverFlow
constexpr decltype(auto) operator&(LeftType &&A, RightType &&B) noexcept(!cpg::bDetectOverFlow)