19#ifndef Tpf_FormatWidth
20#define Tpf_FormatWidth 12
23#ifndef Tpf_FormatPrecision
24#define Tpf_FormatPrecision 6
27#ifndef Tpf_ToleranceFloat
28 #define Tpf_ToleranceFloat 1.0e-7
31#ifndef Tpf_ToleranceDouble
32 #define Tpf_ToleranceDouble 1.0e-12
35#ifndef Tpf_ToleranceLongDouble
36 #define Tpf_ToleranceLongDouble 1.0e-12
41 #if _MSVC_LANG < 201703L
42 #error This libary requires C++17 Standard (Visual Studio 2017).
47 #if __cplusplus < 201703
48 #error This library requires C++17 Standard (GNU g++ version 8.0 or clang++ version 8.0 above)
67#include <unordered_set>
69#include <unordered_map>
86 #define __FUNCTION_NAME__ __FUNCSIG__
88 #define __FUNCTION_NAME__ __PRETTY_FUNCTION__
95 inline constexpr std::size_t
operator""_size_t(
unsigned long long value)
97 return static_cast<std::size_t
>(value);
100 inline constexpr unsigned int operator""_unsigned(
unsigned long long value)
102 return static_cast<unsigned int>(value);
105 inline constexpr short operator""_short(
unsigned long long value)
107 return static_cast<short>(value);
110 inline constexpr unsigned short operator""_ushort(
unsigned long long value)
112 return static_cast<unsigned short>(value);
115 inline constexpr char operator""_char(
unsigned long long value)
117 return static_cast<char>(value);
120 inline constexpr char operator""_schar(
unsigned long long value)
122 return static_cast<signed char>(value);
125 inline constexpr unsigned char operator""_uchar(
unsigned long long value)
127 return static_cast<unsigned char>(value);
130 inline constexpr long double operator""_ldouble(
long double value)
150 template<
typename Type>
153 template<
typename Type>
154 constexpr bool is_const_v = std::is_const_v<std::remove_reference_t<Type>>;
161 template<
typename Type>
169 template<
typename Type>
177 template<
typename Type>
180 template<
typename Type_1,
typename Type_2>
183 return a >= b ? a : b;
186 template<
typename Type_1,
typename Type_2,
typename... Types>
187 auto maximum(Type_1 a, Type_2 b, Types... args)
189 if constexpr(
sizeof...(args)==0)
195 template<
typename Type_1,
typename Type_2>
198 return b < a ? b : a;
201 template<
typename Type_1,
typename Type_2,
typename... Types>
202 auto minimum(Type_1 a, Type_2 b, Types... args)
204 if constexpr(
sizeof...(args)==0)
215 template<
typename Type>
217 std::is_reference_v<Type> && std::is_const_v<std::remove_reference_t<Type>>;
226 std::string m_message;
228 std::string m_file_name;
229 std::string m_what_msg;
233 int lineno, std::string file_name):
234 m_lineno(lineno), m_message(message), m_file_name(file_name)
236 std::ostringstream os;
238 os <<
"debug_exception - file [" << this->m_file_name <<
"]\n";
239 os <<
"thread id [" << std::this_thread::get_id() <<
"] - ";
240 os <<
"line [" << this->m_lineno<<
"]\n";
241 os <<
"message: " << this->m_message;
243 this->m_what_msg = os.str();
246 virtual const char*
what() const noexcept
override
248 return this->m_what_msg.c_str();
253 template<
typename Type>
256 unsigned long long two_power = 1;
257 return (two_power << (
unsigned long long)n);
266 template<
typename Type>
267 inline constexpr auto type_max_v = std::numeric_limits<Type>::max();
275 template<std::size_t KeyIndex,
typename Type,
auto Index,
auto... Indices>
276 constexpr auto get_nth_value(std::integer_sequence<Type, Index, Indices...>)
noexcept
278 if constexpr(KeyIndex == 0)
280 else if constexpr(KeyIndex>0 &&
sizeof...(Indices) != 0)
288 template<
auto Id,
auto... Ids>
289 using index_t = std::index_sequence<(std::size_t)Id, (std::size_t)Ids...>;
294 template<
typename ...Types>
295 using index_for = std::make_index_sequence<
sizeof...(Types)>;
297 template<
typename Type>
315 template<
typename ArgType,
typename... ArgTypes>
317 value{ std::move(arg), std::move(args)... } { }
328 operator const Type&()
const noexcept{
return get(); }
334 template<
typename Type>
337 constexpr static bool value =
false;
340 template<
typename Type,
int Tag>
346 template<
typename Type>
349 template<
typename Type>
352 constexpr static bool value =
false;
355 template<
template<
auto...>
class ContainerType,
auto... Ints>
364 template<
typename Type>
367 template<
typename Type>
370 template<
typename Type>
373 if constexpr(is_tag_type_v<Type>)
375 if constexpr(std::is_rvalue_reference_v<
decltype(arg)>)
376 return std::move(arg.value);
381 return std::forward<Type>(arg);
387 template<
typename Type, auto Tag,
bool = false>
393 template<
typename Type, auto Tag>
399 template<
typename Type, auto Tag>
406 template<
typename Type, auto Tag>
409 template <
class TargetType,
class _Ty>
410 [[nodiscard]]
constexpr std::enable_if_t<std::is_same_v<std::remove_reference_t<TargetType>,
411 std::remove_reference_t<_Ty>>, _Ty&&>
415 return static_cast<_Ty&&
>(_Arg);
418 template <
class TargetType,
class _Ty>
419 [[nodiscard]]
constexpr std::enable_if_t< !std::is_same_v<std::remove_reference_t<TargetType>,
420 std::remove_reference_t<_Ty>>, TargetType>
424 return static_cast<TargetType
>(_Arg);
427 template <
class TargetType,
class _Ty>
428 [[nodiscard]]
constexpr std::enable_if_t< std::is_same_v<std::remove_reference_t<TargetType>,
429 std::remove_reference_t<_Ty>>, _Ty&&>
433 static_assert(!std::is_lvalue_reference_v<_Ty>,
"bad forward call");
434 return static_cast<_Ty&&
>(_Arg);
437 template <
class TargetType,
class _Ty>
438 [[nodiscard]]
constexpr std::enable_if_t< !std::is_same_v<std::remove_reference_t<TargetType>,
439 std::remove_reference_t<_Ty>>, TargetType>
443 return static_cast<TargetType
>(_Arg);
446 template <
class TargetType,
class _Ty>
447 [[nodiscard]]
constexpr std::enable_if_t< std::is_same_v<std::remove_reference_t<TargetType>,
448 std::remove_reference_t<_Ty>>, std::remove_reference_t<_Ty>&&>
452 return static_cast<std::remove_reference_t<_Ty>&&
>(_Arg);
455 template <
class TargetType,
class _Ty>
456 [[nodiscard]]
constexpr std::enable_if_t< !std::is_same_v<std::remove_reference_t<TargetType>,
457 std::remove_reference_t<_Ty>>, TargetType>
461 return static_cast<TargetType
>(_Arg);
464 template<auto N,
typename T,
typename Deleter>
465 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>& uptr)
noexcept
467 return reinterpret_cast<T(&)[N]
>(uptr[0]);
470 template<auto N,
typename T,
typename Deleter>
471 inline auto&
cast_ref(std::index_sequence<N>, std::unique_ptr<T[], Deleter>& uptr)
noexcept
473 return reinterpret_cast<T(&)[N]
>(uptr[0]);
476 template<auto N,
typename T,
typename Deleter>
477 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
479 return reinterpret_cast<const T(&)[N]
>(uptr[0]);
482 template<auto N,
typename T,
typename Deleter>
483 inline auto&
cast_ref(std::index_sequence<N>, std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
485 return reinterpret_cast<const T(&)[N]
>(uptr[0]);
489 template<auto N1, auto N2,
typename T,
typename Deleter>
490 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>& uptr)
noexcept
492 return reinterpret_cast<T(&)[N1][N2]
>(uptr[0]);
495 template<auto N1, auto N2,
typename T,
typename Deleter>
496 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::unique_ptr<T[], Deleter>& uptr)
noexcept
498 return reinterpret_cast<T(&)[N1][N2]
>(uptr[0]);
501 template<auto N1, auto N2,
typename T,
typename Deleter>
502 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
504 return reinterpret_cast<const T(&)[N1][N2]
>(uptr[0]);
507 template<auto N1, auto N2,
typename T,
typename Deleter>
508 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
510 return reinterpret_cast<const T(&)[N1][N2]
>(uptr[0]);
513 template<auto N1, auto N2, auto N3,
typename T,
typename Deleter>
514 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>& uptr)
noexcept
516 return reinterpret_cast<T(&)[N1][N2][N3]
>(uptr[0]);
519 template<auto N1, auto N2, auto N3,
typename T,
typename Deleter>
520 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::unique_ptr<T[], Deleter>& uptr)
noexcept
522 return reinterpret_cast<T(&)[N1][N2][N3]
>(uptr[0]);
525 template<auto N1, auto N2, auto N3,
typename T,
typename Deleter>
526 inline auto&
cast_ref(std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
528 return reinterpret_cast<const T(&)[N1][N2][N3]
>(uptr[0]);
531 template<auto N1, auto N2, auto N3,
typename T,
typename Deleter>
532 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::unique_ptr<T[], Deleter>
const& uptr)
noexcept
534 return reinterpret_cast<const T(&)[N1][N2][N3]
>(uptr[0]);
539 template<
auto N1,
auto N2,
typename T,
auto N,
540 typename = std::enable_if_t<N1* N2 == N>>
543 using array2_t = T[N1][N2];
544 return reinterpret_cast<array2_t&
>(array[0]);
547 template<
auto N1,
auto N2,
typename T,
auto N,
548 typename = std::enable_if_t<N1* N2 == N>>
549 inline auto&
cast_ref(std::index_sequence<N1, N2>, T(&array)[N])
noexcept
551 using array2_t = T[N1][N2];
552 return reinterpret_cast<array2_t&
>(array[0]);
555 template<auto N1, auto N2,
typename T, auto N = N1 * N2>
558 using array_t = T[N];
559 return reinterpret_cast<array_t&
>(array[0][0]);
562 template<auto N1, auto N2,
typename T, auto N = N1 * N2>
563 inline auto&
cast_ref(std::index_sequence<N1, N2>, T(&array)[N1][N2])
noexcept
565 using array_t = T[N];
566 return reinterpret_cast<array_t&
>(array[0][0]);
569 template<
auto N1,
auto N2,
auto N3,
typename T,
auto N,
570 typename = std::enable_if_t<N1* N2* N3 == N>>
573 using array3_t = T[N1][N2][N3];
574 return reinterpret_cast<array3_t&
>(array[0]);
577 template<
auto N1,
auto N2,
auto N3,
typename T,
auto N,
578 typename = std::enable_if_t<N1* N2* N3 == N>>
579 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, T(&array)[N])
noexcept
581 using array3_t = T[N1][N2][N3];
582 return reinterpret_cast<array3_t&
>(array[0]);
585 template<auto N1, auto N2, auto N3,
typename T, auto N = N1 * N2* N3>
586 inline auto&
cast_ref(T(&array)[N1][N2][N3])
noexcept
588 using array_t = T[N];
589 return reinterpret_cast<array_t&
>(array[0][0][0]);
592 template<auto N1, auto N2, auto N3,
typename T, auto N = N1 * N2* N3>
593 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, T(&array)[N1][N2][N3])
noexcept
595 using array_t = T[N];
596 return reinterpret_cast<array_t&
>(array[0][0][0]);
599 template<
auto N,
typename T,
600 typename = std::enable_if_t<std::is_pointer_v<T>>>
603 using ele_t = std::remove_pointer_t<T>;
605 using array_t = ele_t[N];
606 return reinterpret_cast<array_t&
>(array[0]);
609 template<
auto N1,
auto N2,
typename T,
610 typename = std::enable_if_t<std::is_pointer_v<T>>>
613 using ele_t = std::remove_pointer_t<T>;
615 using array_t = ele_t[N1][N2];
616 return reinterpret_cast<array_t&
>(array[0]);
619 template<
auto N1,
auto N2,
auto N3,
typename T,
620 typename = std::enable_if_t<std::is_pointer_v<T>>>
623 using ele_t = std::remove_pointer_t<T>;
625 using array_t = ele_t[N1][N2][N3];
626 return reinterpret_cast<array_t&
>(array[0]);
629 template<
auto N,
typename T,
630 typename = std::enable_if_t<std::is_pointer_v<T>>>
631 inline auto&
cast_ref(std::index_sequence<N>, T array)
noexcept
633 using ele_t = std::remove_pointer_t<T>;
634 using array_t = ele_t[N];
635 return reinterpret_cast<array_t&
>(array[0]);
638 template<
auto N1,
auto N2,
typename T,
639 typename = std::enable_if_t<std::is_pointer_v<T>>>
640 inline auto&
cast_ref(std::index_sequence<N1, N2>, T array)
noexcept
642 using ele_t = std::remove_pointer_t<T>;
643 using array_t = ele_t[N1][N2];
644 return reinterpret_cast<array_t&
>(array[0]);
647 template<
auto N1,
auto N2,
auto N3,
typename T,
648 typename = std::enable_if_t<std::is_pointer_v<T>>>
649 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, T array)
noexcept
651 using ele_t = std::remove_pointer_t<T>;
653 using array_t = ele_t[N1][N2][N3];
654 return reinterpret_cast<array_t&
>(array[0]);
657 template<std::size_t N1,
typename T, std::size_t N,
658 typename = std::enable_if_t<N1 == N>>
659 inline auto&
cast_ref(std::array<T, N>& array)
noexcept
661 using c_array_t = T[N];
662 return reinterpret_cast<c_array_t&
>(array[0]);
665 template<std::size_t N1,
typename T, std::size_t N,
666 typename = std::enable_if_t<N1 == N>>
667 inline auto&
cast_ref(std::array<T, N>
const& array)
noexcept
669 using c_array_t =
const T[N];
670 return reinterpret_cast<c_array_t&
>(array[0]);
673 template<std::size_t N1, std::size_t N2,
typename T, std::size_t N,
674 typename = std::enable_if_t< N1 * N2 == N>>
675 inline auto&
cast_ref(std::array<T, N>& array)
noexcept
677 using c_array_t = T[N1][N2];
678 return reinterpret_cast<c_array_t&
>(array[0]);
681 template<std::size_t N1, std::size_t N2,
typename T, std::size_t N,
682 typename = std::enable_if_t< N1 * N2 == N>>
683 inline auto&
cast_ref(std::array<T, N>
const& array)
noexcept
685 using c_array_t =
const T[N1][N2];
686 return reinterpret_cast<c_array_t&
>(array[0]);
689 template<std::size_t N1,
typename T, std::size_t N,
690 typename = std::enable_if_t< N1 == N>>
691 inline auto&
cast_ref(std::index_sequence<N1>, std::array<T, N>& array)
noexcept
693 using c_array_t = T[N1];
694 return reinterpret_cast<c_array_t&
>(array[0]);
697 template<std::size_t N1,
typename T, std::size_t N,
698 typename = std::enable_if_t< N1 == N>>
699 inline auto&
cast_ref(std::index_sequence<N1>, std::array<T, N>
const& array)
noexcept
701 using c_array_t =
const T[N1];
702 return reinterpret_cast<c_array_t&
>(array[0]);
705 template<std::size_t N1, std::size_t N2,
typename T, std::size_t N,
706 typename = std::enable_if_t< N1 * N2 == N>>
707 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::array<T, N>& array)
noexcept
709 using c_array_t = T[N1][N2];
710 return reinterpret_cast<c_array_t&
>(array[0]);
713 template<std::size_t N1, std::size_t N2,
typename T, std::size_t N,
714 typename = std::enable_if_t< N1 * N2 == N>>
715 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::array<T, N>
const& array)
noexcept
717 using c_array_t =
const T[N1][N2];
718 return reinterpret_cast<c_array_t&
>(array[0]);
721 template<std::size_t N1, std::size_t N2, std::size_t N3,
typename T, std::size_t N,
722 typename = std::enable_if_t< N1 * N2 * N3 == N>>
723 inline auto&
cast_ref(std::array<T, N>& array)
noexcept
725 using c_array_t = T[N1][N2][N3];
726 return reinterpret_cast<c_array_t&
>(array[0]);
729 template<std::size_t N1, std::size_t N2, std::size_t N3,
typename T, std::size_t N,
730 typename = std::enable_if_t< N1 * N2 * N3 == N>>
731 inline auto&
cast_ref(std::array<T, N>
const& array)
noexcept
733 using c_array_t =
const T[N1][N2][N3];
734 return reinterpret_cast<c_array_t&
>(array[0]);
737 template<std::size_t N1, std::size_t N2, std::size_t N3,
typename T, std::size_t N,
738 typename = std::enable_if_t< N1 * N2 * N3 == N>>
739 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::array<T, N>& array)
noexcept
741 using c_array_t = T[N1][N2][N3];
742 return reinterpret_cast<c_array_t&
>(array[0]);
745 template<std::size_t N1, std::size_t N2, std::size_t N3,
typename T, std::size_t N,
746 typename = std::enable_if_t< N1 * N2 * N3 == N>>
747 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::array<T, N>
const& array)
noexcept
749 using c_array_t =
const T[N1][N2][N3];
750 return reinterpret_cast<c_array_t&
>(array[0]);
755 template<std::
size_t N,
typename T>
756 inline auto&
cast_ref(std::vector<T>& vctr)
noexcept
758 assert(N == vctr.size());
760 using c_array_t = T[N];
761 return reinterpret_cast<c_array_t&
>(vctr[0]);
764 template<std::
size_t N,
typename T>
765 inline auto&
cast_ref(std::vector<T>
const& vctr)
noexcept
767 assert(N == vctr.size());
769 using c_array_t =
const T[N];
770 return reinterpret_cast<c_array_t&
>(vctr[0]);
773 template<std::
size_t N,
typename T>
774 inline auto&
cast_ref(std::index_sequence<N>, std::vector<T>& vctr)
noexcept
776 assert(N == vctr.size());
778 using c_array_t = T[N];
779 return reinterpret_cast<c_array_t&
>(vctr[0]);
782 template<std::
size_t N,
typename T>
783 inline auto&
cast_ref(std::index_sequence<N>, std::vector<T>
const& vctr)
noexcept
785 assert(N == vctr.size());
787 using c_array_t =
const T[N];
788 return reinterpret_cast<c_array_t&
>(vctr[0]);
791 template<std::
size_t N1, std::
size_t N2,
typename T>
792 inline auto&
cast_ref(std::vector<T>& vctr)
noexcept
794 assert(N1 * N2 == vctr.size());
796 using c_array_t = T[N1][N2];
797 return reinterpret_cast<c_array_t&
>(vctr[0]);
800 template<std::
size_t N1, std::
size_t N2,
typename T>
801 inline auto&
cast_ref(std::vector<T>
const& vctr)
noexcept
803 assert(N1 * N2 == vctr.size());
805 using c_array_t =
const T[N1][N2];
806 return reinterpret_cast<c_array_t&
>(vctr[0]);
809 template<std::
size_t N1, std::
size_t N2,
typename T>
810 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::vector<T>& vctr)
noexcept
812 assert(N1 * N2 == vctr.size());
814 using c_array_t = T[N1][N2];
815 return reinterpret_cast<c_array_t&
>(vctr[0]);
818 template<std::
size_t N1, std::
size_t N2,
typename T>
819 inline auto&
cast_ref(std::index_sequence<N1, N2>, std::vector<T>
const& vctr)
noexcept
821 assert(N1 * N2 == vctr.size());
823 using c_array_t =
const T[N1][N2];
824 return reinterpret_cast<c_array_t&
>(vctr[0]);
827 template<std::
size_t N1, std::
size_t N2, std::
size_t N3,
typename T>
828 inline auto&
cast_ref(std::vector<T>& vctr)
noexcept
830 assert(N1 * N2 * N3 == vctr.size());
832 using c_array_t = T[N1][N2][N3];
833 return reinterpret_cast<c_array_t&
>(vctr[0]);
836 template<std::
size_t N1, std::
size_t N2, std::
size_t N3,
typename T>
837 inline auto&
cast_ref(std::vector<T>
const& vctr)
noexcept
839 assert(N1 * N2 * N3 == vctr.size());
841 using c_array_t =
const T[N1][N2][N3];
842 return reinterpret_cast<c_array_t&
>(vctr[0]);
845 template<std::
size_t N1, std::
size_t N2, std::
size_t N3,
typename T>
846 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::vector<T>& vctr)
noexcept
848 assert(N1 * N2 * N3 == vctr.size());
850 using c_array_t = T[N1][N2][N3];
851 return reinterpret_cast<c_array_t&
>(vctr[0]);
854 template<std::
size_t N1, std::
size_t N2, std::
size_t N3,
typename T>
855 inline auto&
cast_ref(std::index_sequence<N1, N2, N3>, std::vector<T>
const& vctr)
noexcept
857 assert(N1 * N2 * N3 == vctr.size());
859 using c_array_t =
const T[N1][N2][N3];
860 return reinterpret_cast<c_array_t&
>(vctr[0]);
863 template<
size_t N1,
size_t N2,
typename T,
size_t N,
864 typename = std::enable_if_t<N1* N2 == N>>
867 using array_t = T[N1][N2];
868 return *
reinterpret_cast<array_t*
>(array);
871 template<
size_t N1,
size_t N2,
typename T,
size_t N = N1 * N2>
874 using array_t = T[N];
875 return *
reinterpret_cast<array_t*
>(array);
878 template<
size_t N1,
size_t N2,
size_t N3,
typename T,
size_t N,
879 typename = std::enable_if_t<N1* N2* N3 == N>>
882 using array_t = T[N1][N2][N3];
883 return *
reinterpret_cast<array_t*
>(array);
886 template<
size_t N1,
size_t N2,
size_t N3,
typename T,
size_t N = N1 * N2* N3>
889 using array_t = T[N];
890 return *
reinterpret_cast<array_t*
>(array);
893 template<
typename T,
size_t N>
896 using c_array_t = T[N];
897 return *
reinterpret_cast<c_array_t*
>(array.data());
900 template<
typename T,
size_t N>
901 inline auto cast_array(std::array<T, N>
const& array)
noexcept
903 using c_array_t =
const T[N];
904 return *
reinterpret_cast<c_array_t*
>(array.data());
907 template<
size_t N1,
size_t N2,
typename T,
size_t N,
908 typename = std::enable_if_t< N1 * N2 == N>>
911 using c_array_t = T[N1][N2];
912 return *
reinterpret_cast<c_array_t*
>(array.data());
915 template<
size_t N1,
size_t N2,
typename T,
size_t N,
916 typename = std::enable_if_t< N1 * N2 == N>>
917 inline auto cast_array(std::array<T, N>
const& array)
noexcept
919 using c_array_t =
const T[N1][N2];
920 return *
reinterpret_cast<c_array_t*
>(array.data());
923 template<
size_t N1,
size_t N2,
size_t N3,
typename T,
size_t N,
924 typename = std::enable_if_t< N1 * N2 * N3 == N>>
927 using c_array_t = T[N1][N2][N3];
928 return *
reinterpret_cast<c_array_t*
>(array.data());
931 template<
size_t N1,
size_t N2,
size_t N3,
typename T,
size_t N,
932 typename = std::enable_if_t< N1 * N2 * N3 == N>>
933 inline auto cast_array(std::array<T, N>
const& array)
noexcept
935 using c_array_t = T[N1][N2][N3];
936 return *
reinterpret_cast<c_array_t*
>(array.data());
940 template<
auto Index,
typename... ArgTypes,
944 auto arguments = std::forward_as_tuple( std::forward<ArgTypes>(args)... );
946 using element_t =
decltype(std::get<Index>(arguments));
948 return std::forward<element_t>(std::get<Index>(arguments));
959 template<
typename T,
size_t Size>
962 template<
typename Type, auto Size>
967 template<
typename Type>
970 static constexpr bool value =
false;
973 template<
typename Type,
typename... Types>
979 template<
typename Type>
982 static constexpr bool value =
false;
985 template<
typename Type,
auto... Indices>
991 template<
typename Type>
997 static constexpr bool value =
false;
1000 template<
typename... Ts>
1006 template<
typename T>
1009 template<
typename T>
1015 template<
template<
typename...>
class TemplateType,
typename... Types>
1021 template<
typename T>
1027 template<
typename Type>
1030 template<
typename Type>
1033 template<
typename T>
1036 template<
typename T>
1044 template<
typename... Types>
1052 template<
typename... Types>
1060 template<
typename... Types>
1065 template<
template<
typename...>
class TemplateType>
1068 template<
template<
typename T,
auto...>
class TemplateType>
1071 template<
template<
auto...>
class TemplateType>
1074 template<
template<
auto,
typename...>
class TemplateType>
1082 template<
typename Type>
1088 template<
template<
typename...>
class TemplateType,
typename... Types>
1094 template<
template<
typename T,
auto...>
class TemplateType,
typename T, T... args>
1100 template<
template<
auto...>
class TemplateType,
auto... args>
1106 template<
template<
auto,
typename...>
class TemplateType,
auto arg,
typename... Types>
1112 template<
typename Type>
1117 template<
typename Type>
1122 template<
typename... Types>
1125 using type = std::tuple< std::vector<Types>... >;
1128 template<
typename... Types>
1131 using type = std::tuple<std::vector<Types>... >;
1134 template<
template<
typename...>
class CntrType,
typename... Types>
1137 using type = std::tuple< std::vector<Types>... >;
1140 template<
typename TupleType>
1143 template<
typename... Types>
1149 template<
typename TupleType>
1152 template<
typename TypeList>
1155 template<
typename... Types>
1161 template<
typename TypeList>
1164 template<
typename TupleType>
1167 template<
typename... Types>
1173 template<
typename VarType>
1179 template<
typename TupleType>
1182 template<
typename TypeList>
1185 template<
typename VarType>
1188 template<
typename... Types>
1193 template<std::size_t ...I>
1196 using type = std::vector<std::size_t>;
1201 template<std::size_t ...Is>
1204 using type = std::tuple<typename st_vector<Is>::type...>;
1210 template<std::
size_t N>
1213 template<
typename Po
interType,
typename SizeType>
1219 template<
typename ElementType,
size_t ElementCount>
1221 std::pair<ElementType*, size_t>{array, ElementCount} { }
1224 template<
typename ElementType,
size_t ElementCount>
1227 template<
typename ElementType,
size_t ElementSize>
1233 template<
typename Type>
1236 template<
typename Type>
1237 constexpr bool is_array_v = std::is_array_v<remove_cv_ref_t<Type>>;
1239 template<
typename ElementType,
size_t ElementSize>
1240 constexpr size_t array_size(ElementType(&array)[ElementSize])
noexcept {
return (
size_t) ElementSize; }
1243 template<
typename ContainerType>
class reverse_st;
1244 template<
typename ContainerType>
auto reverse(ContainerType&& container);
1245 template<
typename ElementType,
size_t ElementCount>
auto reverse(ElementType(&array)[ElementCount]);
1247 template<
typename Type,
typename... Types>
auto reverse(Type&& arg, Types&&... args);
1248 template<
typename Type,
typename... Types>
auto make_vector(Type&& arg, Types&&... args);
1251 template<
template<
typename, std::
size_t>
class ContainerType,
1252 typename ArgType,
typename... ArgTypes>
1255 template<
template<
typename, std::
size_t>
class ContainerType,
1256 typename ArgType,
typename... ArgTypes>
1259 template<
typename ContainerType,
typename IndexType>
1260 decltype(
auto)
get_element(ContainerType container, IndexType index);
1262 #if !defined(__clang_major__)
1263 template<
typename Type,
typename... Types>
auto make_variants(Type&& arg, Types&&... args);
1266 template<
typename Type>
1269 using type = std::remove_reference_t<Type>;
1271 if constexpr(std::is_array_v<type> || std::is_function_v<type>)
1274 return std::forward<Type>(arg);
1279 template<
typename Type>
1290 template<
typename Type>
1297 const char* to_str =
"struct tpf::types::hidden::st_dummy_type_container<";
1299 std::size_t len = strlen(to_str);
1301 auto pos = fname.find(to_str);
1303 if(pos != fname.npos)
1304 fname = fname.substr(pos + len);
1311 to_str =
" __ptr64"; len = strlen(to_str);
1312 while( (pos = fname.find(to_str)) != fname.npos)
1313 fname.erase(pos, len);
1315 to_str =
" __ptr32"; len = strlen(to_str);
1316 while( (pos = fname.find(to_str)) != fname.npos)
1317 fname.erase(pos, len);
1319 to_str =
"enum class"; len = strlen(to_str);
1320 while( (pos = fname.find(to_str)) != fname.npos)
1321 fname.erase(pos, len);
1323 to_str =
"enum"; len = strlen(to_str);
1324 while( (pos = fname.find(to_str)) != fname.npos)
1325 fname.erase(pos, len);
1327 to_str =
"class"; len = strlen(to_str);
1328 while( (pos = fname.find(to_str)) != fname.npos)
1329 fname.erase(pos, len);
1331 to_str =
"struct"; len = strlen(to_str);
1332 while( (pos = fname.find(to_str)) != fname.npos)
1333 fname.erase(pos, len);
1335 while(fname.back() ==
' ') fname.pop_back();
1340 #elif defined(__FUNCSIG__)
1341 std::string fname(__FUNCSIG__);
1342 const char* to_str =
"to_string<";
1343 size_t len = strlen(to_str);
1344 auto pos = fname.find(
"to_string<");
1345 fname = fname.substr(pos+len);
1346 fname = fname.substr(0, fname.find_last_of(
'>'));
1350 to_str =
" __ptr64"; len = strlen(to_str);
1351 while( (pos = fname.find(to_str)) != fname.npos)
1352 fname.erase(pos, len);
1354 to_str =
" __ptr32"; len = strlen(to_str);
1355 while( (pos = fname.find(to_str)) != fname.npos)
1356 fname.erase(pos, len);
1358 to_str =
"enum class"; len = strlen(to_str);
1359 while( (pos = fname.find(to_str)) != fname.npos)
1360 fname.erase(pos, len);
1362 to_str =
"enum"; len = strlen(to_str);
1363 while( (pos = fname.find(to_str)) != fname.npos)
1364 fname.erase(pos, len);
1366 to_str =
"class"; len = strlen(to_str);
1367 while( (pos = fname.find(to_str)) != fname.npos)
1368 fname.erase(pos, len);
1370 to_str =
"struct"; len = strlen(to_str);
1371 while( (pos = fname.find(to_str)) != fname.npos)
1372 fname.erase(pos, len);
1374 while(fname.back() ==
' ') fname.pop_back();
1379 std::string fname(__PRETTY_FUNCTION__);
1381 #ifdef __clang_major__
1382 const char* ftext =
"[Type = ";
1383 auto pos = fname.find(ftext) + strlen(ftext);
1384 fname = fname.substr(pos);
1388 #elif defined(__ICL)
1389 const char* ftext =
"type_to_string<";
1390 auto pos = fname.find(ftext) + strlen(ftext);
1391 fname = fname.substr(pos);
1392 pos = fname.find_last_of(
'>');
1393 return fname.substr(0, pos);
1395 const char* ftext =
"[with Type = ";
1396 auto pos = fname.find(ftext) + strlen(ftext);
1397 fname = fname.substr(pos);
1398 pos = fname.find_first_of(
';');
1399 return fname.substr(0, pos);
1409#define Tpf_DebugException(debug_message) tpf::debug_exception{debug_message, __LINE__, __FILE__}
1416#define Tpf_ThrowDebugException(debug_message) throw tpf::debug_exception{debug_message, __LINE__, __FILE__}
1422#define Tpf_GetTypeName(type_arg) tpf::types::type_to_string<type_arg>()
1428#define Tpf_GetTypeCategory(instance_arg) Tpf_GetTypeName(decltype(instance_arg))
1434#define Tpf_GetValueCategory(instance_arg) Tpf_GetTypeName(decltype((instance_arg)))
1438 template<
typename Type>
1449 template<
typename Type>
1452 os <<
"<" << r.
begin<<
", " << r.
end <<
">";
return os;
1455 template<
typename Type>
1458 template<
typename Type>
1469 template<
typename IndexType,
typename ContainerType,
1471 typename iterator_type =
typename container_t::iterator>
1474 template<
typename IndexType,
typename ContainerType,
1476 typename reverse_iterator_type =
typename container_t::reverse_iterator>
1479 template<
typename ContainerType,
1481 typename iterator_type =
typename container_t::iterator>
1484 template<
typename ContainerType,
1486 typename reverse_iterator_type =
typename container_t::reverse_iterator>
1489 template<
typename ReverseIteratorType,
1490 typename reverse_iterator_type = std::remove_reference_t<ReverseIteratorType>>
1493 return itr.base() - 1;
1496 template<
typename IteratorType,
1497 typename iterator_type = std::remove_reference_t<IteratorType>>
1500 return std::make_reverse_iterator(std::forward<IteratorType>(itr));
1504 typename ContainerType = std::vector<int>,
1506 typename iterator_type =
typename container_t::iterator,
1507 typename reverse_iterator_type =
typename container_t::reverse_iterator>
1511 typename ContainerType = std::vector<int>,
1513 typename iterator_type =
typename container_t::iterator,
1514 typename reverse_iterator_type =
typename container_t::reverse_iterator,
1515 typename execution_policy_type = std::execution::parallel_unsequenced_policy>
1516 auto make_rotator(ContainerType&& cntr, execution_policy_type policy);
1518 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1520 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1522 auto range = std::equal_range(first, last, value, std::forward<CompareCallbackType>(compare_callback));
1527 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1529 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1531 auto range = std::equal_range(first, last, value, std::forward<CompareCallbackType>(compare_callback));
1534 std::distance(first,
range.first), std::distance(first,
range.second));
1537 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1538 typename CompareCallbackType = std::less<>>
1540 CompareCallbackType&& compare_callback = CompareCallbackType{})
1543 value, std::forward<CompareCallbackType>(compare_callback));
1546 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1547 typename CompareCallbackType = std::less<>>
1549 CompareCallbackType&& compare_callback = CompareCallbackType{})
1552 value, std::forward<CompareCallbackType>(compare_callback));
1555 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1557 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1559 auto start = std::lower_bound(first, last, value, compare_callback);
1561 return start != last && !compare_callback(value, *start) ? start : last;
1564 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1566 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1568 auto start = std::lower_bound(first, last, value, compare_callback);
1570 auto iterator = (start != last && !compare_callback(value, *start)) ? start : last;
1572 return (iterator != last) ?
1573 std::distance(first, iterator) :
std::distance(first, last);
1576 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1577 typename CompareCallbackType = std::less<>>
1579 CompareCallbackType&& compare_callback = CompareCallbackType{})
1582 std::forward<CompareCallbackType>(compare_callback));
1585 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1587 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1590 std::forward<CompareCallbackType>(compare_callback));
1592 return (iterator != last) ?
1593 std::make_pair(
true, iterator) :
std::make_pair(false, iterator);
1596 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1597 typename CompareCallbackType = std::less<>>
1599 CompareCallbackType&& compare_callback = CompareCallbackType{})
1602 std::forward<CompareCallbackType>(compare_callback));
1605 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1606 typename CompareCallbackType = std::less<> >
1608 CompareCallbackType&& compare_callback = CompareCallbackType{})
1611 std::forward<CompareCallbackType>(compare_callback));
1614 template<
typename ForwardIterator,
typename EleType,
typename CompareCallbackType = std::less<>>
1616 const EleType& value, CompareCallbackType&& compare_callback = CompareCallbackType{})
1618 auto start = std::lower_bound(first, last, value, compare_callback);
1620 auto iterator = (start != last && !compare_callback(value, *start)) ? start : last;
1622 return (iterator != last) ?
1623 std::make_pair(
true, std::distance(first, iterator)) :
1624 std::make_pair(false,
std::distance(first, iterator));
1627 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types,
1628 typename CompareCallbackType = std::less<>>
1630 CompareCallbackType&& compare_callback = CompareCallbackType{})
1633 std::forward<CompareCallbackType>(compare_callback));
1645 static constexpr bool Left =
false;
1648 static constexpr bool Or =
false;
1649 static constexpr bool And =
true;
1651 static constexpr bool No =
false;
1652 static constexpr bool Yes =
true;
1672 template<
auto FuncType,
typename... ArgTypes>
1677 template<
typename Type>
1683 template<
typename... Types>
1689 template<
typename Type>
1692 template<
typename Type>
1698 template<
typename Type,
typename... Types>
1704 template<
typename Type>
1707 template<
typename Type>
1713 template<
typename Type_1,
typename Type_2>
1719 template<
typename Type>
1723 template<
typename Type>
1729 template<
typename Type,
typename... Types>
1735 template<
typename Type>
1739 template<
typename Type>
1746 template<
typename KeyType,
typename ValueType,
typename... Types>
1749 using type = std::pair<KeyType, ValueType>;
1753 template<
typename KeyType,
typename ValueType,
typename... Types>
1756 using type = std::pair<KeyType, ValueType>;
1760 template<
typename Type>
1763 template<
typename Type>
1766 template<
typename Type>
1773 template<
typename Type,
typename... Types>
1780 template<
typename Type,
typename... Types>
1787 template<
typename Type>
1790 template<
typename Type>
1804 template<
typename Type,
typename... Types>
1811 template<
typename Type>
1814 template<
typename Type>
1817 template<
typename Type>
1829 template<
typename Type>
1832 template<
typename Type>
1838 template<
typename Type,
typename... Types>
1844 template<
typename Type,
typename... Types>
1850 template<
typename Type>
1853 template<
typename Type>
1871 template<
typename Type>
1877 template<
typename Type>
1880 template<
typename Type>
1883 template<
typename Type>
1886 template<
typename Type>
1889 template<
typename Type>
1892 template<
typename Type>
1893 constexpr auto is_tuple_v = hidden::is_tuple_v<remove_cvref_t<Type>>;
1895 template<
typename Type>
1900 template<
typename Type>
1906 template<
typename Type,
typename... ArgTypes>
1909 static constexpr size_t value = 1 +
sizeof...(ArgTypes);
1912 template<
typename Type>
1917 template<
typename Type>
1920 template<
typename Type>
1923 template<
typename Type>
1926 template<
typename Type>
1929 template<
typename Type>
1932 template<
typename Type>
1937 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
1942 using set_t = ContainerType<EleType, Types...>;
1943 using sets_t = ContainerType<ContainerType<EleType, Types...>>;
1944 using set_of_sets_t = ContainerType<ContainerType<ContainerType<EleType, Types...>>>;
1945 using sets_of_sets_t = ContainerType<ContainerType<ContainerType<ContainerType<EleType, Types...>>>>;
1962 template<
typename SetTagType = set_tag<std::vector,
int>>
1965 template<
typename SetTagType = set_tag<std::vector,
int>>
1968 template<
typename SetTagType = set_tag<std::vector,
int>>
1971 template<
typename SetTagType = set_tag<std::vector,
int>>
1974 template<
typename SetTagType = set_tag<std::vector,
int>>
1977 template<
typename SetTagType = set_tag<std::vector,
int>>
1980 template<
typename SetTagType = set_tag<std::vector,
int>>
1983 template<
typename SetTagType = set_tag<std::vector,
int>>
1986 template<
typename SetTagType = set_tag<std::vector,
int>>
1989 template<
typename SetTagType = set_tag<std::vector,
int>>
1992 template<
typename SetTagType = set_tag<std::vector,
int>>
1995 template<
typename SetTagType = set_tag<std::vector,
int>>
1998 template<
typename SetTagType = set_tag<std::vector,
int>>
2001 template<
typename SetTagType = set_tag<std::vector,
int>>
2004 template<
typename SetTagType = set_tag<std::vector,
int>>
2007 template<
typename SetTagType = set_tag<std::vector,
int>>
2026 template<
typename Type>
2029 template<
typename CharType>
2030 std::basic_ostream<CharType>&
2033 os <<
"invalid";
return os;
2036 template<
typename CharType>
2037 std::basic_ostream<CharType>&
2040 os <<
"no_type_t";
return os;
2045 template<
typename T,
typename S>
2049 template<
typename T,
typename S>
2051 !is_no_type_v<decltype(addition_vaild_fn(std::declval<T>(), std::declval<S>()))>;
2053 template<
typename T,
typename S>
2057 template<
typename T,
typename S>
2059 !is_no_type_v<decltype(subtraction_vaild_fn(std::declval<T>(), std::declval<S>()))>;
2061 template<
typename T,
typename S>
2065 template<
typename T,
typename S>
2067 !is_no_type_v<decltype(multiplication_vaild_fn(std::declval<T>(), std::declval<S>()))>;
2069 template<
typename T,
typename S>
2073 template<
typename T,
typename S>
2075 !is_no_type_v<decltype(division_vaild_fn(std::declval<T>(), std::declval<S>()))>;
2077 template<
typename T,
typename S>
2079 && is_multiplication_valid_v<T, S> && is_division_valid_v<T, S>;
2083 template<
typename T,
typename S>
2087 template<
typename T,
typename S>
2091 template<
typename T,
typename S>
2095 template<
typename T,
typename S>
2099 template<
typename T,
typename S>
2117 template<
typename Type>
2123 template<
typename Type>
2126 template<
typename Type>
2137 template<
typename T>
2138 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
bool>
2141 template<
typename T>
2142 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
bool>
2145 template<
typename T>
2146 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2149 template<
typename T>
2150 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2153 template<
typename T>
2154 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2157 template<
typename T>
2158 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2161 template<
typename T>
2162 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2165 template<
typename T>
2166 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2169 template<
typename T>
2170 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2173 template<
typename T>
2174 constexpr std::enable_if_t<!is_no_type_v<remove_cvref_t<T>>,
no_type_t>
2179 template<
typename Type>
2185 template<
typename Type,
size_t Size>
2191 template<
typename Type>
2198 template<
typename Type,
size_t Size>
2207 template<
typename Type>
2210 template<
typename Type>
2213 template<
typename Type>
2217 template<
typename T, T Value>
2225 template<auto Index>
2228 template<
typename T, T RowValue, T ColumnValue>
2232 static constexpr T
Row = RowValue;
2241 template<auto RowIndex, auto ColumnIndex>
2250 template<auto RowValue, auto ColumnValue>
2253 template<
typename T, T HeightValue, T RowValue, T ColumnValue>
2259 static constexpr T
Row = RowValue;
2267 template<auto HeightIndex, auto RowIndex, auto ColumnIndex>
2276 template<auto HeightValue, auto RowValue, auto ColumnValue>
2279 template<
auto... Indices>
2285 std::make_integer_sequence<
remove_cvref_t<
decltype(Size)>, Size>;
2288 template<
auto N,
typename T, T Id, T...Ids>
2291 if constexpr(N == 0)
2297 template<
typename T, T Id, T...Ids>
2300 return std::array{ Id, Ids... };
2303 template<
typename IdType,
typename IntType, std::
size_t N>
2304 std::array<IntType, N>
2307 std::array<IntType, N> indices;
2308 IntType n = (IntType)i;
2310 for(IntType j = 0; j < (IntType)N; ++j)
2312 indices[j] = (IntType)n / powers[j];
2313 n = (IntType)n % powers[j];
2321 auto func = [](
auto a,
auto b)
2342 template<auto Begin, auto End, auto Size>
2345 using type_t =
decltype(Begin);
2347 if constexpr(Size == 0 || Size == 1)
2349 else if constexpr(Size == 2)
2353 return (End - Begin) / (type_t) (Size - 1);
2359 static constexpr T
value = std::numeric_limits<T>::max();
2362 template<
typename T, T First, T... Remainders>
2368 template<
typename T>
2374 template<
typename T, T First>
2377 static constexpr T value = First;
2380 template<
typename T, T First, T... Remainders>
2386 template<
typename T>
2392 template<
typename T, T First, T...Remainders>
2395 static constexpr T value = First;
2398 template<
auto Nth,
typename T, T First, T...Remainders>
2404 template<auto Nth,
typename SequenceType>
2410 static constexpr size_t value = std::numeric_limits<size_t>::max();
2413 template<
typename T, T... Elements>
2416 static constexpr size_t value =
sizeof...(Elements);
2419 template<
typename T>
2424 template<
typename T, T... args>
2427 using type = std::integer_sequence<T, args...>;
2430 template<
typename T, T... args1, T first, T... args2>
2432 std::integer_sequence<T, args1...>,
2433 std::integer_sequence<T, first, args2...>>
2435 using left = std::integer_sequence<T, first, args1...>;
2436 using right = std::integer_sequence<T, args2...>;
2443 template<
typename T, T... args>
2447 std::integer_sequence<T>, std::integer_sequence<T, args...> >::type;
2450 template<
typename SequenceType>
2453 template<
typename T>
2459 template<
typename T, T... Elements>
2465 template<
typename T>
2470 template<
typename T, T First>
2473 static constexpr T value = 0;
2476 template<
typename T, T First, T Second, T... Remainders>
2479 static constexpr T value = Second - First;
2482 template<
typename SequenceType>
2485 template<
typename T,
auto FirstValue,
auto LastValue,
size_t CountValue,
2491 static constexpr T
Last = LastValue;
2492 static constexpr T
End = LastValue + 1;
2493 static constexpr T
Span = compute_span<FirstValue, LastValue, (T)CountValue>();
2494 static constexpr size_t Count = CountValue;
2498 template<
typename T, auto FirstValue, auto LastValue,
size_t CountValue>
2503 static constexpr T
Last = FirstValue;
2504 static constexpr T
End = FirstValue - 1;
2505 static constexpr T
Span = compute_span<LastValue, FirstValue, (T)CountValue>();
2506 static constexpr size_t Count = CountValue;
2510 template<
bool StackOrder,
typename SequenceType>
2512 sequence_first_element_v<SequenceType>, sequence_last_element_v<SequenceType>,
2513 sequence_element_count_v<SequenceType>, StackOrder>;
2518 template<
typename SequenceType>
2521 template<
typename SequenceType>
2524 template<
typename SequenceType>
2527 template<auto Nth,
typename SequenceType>
2530 template<
typename SequenceType>
2533 template<
typename SequenceType>
2536 template<
typename SequenceType>
2539 template<
bool StackOrder,
typename SequenceType>
2544 template<
typename T, T BeginValue, T EndValue, T IncrementValue>
2553 template<
typename T, T... Indices, T Begin, T End, T Increment>
2557 if constexpr (Increment > 0)
2559 if constexpr (Begin + Increment < End)
2561 using sequence_t = std::integer_sequence<T, Indices..., Begin>;
2568 return std::integer_sequence<T, Indices..., Begin>{};
2573 if constexpr (Begin + Increment > End)
2575 using sequence_t = std::integer_sequence<T, Indices..., Begin>;
2582 return std::integer_sequence<T, Indices..., Begin>{};
2587 template<
typename T, T... Indices, T Begin, T End, T Increment>
2591 if constexpr(Increment > 0)
2593 if constexpr (Begin + Increment < End)
2595 using sequence_t = std::integer_sequence<T, Begin, Indices...>;
2602 return std::integer_sequence<T, Begin, Indices...>{};
2607 if constexpr (Begin + Increment > End)
2609 using sequence_t = std::integer_sequence<T, Begin, Indices...>;
2616 return std::integer_sequence<T, Begin, Indices...>{};
2621 template<
bool SequenceInOrder,
auto... Values>
2624 template<
bool SequenceInOrder, auto EndValue>
2630 std::conditional_t<SequenceInOrder,
2635 template<
bool SequenceInOrder, auto BeginValue, auto EndValue>
2645 std::conditional_t<SequenceInOrder,
2650 template<
bool SequenceInOrder, auto BeginValue, auto EndValue, auto IncrementValue>
2659 std::conditional_t<SequenceInOrder,
2667 template<
bool SequenceInOrder,
auto... RangeValues>
2672 auto func = [](
auto a,
auto b)
2681 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2682 auto Count = RowValue * ColumnValue,
2683 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2688 return rank.Column * indexer.Row + indexer.Column;
2692 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2693 auto Count = RowValue * ColumnValue,
2694 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2699 return rank.Column * row_index + column_index;
2704 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2705 auto Count = RowValue * ColumnValue,
2706 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2711 array[rank.Column * indexer.Row + indexer.Column] = value;
2717 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2718 auto Count = RowValue * ColumnValue,
2719 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2723 auto column_index,
auto&& value)
2725 array[rank.Column * row_index + column_index] = value;
return value;
2730 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2731 auto Count = RowValue * ColumnValue,
2732 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2737 return array[rank.Column * indexer.Row + indexer.Column];
2741 template<
auto RowValue,
auto ColumnValue,
typename ArrayType,
2742 auto Count = RowValue * ColumnValue,
2743 typename = std::enable_if_t< is_std_array_v<ArrayType> && Count == std_array_size_v<ArrayType>>>
2748 return array[rank.Column * row_index + column_index];
2752 template<
auto RowValue,
auto ColumnValue,
typename TupleType,
2753 auto Count = RowValue * ColumnValue,
2754 typename = std::enable_if_t<is_tuple_v<TupleType> && Count == tuple_size_v<TupleType>>>
2759 constexpr auto Index = rank.Column * indexer.Row + indexer.Column;
2760 return std::get<Index>(tuple);
2765 template<
auto RowValue,
auto ColumnValue,
typename TupleType,
2766 auto Count = RowValue * ColumnValue,
2767 typename = std::enable_if_t<is_tuple_v<TupleType> && Count == tuple_size_v<TupleType>>>
2772 constexpr auto Index = rank.Column * row_indexer.Index + column_indexer.Index;
2773 return std::get<Index>(tuple);
2778 template<
auto RowValue,
auto ColumnValue,
typename TupleType,
2779 auto Count = RowValue * ColumnValue,
2780 typename = std::enable_if_t<is_tuple_v<TupleType> && Count == tuple_size_v<TupleType>>>
2785 constexpr auto Index = rank.Column * indexer.Row + indexer.Column;
2786 std::get<Index>(tuple) = value;
2791 template<
auto RowValue,
auto ColumnValue,
typename TupleType,
2792 auto Count = RowValue * ColumnValue,
2793 typename = std::enable_if_t<is_tuple_v<TupleType> && Count == tuple_size_v<TupleType>>>
2797 auto column_indexer,
auto&& value)
2799 constexpr auto Index = rank.Column * row_indexer.Index + column_indexer.Index;
2800 std::get<Index>(tuple) = value;
2806 template<
typename... ArgTypes>
2812 template<
typename WorkhorseType,
auto... Indices>
2815 auto cabin =[&workhorse](
auto indexer)
2817 workhorse(indexer);
return 0;
2822 constexpr auto Size =
sizeof...(Indices) - 1;
2837 template<
typename WorkhorseType,
auto... RowIndices,
auto... ColumnIndices>
2838 std::enable_if_t<std::is_invocable_v<WorkhorseType, indexer_t<0>,
indexer_t<0>>>
2842 constexpr auto ColumnSize =
sizeof...(ColumnIndices);
2843 constexpr auto RowSize =
sizeof...(RowIndices);
2847 auto row_fixed = [&cabin, row_indexer](
auto col)
2849 cabin(row_indexer, col);
return 0;
2863 template<
typename WorkhorseType,
auto... RowIndices,
auto... ColumnIndices>
2864 std::enable_if_t<std::is_invocable_v<WorkhorseType, indexer_2d_t<0, 0>>>
2868 auto cabin_mount =[&cabin](
auto indexer_row,
auto index_column)
2873 constexpr auto ColumnSize =
sizeof...(ColumnIndices);
2874 constexpr auto RowSize =
sizeof...(RowIndices);
2885 template<
typename WorkhorseType,
2886 auto... HeightIndices,
auto... RowIndices,
auto... ColumnIndices>
2891 constexpr auto HeightSize =
sizeof...(HeightIndices);
2892 constexpr auto RowSize =
sizeof...(RowIndices);
2893 constexpr auto ColumnSize =
sizeof...(ColumnIndices);
2898 auto height_fixed = [&cabin, height_indexer](
auto row_indexer,
auto col_indexer)
2900 cabin(height_indexer, row_indexer, col_indexer);
return 0;
2916 template<
typename WorkhorseType,
2917 auto... HeightIndices,
auto... RowIndices,
auto... ColumnIndices>
2918 std::enable_if_t<std::is_invocable_v<WorkhorseType, indexer_3d_t<0, 0, 0>>>
2922 auto cabin_mount =[&cabin](
auto height_indexer,
2923 auto row_indexer,
auto column_indexer)
2928 constexpr auto HeightSize =
sizeof...(HeightIndices);
2929 constexpr auto RowSize =
sizeof...(RowIndices);
2930 constexpr auto ColumnSize =
sizeof...(ColumnIndices);
2944 template<
size_t Count,
typename WorkhorseType>
2945 std::enable_if_t<std::is_invocable_v<WorkhorseType, indexer_t<0>>>
2958 template<auto RowCount, auto ColumnCount,
typename WorkhorseType>
2960 std::is_invocable_v<WorkhorseType, indexer_t<0>, indexer_t<0>>
2961 || std::is_invocable_v<WorkhorseType, indexer_2d_t<0, 0> > >
2975 template<auto HeightCount, auto RowCount, auto ColumnCount,
typename WorkhorseType>
2976 std::enable_if_t<std::is_invocable_v<WorkhorseType, indexer_3d_t<0, 0, 0>>
2977 || std::is_invocable_v<WorkhorseType, indexer_t<0>, indexer_t<0>, indexer_t<0> > >
2986 template<
typename WorkhorseType,
auto... Indices>
2987 std::enable_if_t<std::is_invocable_v<remove_cvref_t<WorkhorseType>, indexer_t<0>>>
2993 template<
typename WorkhorseType,
auto... Indices,
2995 std::enable_if_t<std::is_invocable_v<remove_cvref_t<WorkhorseType>,
indexer_t<0>, dummy_sequence>>
3002 template<
typename TupleType,
typename WorkhorseType,
auto... Indices>
3003 std::enable_if_t< is_tuple_v<remove_cvref_t<TupleType>> &&
3004 std::is_invocable_v<remove_cvref_t<WorkhorseType>,
indexer_t<0>>>
3010 template<
typename TupleType,
typename WorkhorseType,
auto... Indices>
3011 std::enable_if_t< is_tuple_v<remove_cvref_t<TupleType>> &&
3012 std::is_invocable_v<remove_cvref_t<WorkhorseType>,
3013 indexer_t<0>, std::tuple_element_t<0, remove_cvref_t<TupleType>>>>
3021 template<
auto... RangeValues,
typename WorkhorseType,
3022 typename dummy_sequence = make_sequence_t<StackInOrder, 1>,
3023 typename sequence_info = sequence_info_t<true, dummy_sequence>>
3024 std::enable_if_t<std::is_invocable_v<remove_cvref_t<WorkhorseType>, indexer_t<0>>||
3025 std::is_invocable_v<remove_cvref_t<WorkhorseType>, indexer_t<0>, sequence_info>>
3031 template<
typename TupleType,
typename WorkhorseType,
3032 typename dummy_sequence = make_sequence_t<StackInOrder, 1>,
3033 typename sequence_info = sequence_info_t<true, dummy_sequence>>
3034 std::enable_if_t< is_tuple_v<remove_cvref_t<TupleType>> && (
3035 std::is_invocable_v<remove_cvref_t<WorkhorseType>, indexer_t<0>> ||
3036 std::is_invocable_v<remove_cvref_t<WorkhorseType>, indexer_t<0>, sequence_info> )>
3045 template<
auto... Ints,
typename FuncType>
3051 template<
auto... Ints,
typename FuncType>
3059 template<
auto... RangeValues,
typename FuncType>
3065 template<
typename... Types>
3068 constexpr long long N =
sizeof...(Types) - 1;
3080 template<
typename... Types>
3083 static constexpr size_t value =
sizeof...(Types);
3086 template<
typename... Types>
3089 static constexpr size_t value =
sizeof...(Types);
3092 template<
template<
typename...>
class TemplateType,
typename... Types>
3095 static constexpr size_t value =
sizeof...(Types);
3098 template<
typename... Types>
3105 typename std::iterator_traits<T>::value_type>
3115 template<
typename T>
3117 is_valid_type_v<decltype(iterator_value_type_fn(std::declval<T>()))>;
3119 template<
typename T>
3121 is_iterator_type_v<T> && !std::is_pointer_v<T>;
3125 template<
typename T>
3130 template<
typename Type,
typename ReturnType>
3135 template<
typename T>
3140 template<
typename T>
3147 template<
typename T>
3150 template<
typename T>
3152 hidden::is_iterator_excluding_pointer_v<remove_cv_ref_t<T>>;
3154 template<
typename Type,
typename ReturnType>
3157 template<
typename... Types>
3160 template<
typename... Types>
3177 int,
unsigned int, long,
unsigned long,
3178 long long,
unsigned long long>;
3197 int,
unsigned int, long,
unsigned long,
3198 long long,
unsigned long long>;
3205 unsigned int,
unsigned long,
unsigned long long>;
3212 int,
long int,
long long int>;
3225 int,
unsigned int, long,
unsigned long,
long long,
unsigned long long, float, double,
long double>;
3245 template<
typename Type>
3254 template<
template<
typename...>
class ContainerType,
typename...Types>
3259 static constexpr size_t count =
sizeof...(Types);
3262 template<
template<
typename,
auto...>
class ContainerType,
typename Type,
auto... Args>
3270 template<
typename Type>
3273 template<
typename Type>
3276 template<
typename Type>
3279 template<
typename Type1,
typename Type2>
3285 template<
template<
typename...>
class ContainerType,
typename... Types>
3291 template<
template<
typename,
typename...>
class ContainerType,
3292 typename Type,
typename... Types>
3298 template<
template<
typename,
typename,
typename...>
class ContainerType,
3299 typename Type1,
typename Type2,
typename... Types>
3301 ContainerType<Type1, Type2, Types...>>
3306 template<
template<
typename,
typename,
typename,
typename...>
class ContainerType,
3307 typename Type1,
typename Type2,
typename Type3,
typename... Types>
3309 ContainerType<Type1, Type2, Type3, Types...>>
3314 template<
template<
typename,
typename,
typename,
typename...>
class ContainerType,
3315 typename Type1,
typename Type2,
typename Type3,
typename Type4,
typename... Types>
3317 ContainerType<Type1, Type2, Type3, Type4, Types...>>
3322 template<
typename Type1,
typename Type2>
3325 template<
typename Type1,
typename Type2>
3331 template<
template<
typename...>
class ContainerType,
3332 typename... Types1,
typename... Types2>
3338 template<
template<
typename,
typename...>
class ContainerType,
3339 typename TypeA,
typename... TypeAs,
3340 typename TypeB,
typename... TypeBs>
3342 ContainerType<
TypeB, TypeBs...>>
3347 template<
template<
typename,
typename,
typename...>
class ContainerType,
3348 typename TypeA1,
typename TypeA2,
typename... TypeAs,
3349 typename TypeB1,
typename TypeB2,
typename... TypeBs>
3351 ContainerType<TypeB1, TypeB2, TypeBs...>>
3356 template<
template<
typename,
typename,
typename,
typename...>
class ContainerType,
3357 typename TypeA1,
typename TypeA2,
typename TypeA3,
typename... TypeAs,
3358 typename TypeB1,
typename TypeB2,
typename TypeB3,
typename... TypeBs>
3360 ContainerType<TypeB1, TypeB2, TypeB3, TypeBs...>>
3365 template<
template<
typename,
typename,
typename,
typename...>
class ContainerType,
3366 typename TypeA1,
typename TypeA2,
typename TypeA3,
typename TypeA4,
typename... TypeAs,
3367 typename TypeB1,
typename TypeB2,
typename TypeB3,
typename TypeB4,
typename... TypeBs>
3369 ContainerType<TypeB1, TypeB2, TypeB3, TypeB4, TypeBs...>>
3374 template<
typename Type1,
typename Type2>
3386 template<
typename Type>
3389 template<
typename Type>
3392 template<
typename Type>
3395 template<
typename Type1,
typename Type2>
3398 template<
typename Type1,
typename Type2>
3407 template<
typename Type>
3416 static constexpr bool value =
true;
3422 static constexpr bool value =
true;
3425 template<
typename CharType>
3431 template<
typename Type>
3445 template<
typename Type>
3454 template<
typename Type1,
typename Type2>
3456 noexcept(
noexcept(std::declval<remove_cv_ref_t<Type1>>())
3457 &&
noexcept(std::declval<remove_cv_ref_t<Type2>>())) ->
decltype(
true ? arg1 : arg2);
3461 template<typename Type1, typename Type2>
3464 template<typename Type1, typename Type2>
3468 template<typename Type>
3474 template<typename Type>
3478 template<typename Type>
3484 template<typename Type>
3488 template<typename Type>
3490 noexcept(noexcept(
std::declval<
remove_cv_ref_t<Type>>()))->decltype(arg.shrink_to_fit());
3494 template<typename Type>
3498 template<typename Type>
3504 template<typename Type>
3508 template<typename Type>
3514 template<typename Type>
3518 template<typename Type>
3524 template<typename Type>
3528 template<typename Type>
3534 template<typename Type>
3539 template<typename Type>
3545 template<typename Type>
3550 template<typename Type>
3556 template<typename Type>
3561 template<typename Type>
3567 template<typename Type>
3572 template<template<typename, typename...> class ContainerType,
3573 typename Type, typename... Types>
3575 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.
push_front(
std::declval<Type>()));
3579 template<typename Type>
3584 template<template<typename, typename...> class ContainerType,
3585 typename Type, typename... Types>
3587 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.operator[]((
size_t)1));
3591 template<typename Type>
3596 template<template<typename, typename...> class ContainerType,
3597 typename Type, typename... Types>
3599 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.
push_back(
std::declval<Type>()));
3603 template<typename Type>
3609 template<template<typename, typename...> class ContainerType,
3610 typename Type, typename... Types>
3612 ->decltype(arg.
erase(arg.cbegin()));
3616 template<typename Type>
3622 template<template<typename, typename...> class ContainerType,
3623 typename Type, typename... Types>
3625 ->decltype(arg.reserve((
size_t)0));
3629 template<typename Type>
3634 template<template<typename, typename...> class ContainerType,
3635 typename Type, typename... Types>
3637 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.insert(
std::declval<Type>()));
3641 template<typename Type>
3659 template<template<typename, typename...> class ContainerType,
3660 typename Type, typename... Types>
3662 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.insert(arg.cend(),
std::declval<Type>()));
3666 template<typename Type>
3671 template<template<typename, typename...> class ContainerType,
3672 typename Type, typename... Types>
3674 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.resize(
std::declval<
size_t>()));
3678 template<typename Type>
3683 template<template<typename, typename...> class ContainerType,
3684 typename Type, typename... Types>
3686 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.
emplace_front(
std::declval<Type>()));
3690 template<typename Type>
3695 template<template<typename, typename...> class ContainerType,
3696 typename Type, typename... Types>
3698 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.
emplace_back(
std::declval<Type>()));
3702 template<typename Type>
3708 template<template<typename, typename...> class ContainerType,
3709 typename Type, typename... Types>
3711 noexcept(noexcept(
std::declval<ContainerType<Type, Types...>>()))->decltype(arg.emplace(arg.cbegin(),
std::declval<Type>()));
3715 template<typename Type>
3721 template<typename Type>
3727 template<typename Type>
3731 template<typename Type>
3737 template<typename Type>
3743 template<typename Type>
3748 template<typename Type, typename ReturnType =
void>
3751 template<typename Type, typename... Types>
3754 template<typename Type>
3757 static constexpr bool value =
true;
3760 template<
typename Type1,
typename Type2>
3763 static constexpr bool value = std::is_same_v<Type1, Type2>;
3766 template<
typename Type1,
typename Type2,
typename... Types>
3773 template<
typename Type>
3776 static constexpr bool value =
true;
3779 template<
typename Type1,
typename Type2>
3785 template<
typename Type1,
typename Type2,
typename... Types>
3788 static constexpr bool value =
3792 template<
typename Type,
typename... Types>
3796 template<
typename TestType,
typename... Types>
3802 template<
typename TestType>
3808 template<
typename TestType,
typename Type>
3811 static constexpr bool value = std::is_same_v<TestType, Type>;
3814 template<
typename TestType,
typename Type,
typename... Types>
3818 std::is_same_v<TestType, Type>
3822 template<
typename TestType>
3828 template<
typename TestType,
typename Type>
3834 template<
typename TestType,
typename Type,
typename... Types>
3840 template<
typename TestType,
typename... Types>
3843 template<
typename TypeList,
typename... TestTypes>
3846 template<
typename... Types>
3849 static constexpr bool value =
false;
3852 template<
typename... Types,
typename TestType>
3858 template<
typename... Types,
typename TestType,
typename... TestTypes>
3863 static constexpr bool value =
sizeof...(TestTypes) == 0 ? tmp_value :
3867 template<
typename... Types>
3870 static constexpr bool value =
false;
3873 template<
typename... Types,
typename TestType>
3879 template<
typename... Types,
typename TestType,
typename... TestTypes>
3882 static constexpr bool value =
3886 template<
typename TypeList,
typename... TestTypes>
3889 template<
typename Type>
3892 template<
typename Type>
3895 template<
typename Type>
3898 template<
typename Type>
3901 template<
typename Type>
3904 template<
typename Type>
3907 template<
typename Type>
3910 template<
typename Type>
3913 template<
typename... Types>
3916 template<
typename... Types>
3919 template<
typename... Types>
3922 template<
typename... Types>
3925 template<
typename... Types>
3928 template<
typename... Types>
3931 template<
typename... Types>
3934 template<
typename... Types>
3937 template<
typename Type,
typename ReturnType = Type>
3939 std::enable_if_t<is_integral_v<Type>, ReturnType>;
3941 template<
typename Type,
typename ReturnType = Type>
3943 std::enable_if_t<is_signed_integral_v<Type>, ReturnType>;
3945 template<
typename Type,
typename ReturnType = Type>
3947 std::enable_if_t<is_unsigned_integral_v<Type>, ReturnType>;
3949 template<
typename Type,
typename ReturnType = Type>
3951 std::enable_if_t<is_integer_v<Type>, ReturnType>;
3953 template<
typename Type,
typename ReturnType = Type>
3955 std::enable_if_t<!is_integer_v<Type>, ReturnType>;
3957 template<
typename Type,
typename ReturnType = Type>
3959 std::enable_if_t<is_signed_integer_v<Type>, ReturnType>;
3961 template<
typename Type,
typename ReturnType = Type>
3963 std::enable_if_t<is_unsigned_integer_v<Type>, ReturnType>;
3965 template<
typename Type,
typename ReturnType = Type>
3967 std::enable_if_t<is_real_number_v<Type>, ReturnType>;
3969 template<
typename Type,
typename ReturnType = Type>
3971 std::enable_if_t<is_numerical_number_v<Type>, ReturnType>;
3973 template<
typename Type,
bool bInteger = false>
3979 template<
typename Type>
3982 using type = std::make_signed_t<Type>;
3985 template<
typename Type>
3988 template<
typename Type,
bool bInteger = false>
3994 template<
typename Type>
3997 using type = std::make_unsigned_t<Type>;
4000 template<
typename Type>
4003 template<
typename Type,
bool bIntegral = false>
4009 template<
typename Type>
4012 using type = std::make_signed_t<Type>;
4015 template<
typename Type>
4018 template<
typename Type,
bool bIntegral = false>
4024 template<
typename Type>
4027 using type = std::make_signed_t<Type>;
4030 template<
typename Type>
4033 template<
typename Type,
typename... Types>
4036 template<
typename Type>
4042 template<
typename Type1,
typename Type2>
4048 template<
typename Type1,
typename Type2,
typename... Types>
4061 template<
typename Type>
4067 template<
typename Type1,
typename Type2>
4073 template<
typename Type1,
typename Type2,
typename... Types>
4079 template<
typename... Types>
4094 template<
typename Type>
4100 template<
typename Type>
4106 template<
typename Type,
typename... Types>
4112 template<
typename Type,
typename... Types>
4118 template<
typename... Types>
4121 template<
typename... Types>
4124 template<
typename... Types>
4133 template<
typename Type>
4139 template<
typename Type,
typename... Types>
4151 template<
typename Type>
4157 template<
typename Type,
typename... Types>
4163 template<
typename... Types>
4166 template<
typename... Types>
4169 template<
typename... Types>
4172 template<
typename... Types>
4181 template<
typename Type>
4187 template<
typename Type,
typename... Types>
4190 using type = std::conditional_t<
sizeof...(Types)==0,
4200 template<
typename Type>
4206 template<
typename Type,
typename... Types>
4209 using type = std::conditional_t<
sizeof...(Types)==0,
4213 template<
typename... Types>
4216 template<
typename... Types>
4219 template<
typename... Types>
4222 template<
auto SelectIndex,
typename... Types>
4225 template<auto SelectIndex>
4231 template<
typename Type,
typename... Types>
4237 template<
auto SelectIndex,
typename Type,
typename... Types>
4240 using type = std::conditional_t<SelectIndex==0,
4244 template<auto SelectIndex>
4250 template<
typename Type,
typename... Types>
4256 template<
auto SelectIndex,
typename Type,
typename... Types>
4259 using type = std::conditional_t<SelectIndex==0,
4263 template<
typename Type>
4269 template<
typename Type>
4275 template<
typename Type>
4279 template<
auto SelectIndex,
typename... Types>
4282 template<
auto SelectIndex,
typename... Types>
4285 template<
typename Type>
4288 template<
typename Type>
4291 template<
typename Type>
4294 template<auto SelectIndex,
typename Type>
4297 template<
typename ArgType,
typename... Types>
4303 template<
typename ArgType,
typename... Types>
4309 template<
typename ArgType,
typename... Types>
4312 template<
typename ArgType,
typename... Types>
4318 template<
typename ArgType,
typename... Types>
4324 template<
typename ArgType,
typename... Types>
4327 template<
typename ListType>
4336 template<
typename Type,
typename... Types>
4342 template<
typename... Types>
4348 template<
typename... Types>
4354 template<
typename... Types>
4357 template<
typename LeftList,
typename RightList>
4360 template<
typename... LeftTypes>
4366 template<
typename... LeftTypes,
typename Type,
typename... RightTypes>
4372 using type = std::conditional_t<
sizeof...(RightTypes) == 0,
4376 template<
typename... Types>
4382 template<
typename... Types>
4388 template<
typename... Types>
4400 template<
typename RightType,
typename... RightTypes>
4406 template<
typename... LeftTypes>
4412 template<
typename... LeftTypes,
typename RightType,
typename... RightTypes>
4418 template<
size_t FirstN,
typename... LeftTypes,
typename RightType,
typename... RightTypes>
4428 using type = std::conditional_t<FirstN == 0, type_list_0, type_list_1>;
4433 template<
size_t FirstN,
typename... RightTypes>
4438 using type = std::conditional_t<FirstN == 0, type_list_t<>,
4443 template<
size_t FirstN,
typename... RightTypes>
4448 using type = std::conditional_t<FirstN == 0, type_list_t<>,
4453 template<
size_t FirstN,
typename... RightTypes>
4456 template<
size_t FirstN,
typename... RightTypes>
4468 template<
typename LeftType,
typename... LeftTypes>
4474 template<
typename... RightTypes>
4480 template<
typename LeftType,
typename... LeftTypes,
typename... RightTypes>
4486 template<
size_t LastN,
typename LeftType,
typename... LeftTypes,
typename... RightTypes>
4499 using type = std::conditional_t<LastN==0, type0, type1>;
4502 template<
size_t LastN,
typename... LeftTypes>
4507 using type = std::conditional_t<LastN==0, type_list_t<>,
4512 template<
size_t LastN,
typename... LeftTypes>
4517 using type = std::conditional_t<LastN==0, type_list_t<>,
4522 template<
size_t LastN,
typename... LeftTypes>
4525 template<
size_t LastN,
typename... LeftTypes>
4528 template<
typename ArgType,
typename... Types>
4531 template<
typename ArgType>
4534 static constexpr bool value =
false;
4537 template<
typename ArgType,
typename Type,
typename... RightTypes>
4540 static constexpr bool value = std::is_same_v<ArgType, Type> ? true :
4544 template<
typename ArgType>
4547 static constexpr bool value =
false;
4550 template<
typename ArgType,
typename Type,
typename... RightTypes>
4556 template<
typename ArgType,
typename... Types>
4559 template<
typename TestType,
typename TypeList,
typename ReturnType = TestType>
4562 template<
typename TestTypeList,
typename TypeList,
typename ReturnType =
void>
4565 template<
typename ListType,
typename... Types>
4568 template<
typename... Types>
4574 template<
typename... Types,
typename Type>
4579 using type = std::conditional_t<is_type_in_list_v<Type, list>,
4583 template<
typename... Types,
typename Type,
typename... RightTypes>
4591 template<
typename... Types,
typename... RightTypes>
4597 template<
typename... Types>
4600 template<
typename Type,
typename... Types>
4607 template<
typename Type,
typename... Types>
4613 template<
typename Type,
typename... Types>
4620 template<
typename Type,
typename... Types>
4623 template<
typename... Types>
4629 template<
typename... Types>
4635 template<
typename... Types>
4641 template<
typename... Types>
4644 template<
typename ArgType,
typename RightList>
4647 template<
typename ArgType,
typename... RightTypes>
4653 template<
typename... ArgTypes,
typename... RightTypes>
4659 template<
typename ArgType,
typename RightList>
4662 template<
typename LeftList,
typename RightList>
4665 template<
typename ArgType,
typename... RightTypes>
4671 template<
typename... ArgTypes,
typename... RightTypes>
4677 template<
typename ArgType,
typename RightList>
4680 template<
typename LeftList,
typename... Types>
4683 template<
typename... Types>
4689 template<
typename... Types,
typename Type>
4694 using type = std::conditional_t<is_type_in_list_v<Type, list>,
4698 template<
typename... Types,
typename Type,
typename... RightTypes>
4703 using type = std::conditional_t<
sizeof...(RightTypes)==0,
4707 template<
typename ArgType,
typename... Types>
4711 using type = std::conditional_t<is_in_list_v<ArgType, list>,
4715 template<
typename... Types>
4721 template<
typename... Types,
typename Type>
4727 template<
typename... Types,
typename Type,
typename... RightTypes>
4733 template<
typename LeftList,
typename RightList>
4736 template<
typename LeftType,
typename... Types>
4739 template<
typename... Types>
4745 template<
typename... Types,
typename Type>
4750 using type = std::conditional_t<is_type_in_list_v<Type, list>,
4754 template<
typename... Types,
typename Type,
typename... RightTypes>
4760 using type = std::conditional_t<
sizeof...(RightTypes) == 0,
4764 template<
typename... Types>
4770 template<
typename... Types,
typename Type>
4776 template<
typename... Types,
typename Type,
typename... RightTypes>
4782 template<
typename LeftList,
typename RightList>
4785 template<
typename ArgType,
typename... Types>
4788 template<
typename ArgType>
4794 template<
typename ArgType,
typename Type>
4797 using type = std::conditional_t<std::is_same_v<ArgType, Type>,
4801 template<
typename ArgType,
typename Type,
typename... RightTypes>
4806 using type = std::conditional_t<
sizeof...(RightTypes) == 0,
4810 template<
typename ArgType>
4816 template<
typename ArgType,
typename Type>
4822 template<
typename ArgType,
typename Type,
typename... RightTypes>
4828 template<
typename ArgType,
typename... Types>
4834 template<
typename ArgType,
typename... Types>
4840 template<
typename ArgType,
typename... Types>
4844 template<
typename LeftList,
typename... Types>
4847 template<
typename... Types>
4853 template<
typename... Types,
typename Type>
4859 template<
typename... Types,
typename Type,
typename... RightTypes>
4864 using type = std::conditional_t<
sizeof...(RightTypes) == 0,
4868 template<
typename... Types>
4874 template<
typename... Types,
typename Type>
4880 template<
typename... Types,
typename Type,
typename... RightTypes>
4886 template<
typename LeftList,
typename RightList>
4889 template<
typename NewType,
typename OldType,
typename... Types>
4892 template<
typename NewType,
typename OldType>
4898 template<
typename NewType,
typename OldType,
typename Type>
4901 using type = std::conditional_t< std::is_same_v<OldType, Type>,
4905 template<
typename NewType,
typename OldType,
typename Type,
typename... RightTypes>
4910 using type = std::conditional_t<
sizeof...(RightTypes),
list,
4914 template<
typename NewType,
typename OldType>
4920 template<
typename NewType,
typename OldType,
typename Type>
4926 template<
typename NewType,
typename OldType,
typename Type,
typename... RightTypes>
4932 template<
typename NewType,
typename OldType,
typename TypeList>
4935 template<
typename Type,
typename... Types>
4938 template<
typename... LeftTypes>
4941 static constexpr bool value =
true;
4944 template<
typename... LeftTypes,
typename Type>
4947 static constexpr bool value =
4951 template<
typename... LeftTypes,
typename Type,
typename... RightTypes>
4954 static constexpr bool tmp_value =
4957 static constexpr bool value =
sizeof...(RightTypes)==0 ? tmp_value :
4961 template<
typename... LeftTypes,
typename... RightTypes>
4964 static constexpr bool value =
sizeof...(LeftTypes) !=
sizeof...(RightTypes) ?
4968 template<
typename LeftList,
typename RightList>
4974 template<
typename Type>
4984 template<
typename Type,
typename... Types>
4987 template<
typename Type,
typename... Types>
4990 template<
typename Type,
typename... Types>
4993 template<
typename ReturnType,
typename Type,
typename... Types>
4996 template<
typename ReturnType,
typename... Types>
4999 template<
typename ReturnType,
typename Type,
typename... Types>
5002 template<
typename ReturnType,
typename... Types>
5006 template<
typename Type,
typename... Types>
5009 template<
typename... Types>
5012 template<
typename Type,
typename... Types>
5015 template<
typename... Types>
5025 template<
typename TestType,
typename... Types>
5028 template<
typename Type>
5031 template<
typename Type>
5034 template<
typename Type>
5037 template<
typename Type>
5040 template<
typename Type>
5043 template<
typename Type>
5046 template<
typename Type>
5049 template<
typename Type>
5052 template<
typename TypeList,
typename... TestTypes>
5055 template<
typename... Types>
5058 template<
typename... Types>
5061 template<
typename... Types>
5064 template<
typename... Types>
5067 template<
typename... Types>
5070 template<
typename... Types>
5073 template<
typename... Types>
5076 template<
typename... Types>
5079 template<
typename Type,
typename ReturnType = Type>
5082 template<
typename Type,
typename ReturnType = Type>
5085 template<
typename Type,
typename ReturnType = Type>
5088 template<
typename Type,
typename ReturnType = Type>
5091 template<
typename Type,
typename ReturnType = Type>
5094 template<
typename Type,
typename ReturnType = Type>
5097 template<
typename Type,
typename ReturnType = Type>
5100 template<
typename Type,
typename ReturnType = Type>
5103 template<
typename Type,
typename ReturnType = Type>
5106 template<
typename Type>
5109 template<
typename Type>
5112 template<
typename Type>
5115 template<
typename Type>
5118 template<
typename Type1,
typename Type2>
5121 template<
typename... Types>
5124 template<
typename... Types>
5127 template<
typename... Types>
5130 template<
typename... Types>
5133 template<
typename... Types>
5136 template<
typename... Types>
5139 template<
typename ReturnType,
typename... ArgTypes>
5141 std::enable_if_t< common_type_v< remove_cvref_t<ArgTypes>... >, ReturnType>;
5143 template<
typename... ArgTypes>
5145 std::enable_if_t< common_type_v< remove_cvref_t<ArgTypes>... > >;
5147 template<std::
size_t N,
typename T,
typename deleter = std::default_delete<T[]>>
5154 std::unique_ptr<T[], deleter>
uptr;
5158 return tpf::types::cast_ref<N>(
uptr);
5163 return tpf::types::cast_ref<N>(
uptr);
5166 template<
typename IndexType>
5172 template<
typename IndexType>
5182 template<
typename... ArgTypes>
5185 constexpr static std::size_t
N =
sizeof...(ArgTypes);
5193 template<
typename... ArgTypes>
5196 template<
typename deleter,
typename... ArgTypes>
5199 constexpr static std::size_t
N =
sizeof...(ArgTypes);
5207 template<
typename deleter,
typename... ArgTypes>
5234 template<
typename FuncType,
typename... ArgTypes>
5235 auto safe_apply(FuncType&& f, std::tuple<ArgTypes...>
const& args)
5236 ->
decltype( f( std::declval<ArgTypes>()...));
5238 template<
typename FuncType,
typename ArgType, std::size_t N, std::size_t... Ints>
5240 std::index_sequence<Ints...>)->
decltype( f( std::get<Ints>(args)... ));
5244 template<
typename FuncType,
typename ArgType, std::
size_t N>
5245 auto safe_apply(FuncType&& f, std::array<ArgType, N>
const& args)
5246 ->
decltype(
array_apply(f, args, std::make_index_sequence<N>{}) );
5250 template<
typename FuncType,
typename TupleType>
5256 template<
typename FuncType,
typename TupleType>
5259 template<
typename FuncType,
typename... TupleTypes>
5260 using common_apply_t = std::common_type_t< apply_return_t<FuncType, TupleTypes>... >;
5262 template<
typename FuncType,
typename TupleType>
5263 constexpr bool is_apply_v = !is_no_type_v<apply_return_t<FuncType, TupleType>>;
5265 template<
typename FuncType,
typename... TupleTypes>
5266 constexpr bool all_apply_v = ( is_apply_v<FuncType, TupleTypes> && ... );
5268 template<
typename FuncType,
typename... TupleTypes>
5270 common_type_v<apply_return_t<FuncType, TupleTypes>...>;
5272 template<
typename ReturnType,
typename FuncType,
typename... TupleTypes>
5276 template<
typename FuncType,
typename... TupleTypes>
5279 template<
typename FuncType,
typename... TupleTypes>
5281 std::array<std::common_type_t<apply_return_t<FuncType, TupleTypes>...>,
sizeof...(TupleTypes)>;
5283 template<
typename FuncType,
typename... TupleTypes>
5285 std::vector<std::common_type_t<apply_return_t<FuncType, TupleTypes>...>>;
5287 template<
typename FuncType,
typename... TupleTypes>
5290 template<
typename FuncType,
typename... TupleTypes>
5294 template<
typename FuncType,
typename... TupleTypes>
5298 template<
typename FuncType,
typename... TupleTypes>
5302 template<
typename FuncType,
typename... TupleTypes>
5304 std::common_type_t<apply_return_t<FuncType, TupleTypes>...>>;
5306 template<
typename FuncType,
typename... ArgTypes>
5313 template<
typename FuncType,
typename... ArgTypes>
5321 template<
typename FuncType,
typename... ArgTypes>
5331 template<
typename Type>
5334 template<
typename Type>
5337 template<
typename Type>
5340 template<
typename Type>
5343 template<
typename Type>
5346 template<
typename Type>
5349 template<
typename Type>
5352 template<
typename Type>
5355 template<
typename Type>
5358 template<
typename Type>
5361 template<
typename Type>
5364 template<
typename Type>
5367 template<
typename Type>
5370 template<
typename Type>
5373 template<
typename Type>
5376 template<
typename Type>
5379 template<
typename Type>
5382 template<
typename Type>
5385 template<
typename Type>
5388 template<
typename Type>
5391 template<
typename Type>
5394 template<
typename Type>
5397 template<
typename Type>
5400 template<
typename Type>
5405 template<
typename FuncType,
typename... ArgTypes>
5409 template<
typename FuncType,
typename... ArgTypes>
5413 template<
typename FuncType,
typename... ArgTypes>
5416 template<
typename FuncType,
typename... ArgTypes>
5422 template<
typename FuncType,
typename... ArgTypes>
5425 template<
typename FuncType,
typename... ArgTypes>
5428 template<
typename FuncType,
typename... ArgTypes>
5434 template<
typename T,
typename... Types>
5437 template<
typename T>
5440 static constexpr bool value =
false;
5443 template<
typename T,
typename S>
5446 static constexpr bool value = common_type_v<T, S>;
5449 template<
typename T,
typename S,
typename... Types>
5455 template<
typename... ArgTypes1,
typename... ArgTypes2>
5457 const std::tuple<ArgTypes2...>& tuple_b);
5459 template<
typename... ArgTypes1,
typename... ArgTypes2,
auto... Indices>
5463 auto tuple_opr =[](
auto a,
auto b)
5468 if constexpr(types::is_tuple_v<type_a> && types::is_tuple_v<type_b>)
5478 return std::tuple{ tuple_opr(std::get<Indices>(tuple_a), std::get<Indices>(tuple_b))... };
5481 template<
typename... ArgTypes1,
typename... ArgTypes2>
5483 const std::tuple<ArgTypes2...>& tuple_b)
5485 constexpr auto Size1 =
sizeof...(ArgTypes1);
5486 constexpr auto Size2 =
sizeof...(ArgTypes2);
5488 if constexpr(Size1 == Size2)
5490 if constexpr(Size1 == 0)
5497 return std::tuple<no_type_t>{};
5501 template<
typename Type>
5513 template<
typename Type>
5519 template<
typename Type,
typename... Types>
5526 template<
typename T,
typename S>
5533 template<
typename... ArgTypes1,
typename... ArgTypes2>
5536 using T = std::tuple<ArgTypes1...>;
5537 using S = std::tuple<ArgTypes2...>;
5547 template<
typename T,
typename... Types>
5550 template<
typename T,
typename... Types>
5553 template<
typename T,
typename S>
5556 template<
typename T,
typename S>
5559 template<
typename T,
typename S>
5563 template<
typename Type,
typename ReturnType =
void>
5566 template<
typename... Types>
5569 template<
typename... Types>
5572 template<
typename... Types>
5575 template<
typename... Types>
5578 template<
typename... Types>
5581 template<
typename... Types>
5584 template<
auto SelectIndex,
typename... Types>
5587 template<
auto SelectIndex,
typename... Types>
5590 template<
typename Type>
5593 template<
typename Type>
5596 template<auto SelectIndex,
typename Type>
5599 template<
typename ArgType,
typename... Types>
5602 template<
typename ArgType,
typename... Types>
5605 template<
typename... Types>
5608 template<
typename... Types>
5611 template<
size_t FirstN,
typename... Types>
5614 template<
size_t FirstN,
typename... Types>
5617 template<
size_t LastN,
typename... Types>
5620 template<
size_t LastN,
typename... Types>
5623 template<
typename ArgType,
typename... Types>
5626 template<
typename... Types>
5629 template<
typename Type,
typename... Types>
5632 template<
typename TupleType>
5635 template<
template<
typename,
typename...>
class Container,
typename TupleType>
5638 template<
typename... Types>
5641 template<
typename VarType>
5644 template<
typename ArgType,
typename RightList>
5647 template<
typename ArgType,
typename RightList>
5650 template<
typename LeftList,
typename RightList>
5653 template<
typename LeftList,
typename RightList>
5656 template<
typename ArgType,
typename... Types>
5659 template<
typename LeftList,
typename RightList>
5662 template<
typename NewType,
typename OldType,
typename TypeList>
5665 template<
typename LeftList,
typename RightList>
5671 template<
typename Type>
5677 template<
typename... Types>
5681 static constexpr bool value = common_type_v<arg_types>;
5685 template<
typename TupleType>
5688 template<
typename TupleType>
5691 template<
typename TupleType>
5693 std::array< tuple_common_element_t<TupleType>, tuple_size_v<TupleType> >;
5698 template<
typename TupleType>
5701 template<
typename TupleType>
5704 template<
typename TupleType>
5709 template<
auto... Ints,
typename FuncType>
5713 using ele_t = std::tuple_element_t<0, array_t>;
5718 template<
auto... Ints,
typename FuncType>
5722 using ele_t = std::tuple_element_t<0, array_t>;
5729 template<
auto... RangeValues,
typename FuncType>
5735 template<
typename Type, std::
size_t N>
5738 std::array<Type, N> result = array;
5747 template<
auto... Ints,
typename FuncType>
5753 return std::vector<ele_t>{ smart_move<ele_t>(std::get<Ints>(tuple))... };
5756 template<
auto... Ints,
typename FuncType>
5762 return std::vector<ele_t>{ smart_move<ele_t>(std::get<Ints>(tuple))... };
5767 template<
auto... RangeValues,
typename FuncType>
5776 template<
typename ArrayType,
typename TupleType,
auto...Indices>
5779 constexpr auto Size =
sizeof...(Indices);
5782 auto workhorse =[&array, &tuple](
auto indexer)
5784 array[indexer.Index] =
std::get<indexer.Index>(tuple);
5787 for_workhorse<Size>(workhorse);
5792 template<
typename ContainerType,
typename TupleType,
auto...Indices>
5795 constexpr auto Size =
sizeof...(Indices);
5796 ContainerType container;
5798 auto workhorse = [&container, &tuple](
auto indexer)
5800 if constexpr(types::is_emplace_back_available_v<ContainerType>)
5802 container.emplace_back(std::get<indexer.Index>(tuple));
5804 else if constexpr(types::is_insert_available_v<ContainerType>)
5806 container.insert(std::get<indexer.Index>(tuple));
5810 for_workhorse<Size>(workhorse);
5815 template<
typename T,
size_t Size,
auto... Indices>
5818 return std::tuple{ (array[Indices])... };
5831 template<
typename Type,
typename... Types,
5832 auto Size =
sizeof...(Types) + 1,
5833 typename common_type = std::common_type_t<Type, Types...>,
5834 typename array_type = std::array<common_type, Size>>
5840 template<
template<
typename,
typename...>
class ContainerType,
5841 typename Type,
typename... Types,
5842 auto Size =
sizeof...(Types) + 1,
5843 typename common_type = std::common_type_t<Type, Types...>,
5844 typename container_type = ContainerType<common_type>>
5850 template<
typename ContainerType,
5851 typename Type,
typename... Types,
5852 auto Size =
sizeof...(Types) + 1>
5858 template<
template<
typename,
typename...>
class ContainerType,
5859 typename Type,
typename... Types,
size_t Size,
5860 typename container_type = ContainerType<Type, Types...>>
5865 container_type container;
5867 for(
size_t i = 0; i < Size; ++i)
5869 if constexpr(types::is_emplace_back_available_v<container_type>)
5871 container.emplace_back(array[i]);
5873 else if constexpr(types::is_insert_available_v<container_type>)
5875 container.insert(array[i]);
5882 template<
typename T,
size_t Size>
5888 template<
int ArgumentIndex,
typename FuncType,
typename ArgType,
typename... ArgTypes,
5892 return [&func, arguments = std::tuple{ arg, args...}](
auto&& x)
mutable
5894 std::get<ArgumentIndex>(arguments) = std::forward< decltype(x) >(x);
5900 template<
int ArgumentIndex,
typename FuncType,
typename ArgType,
typename... ArgTypes,
5904 return [&func, arguments = arguments](
auto&& x)
mutable
5906 std::get<ArgumentIndex>(arguments) = std::forward< decltype(x) >(x);
5912 template<
int FuncIndex,
int ArgumentIndex,
5913 typename FuncType,
typename... FuncTypes,
typename ArgFirst,
typename... ArgTypes,
5915 && (ArgumentIndex <
sizeof...(ArgTypes) + 1 )> >
5916 auto freeze_parameter(
const std::tuple<FuncType, FuncTypes...>& func_tuple, ArgFirst arg, ArgTypes... args)
5918 return [&func = std::get<FuncIndex>(func_tuple), arguments =
5919 std::tuple{arg, args...}](
auto&& x)
mutable
5921 std::get<ArgumentIndex>(arguments) = std::forward<>(x);
5923 return func(arguments);
5927 template<
int FuncIndex,
int ArgumentIndex,
5928 typename FuncType,
typename... FuncTypes,
typename ArgFirst,
typename... ArgTypes,
5930 && (ArgumentIndex <
sizeof...(ArgTypes)+1)>>
5932 const std::tuple<ArgFirst, ArgTypes...>& arguments)
5934 return [&func = std::get<FuncIndex>(func_tuple), arguments = arguments](
auto&& x)
mutable
5936 std::get<ArgumentIndex>(arguments) = std::forward<>(x);
5938 return func(arguments);
5944 template<
template<
typename,
size_t>
class ReturnClass,
5945 typename TupleType,
auto... Indices,
typename... ArgTypes>
5948 return ReturnClass{ (std::get<Indices>(tuple)(std::forward<ArgTypes>(args)...))... };
5951 template<
template<
typename...>
class ReturnClass,
5952 typename TupleType,
auto... Indices,
typename... ArgTypes>
5955 return ReturnClass{ (std::get<Indices>(tuple)(std::forward<ArgTypes>(args)...))... };
5958 template<
template<
typename,
size_t>
class ReturnClass,
5959 typename TupleType,
auto... Indices,
typename ArgTuple>
5962 return ReturnClass{
std::apply(std::get<Indices>(tuple), std::forward<ArgTuple>(arguments))... };
5965 template<
template<
typename...>
class ReturnClass,
5966 typename TupleType,
auto... Indices,
typename ArgTuple>
5969 return ReturnClass{
std::apply(std::get<Indices>(tuple), std::forward<ArgTuple>(arguments))... };
5975 template<
template<
typename,
size_t>
class ReturnClass,
5976 typename FuncType,
typename... FuncTypes,
typename ArgFirst,
typename... ArgTypes>
5977 auto evaluate_lambdas(
const std::tuple<FuncType, FuncTypes...>& tuple, ArgFirst&& arg, ArgTypes&&... args)
5979 constexpr auto Size =
sizeof...(FuncTypes) + 1;
5982 tuple, std::forward<ArgFirst>(arg), std::forward<ArgTypes>(args)...);
5985 template<
template<
typename...>
class ReturnClass,
5986 typename FuncType,
typename... FuncTypes,
typename ArgFirst,
typename... ArgTypes>
5987 auto evaluate_lambdas(
const std::tuple<FuncType, FuncTypes...>& tuple, ArgFirst&& arg, ArgTypes&&... args)
5989 constexpr auto Size =
sizeof...(FuncTypes) + 1;
5991 return hidden::evaluate_lambdas<ReturnClass>(make_typed_sequence_t<Size>{},
5992 tuple, std::forward<ArgFirst>(arg), std::forward<ArgTypes>(args)...);
5995 template<
template<
typename,
size_t>
class ReturnClass,
5996 typename FuncType,
typename... FuncTypes,
typename ArgFirst>
5999 constexpr auto Size =
sizeof...(FuncTypes) + 1;
6004 tuple, std::forward<ArgFirst>(arg));
6009 tuple, std::forward<ArgFirst>(arg));
6013 template<
template<
typename...>
class ReturnClass,
6014 typename FuncType,
typename... FuncTypes,
typename ArgFirst>
6015 auto evaluate_lambdas(
const std::tuple<FuncType, FuncTypes...>& tuple, ArgFirst&& arg)
6017 constexpr auto Size =
sizeof...(FuncTypes) + 1;
6021 return hidden::evaluate_lambdas_tuple<ReturnClass>(make_typed_sequence_t<Size>{},
6022 tuple, std::forward<ArgFirst>(arg));
6026 return hidden::evaluate_lambdas<ReturnClass>(make_typed_sequence_t<Size>{},
6027 tuple, std::forward<ArgFirst>(arg));
6033 template<
typename... Types>
6036 template<
typename T>
6042 template<
typename... Ts>
6048 template<
typename Type>
6053 template<
typename CallbackType,
typename... ArgTypes>
6062 template<
typename CallbackType,
typename... Types>
6069 template<
typename CallbackType,
typename... CallableTypes,
typename... NonCallableTypes>
6073 static constexpr bool value = is_invocable_v<CallbackType>;
6084 template<
typename CallbackType,
typename... CallableTypes,
typename... NonCallableTypes,
typename Type>
6088 static constexpr bool value = is_invocable_v<CallbackType, Type>;
6098 template<
typename CallbackType,
typename... CallableTypes,
typename... NonCallableTypes,
typename Type,
typename... Types>
6102 static constexpr bool value = is_invocable_v<CallbackType, Type>;
6107 using callables_tmp = std::conditional_t<value, types::push_back_type_t<Type, callable_list>,
callable_list>;
6108 using non_callables_tmp = std::conditional_t<!value, types::push_back_type_t<Type, non_callable_list>,
non_callable_list>;
6117 template<
typename CallbackType,
typename... CallableTypes,
typename... NonCallableTypes,
typename... Types>
6128 template<
typename... Heads,
typename... Tails>
6136 template<
typename... Types>
6142 template<
typename... Types>
6151 template<
typename... Types>
6154 template<
typename Heads,
typename Tails>
6157 template<
typename CallbackType,
typename... Types>
6160 template<
typename CallbackType,
typename... Types>
6163 template<
typename CallbackType,
typename... Types>
6166 template<
typename CallbackType,
typename... Types>
6171 template<
typename... Types>
6194 template<
typename Type,
typename... Types>
6200 template<
typename Type,
typename... Types>
6206 template<
typename Head,
typename...Tails,
typename... Types>
6212 template<
typename Type,
typename Head2,
typename... Tails2>
6218 template<
typename... Types1,
typename... Types2>
6224 template<
typename... Types>
6227 template<
typename Type>
6230 template<
bool OrAnd,
6233 template<
typename,
typename...>
class BinaryPredicate,
6234 typename ListHead,
typename... ListTails>
6237 template<
bool LeftRight,
6239 template<
typename,
typename...>
class BinaryPredicate,
6240 typename ListHead,
typename... ListTails>
6243 static constexpr bool value =
6248 template<
bool LeftRight,
6250 template<
typename,
typename...>
class BinaryPredicate,
6251 typename ListHead,
typename... ListTails>
6254 static constexpr bool value =
6259 template<
typename Type,
6260 template<
typename,
typename...>
class BinaryPredicate,
6261 typename ListHead,
typename... ListTails>
6264 static constexpr bool value =
6269 template<
typename Type,
6270 template<
typename,
typename...>
class BinaryPredicate,
6271 typename ListHead,
typename... ListTails>
6274 static constexpr bool value =
6279 template<
typename Type,
6280 template<
typename,
typename...>
class BinaryPredicate,
6281 typename ListHead,
typename... ListTails>
6284 static constexpr bool value =
6289 template<
typename Type,
6290 template<
typename,
typename...>
class BinaryPredicate,
6291 typename ListHead,
typename... ListTails>
6294 static constexpr bool value =
6299 template<
typename Type,
template<
typename,
typename...>
class BinaryPredicate,
typename ListHead>
6302 static constexpr bool value = BinaryPredicate<Type, ListHead>::value;
6305 template<
typename Type,
template<
typename,
typename...>
class BinaryPredicate,
typename ListHead>
6308 static constexpr bool value = BinaryPredicate<Type, ListHead>::value;
6311 template<
typename Type,
template<
typename,
typename...>
class BinaryPredicate,
typename ListHead>
6314 static constexpr bool value = BinaryPredicate<ListHead, Type>::value;
6317 template<
typename Type,
template<
typename,
typename...>
class BinaryPredicate,
typename ListHead>
6320 static constexpr bool value = BinaryPredicate<ListHead, Type>::value;
6323 template<
bool OrAnd,
6326 template<
typename,
typename...>
class BinaryPredicate,
6327 typename ListHead,
typename... ListTails>
6334 template<
bool OrAnd,
6337 template<
typename,
typename...>
class BinaryPredicate,
6338 typename ListHead,
typename... ListTails>
6346 template<
bool OrAnd,
6349 template<
typename,
typename...>
class BinaryPredicate,
6350 typename Head,
typename ListHead,
typename... ListTails>
6356 Head, ListHead, ListTails...>
::value;
6359 template<
bool OrAnd,
6362 template<
typename,
typename...>
class BinaryPredicate,
6363 typename ListHead,
typename... ListTails,
typename Head,
typename... Tails>
6365 type_list_t<ListHead, ListTails...>, Head, Tails...>
6369 ListHead, ListTails..., Head, Tails...>
::value;
6372 template<
bool OrAnd,
6375 template<
typename,
typename...>
class BinaryPredicate,
6376 typename ListHead,
typename... ListTails,
typename Head,
typename... Tails>
6382 ListHead, ListTails..., Head, Tails...>
::value;
6385 template<
typename Type,
6386 typename ListHead,
typename... ListTails>
6388 Type, std::is_same, ListHead, ListTails...>::value;
6390 template<
typename Type,
6391 typename ListHead,
typename... ListTails>
6393 Type, std::is_constructible, ListHead, ListTails...>::value;
6395 template<
typename Type,
6396 typename ListHead,
typename... ListTails>
6398 std::add_lvalue_reference_t<Type>, std::is_assignable, ListHead, ListTails...>::value;
6400 template<
typename Type,
6401 typename ListHead,
typename... ListTails>
6403 std::add_lvalue_reference_t<Type>, std::is_assignable, ListHead, ListTails...>::value;
6405 template<
typename TestType,
typename TypeList,
typename ReturnType = TestType>
6408 template<
typename TestTypeList,
typename TypeList,
typename ReturnType =
void>
6413 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6417 using base_type = ContainerType<std::variant<ElementTypes...>>;
6418 using base_type::base_type;
6425 return base_type::rcbegin();
6430 return base_type::crend();
6434 template<
typename KeyType,
typename... ElementTypes>
6436 public std::pair<KeyType, std::variant<ElementTypes...>>
6439 using base_type = std::pair<KeyType, std::variant<ElementTypes...>>;
6440 using base_type::base_type;
6448 template<
typename KeyType,
typename... ElementTypes>
6450 public std::map<KeyType, std::variant<ElementTypes...>>
6453 using base_type = std::map<KeyType, std::variant<ElementTypes...>>;
6454 using base_type::base_type;
6461 return base_type::rcbegin();
6466 return base_type::crend();
6470 template<
typename KeyType,
typename... ElementTypes>
6472 public std::multimap<KeyType, std::variant<ElementTypes...>>
6475 using base_type = std::multimap<KeyType, std::variant<ElementTypes...>>;
6476 using base_type::base_type;
6482 template<
typename KeyType,
typename... ElementTypes>
6484 public std::unordered_map<KeyType, std::variant<ElementTypes...>>
6487 using base_type = std::unordered_map<KeyType, std::variant<ElementTypes...>>;
6488 using base_type::base_type;
6494 template<
typename KeyType,
typename... ElementTypes>
6496 public std::unordered_multimap<KeyType, std::variant<ElementTypes...>>
6499 using base_type = std::unordered_multimap<KeyType, std::variant<ElementTypes...>>;
6500 using base_type::base_type;
6506 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6512 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6518 template<
typename KeyType,
typename... ElementTypes>
6524 template<
typename KeyType,
typename... ElementTypes>
6530 template<
typename KeyType,
typename... ElementTypes>
6536 template<
typename KeyType,
typename... ElementTypes>
6542 template<
typename KeyType,
typename... ElementTypes>
6548 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6552 template<
template<
typename,
typename...>
class ContainerType,
6553 typename KeyType,
typename... ElementTypes>
6557 template<
typename... ElementTypes>
6560 template<
typename... ElementTypes>
6563 template<
typename... ElementTypes>
6566 template<
typename... ElementTypes>
6569 template<
typename... ElementTypes>
6572 template<
typename... ElementTypes>
6575 template<
typename... ElementTypes>
6578 template<
typename... ElementTypes>
6581 template<
typename KeyType,
typename... ElementTypes>
6584 template<
typename KeyType,
typename... ElementTypes>
6587 template<
typename KeyType,
typename... ElementTypes>
6590 template<
typename KeyType,
typename... ElementTypes>
6593 template<
typename KeyType,
typename... ElementTypes>
6599 template<
typename Type1,
typename Type2,
6601 bool is_integral_type = is_integral_v<common_t>,
6602 typename result_type = std::conditional_t<
6608 template<
typename Type1,
typename Type2,
6610 bool is_integral_type = is_integral_v<common_t>,
6611 typename result_type = std::conditional_t<
6617 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6620 template<
typename... ElementTypes>
6623 template<
typename... ElementTypes>
6626 template<
typename... ElementTypes>
6629 template<
typename... ElementTypes>
6632 template<
typename... ElementTypes>
6635 template<
typename... ElementTypes>
6638 template<
typename... ElementTypes>
6641 template<
typename... ElementTypes>
6644 template<
typename KeyType,
typename... ElementTypes>
6647 template<
typename KeyType,
typename... ElementTypes>
6650 template<
typename KeyType,
typename... ElementTypes>
6653 template<
typename KeyType,
typename... ElementTypes>
6659 template<
typename Type,
typename... Types>
6665 template<
template<
typename...>
class ClassTemplate,
6666 typename... InnerTypes,
typename... Types>
6669 using type = ClassTemplate<Types...>;
6672 template<
template<
typename...>
class ClassTemplate,
6673 typename... InnerTypes,
typename... Types>
6677 using type = ClassTemplate<Types...>;
6680 template<
typename Type,
typename... Types>
6687 template<
template<
typename...>
class ClassTemplate,
6688 typename... InnerTypes,
typename... Types>
6695 template<
typename... InnerTypes,
typename... Types>
6702 template<
template<
typename...>
class ClassTemplate,
6703 typename... InnerTypes,
typename... Types>
6711 template<
typename... InnerTypes,
typename... Types>
6718 template<
typename Type,
typename... Types>
6722 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6725 using type = ClassTemplate<Types...>;
6728 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6731 using type = ClassTemplate<Types...>;
6734 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6740 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6746 template<
typename... Types>
6753 template<
typename... Types>
6760 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6765 template<
size_t TypeIndex,
typename TemplateClass,
typename... Types>
6768 template<
size_t TypeIndex,
6769 template<
typename...>
class TemplateClass,
6770 typename... InnerTypes,
typename... Types>
6773 static_assert(TypeIndex <
sizeof...(Types),
"TypeIndex is out of range");
6776 using type = std::conditional_t<is_valid_type_v<nth_type>, TemplateClass<nth_type>,
nth_type>;
6779 template<
size_t TypeIndex,
6780 template<
typename...>
class TemplateClass,
6781 typename... InnerTypes,
typename... Types>
6784 static_assert(TypeIndex <
sizeof...(Types),
"TypeIndex is out of range");
6787 using type = std::conditional_t<is_valid_type_v<nth_type>, TemplateClass<nth_type>,
nth_type>;
6790 template<
size_t TypeIndex,
typename TemplateClass,
typename... Types>
6795 template<
size_t FirstN,
6796 template<
typename...>
typename TemplateClass,
typename... Types>
6799 static_assert(FirstN <=
sizeof...(Types),
"FirstN is out of range");
6802 using class_t = std::conditional_t<is_valid_type_v<n_types>,
6808 template<
size_t FirstN,
template<
typename...>
class TemplateClass,
typename... Types>
6811 static_assert(FirstN <=
sizeof...(Types),
"FirstN is out of range");
6814 using class_t = std::conditional_t<is_valid_type_v<n_types>,
6820 template<
size_t FirstN,
template<
typename...>
typename TemplateClass,
typename... Types>
6825 template<
size_t FirstN,
typename TemplateClass,
typename... Types>
6828 template<
size_t FirstN,
6829 template<
typename...>
class TemplateClass,
6830 typename... InnerTypes,
typename... Types>
6833 static_assert(FirstN <=
sizeof...(Types),
"FirstN is out of range");
6836 using class_t = std::conditional_t<is_valid_type_v<n_types>,
6842 template<
size_t FirstN,
6843 template<
typename...>
class TemplateClass,
6844 typename... InnerTypes,
typename... Types>
6847 static_assert(FirstN <=
sizeof...(Types),
"FirstN is out of range");
6850 using class_t = std::conditional_t<is_valid_type_v<n_types>,
6856 template<
size_t FirstN,
typename TemplateClass,
typename... Types>
6863 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6868 using base_type = ContainerType< std::tuple<ElementTypes...> >;
6869 using base_type::base_type;
6877 template<
typename KeyType,
typename... ElementTypes>
6879 :
public std::map<KeyType, std::tuple<ElementTypes...>>
6883 using base_type = std::map<KeyType, std::tuple<ElementTypes...>>;
6884 using base_type::base_type;
6892 template<
typename KeyType,
typename... ElementTypes>
6894 :
public std::multimap<KeyType, std::tuple<ElementTypes...>>
6898 using base_type = std::multimap<KeyType, std::tuple<ElementTypes...>>;
6899 using base_type::base_type;
6907 template<
typename KeyType,
typename... ElementTypes>
6909 :
public std::unordered_map<KeyType, std::tuple<ElementTypes...>>
6913 using base_type = std::unordered_map<KeyType, std::tuple<ElementTypes...>>;
6914 using base_type::base_type;
6922 template<
typename KeyType,
typename... ElementTypes>
6924 :
public std::unordered_multimap<KeyType, std::tuple<ElementTypes...>>
6928 using base_type = std::unordered_multimap<KeyType, std::tuple<ElementTypes...>>;
6929 using base_type::base_type;
6937 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6943 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6949 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
6952 template<
typename... ElementTypes>
6955 template<
typename... ElementTypes>
6958 template<
typename... ElementTypes>
6961 template<
typename... ElementTypes>
6964 template<
typename KeyType,
typename... ElementTypes>
6967 template<
typename KeyType,
typename... ElementTypes>
6970 template<
typename KeyType,
typename... ElementTypes>
6973 template<
typename KeyType,
typename... ElementTypes>
6979 template<
typename Type,
typename... Types>
6982 template<
template<
typename...>
class ClassTemplate,
typename... Types>
6985 template<
size_t SelectTypeIndex,
typename TemplateClass,
typename... Types>
6989 template<
size_t FirstN,
typename TemplateClass,
typename... Types>
6993 template<
size_t FirstN,
template<
typename...>
typename TemplateClass,
typename... Types>
6997 template<
template<
typename,
typename...>
class ContainerType,
typename... ElementTypes>
7000 template<
typename... ElementTypes>
7003 template<
typename... ElementTypes>
7006 template<
typename... ElementTypes>
7009 template<
typename... ElementTypes>
7012 template<
typename KeyType,
typename... ElementTypes>
7015 template<
typename KeyType,
typename... ElementTypes>
7018 template<
typename KeyType,
typename... ElementTypes>
7021 template<
typename KeyType,
typename... ElementTypes>
7024 template<
template<
typename,
typename...>
class ContainerType,
7025 typename EleType,
typename... Types>
7026 auto erase(ContainerType<EleType, Types...>& container,
size_t index)
7028 auto itr = container.begin();
7029 std::advance(itr, index);
7030 return container.erase(itr);
7033 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7036 if(container.empty())
7043 auto front = container.front();
7046 container.pop_front();
7049 auto front_itr = container.begin();
7050 container.erase(front_itr);
7059 auto front = *container.begin();
7060 container.pop_front();
7065 auto front_itr = container.begin();
7066 auto front = *front_itr;
7067 container.erase(front_itr);
7073 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7074 auto pop_back(ContainerType<Type, Types...>& container)
7076 if(container.empty())
7081 auto back = container.back();
7082 container.pop_back();
7086 template<
template<
typename,
typename...>
class ContainerType,
7087 typename EleType,
typename Type,
typename... Types>
7088 void push_front(ContainerType<Type, Types...>& container, EleType&& ele)
7092 container.push_front(std::forward<EleType>(ele));
7096 container.insert(container.cbegin(), std::forward<EleType>(ele));
7100 container.insert(std::forward<EleType>(ele));
7108 template<
template<
typename,
typename...>
class ContainerType,
7109 typename EleType,
typename Type,
typename... Types>
7110 void push_back(ContainerType<Type, Types...>& container, EleType&& ele)
7114 container.push_back(std::forward<EleType>(ele));
7118 container.insert(container.cend(), std::forward<EleType>(ele));
7122 container.insert(std::forward<EleType>(ele));
7130 template<
template<
typename,
typename...>
class ContainerType,
7131 typename... EleTypes,
typename Type,
typename... Types>
7132 void emplace_front(ContainerType<Type, Types...>& container, EleTypes&&... eles)
7136 container.emplace_front(std::forward<EleTypes>(eles)...);
7140 container.emplace(container.cbegin(), std::forward<EleTypes>(eles)...);
7144 container.insert(container.cbegin(), std::forward<EleTypes>(eles)...);
7148 template<
template<
typename,
typename...>
class ContainerType,
7149 typename... EleTypes,
typename Type,
typename... Types>
7150 void emplace_back(ContainerType<Type, Types...>& container, EleTypes&&... eles)
7154 container.emplace_back(std::forward<EleTypes>(eles)...);
7158 container.emplace_back(container.cend(), std::forward<EleTypes>(eles)...);
7162 container.insert(container.cend(), std::forward<EleTypes>(eles)...);
7166 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7169 return {container.crbegin(), container.crend()};
7172 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7175 container = ContainerType<
Type, Types...>{container.crbegin(), container.crend()};
7178 template<
bool bReverseOrder,
typename TargetContainerType,
typename SourceContainerType>
7181 if constexpr(std::is_rvalue_reference_v<
decltype(source_container)>)
7183 if constexpr (bReverseOrder)
7185 target_container.insert(target_container.cend(),
7186 std::make_move_iterator(source_container.rbegin()),
7187 std::make_move_iterator(source_container.rend()));
7191 target_container.insert(target_container.cend(),
7192 std::make_move_iterator(source_container.begin()),
7193 std::make_move_iterator(source_container.end()));
7198 if constexpr(bReverseOrder)
7200 target_container.insert(target_container.cend(),
7201 source_container.crbegin(),
7202 source_container.crend());
7206 target_container.insert(target_container.cend(),
7207 source_container.cbegin(),
7208 source_container.cend());
7213 template<
bool bReverseOrder,
typename TargetContainerType,
typename SourceContainerType>
7216 if constexpr(std::is_rvalue_reference_v<
decltype(source_container)>)
7218 if constexpr(bReverseOrder)
7220 target_container.insert(target_container.cbegin(),
7221 std::make_move_iterator(source_container.rbegin()),
7222 std::make_move_iterator(source_container.rend()));
7226 target_container.insert(target_container.cbegin(),
7227 std::make_move_iterator(source_container.begin()),
7228 std::make_move_iterator(source_container.end()));
7233 if constexpr (bReverseOrder)
7235 target_container.insert(target_container.cbegin(),
7236 source_container.crbegin(),
7237 source_container.crend());
7241 target_container.insert(target_container.cbegin(),
7242 source_container.cbegin(),
7243 source_container.cend());
7248 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7254 static_assert(common_type_v<parameter_types>,
"Common Type Does Not Exist");
7256 if constexpr(is_same_v<parameter_types>)
7258 using container_t = ContainerType<common_type>;
7260 return container_t{ std::forward<Type>(arg), std::forward<Types>(args)... };
7262 else if constexpr(tpf::types::is_integral_v<common_type>)
7265 if constexpr (are_unsigned_integrals_v<parameter_types>)
7267 using container_t = ContainerType<common_type>;
7269 return container_t{
static_cast<common_type
>(std::forward<Type>(arg) ),
7270 static_cast<common_type
>( std::forward<Types>(args) )...};
7274 using element_t = std::make_signed_t<common_type>;
7275 using container_t = ContainerType<element_t>;
7278 static_cast<element_t>(std::forward<Type>(arg)),
7279 static_cast<element_t>(std::forward<Types>(args))... };
7285 using container_t = ContainerType<element_t>;
7287 return container_t{
static_cast<element_t>(std::forward<Type>(arg)),
7288 static_cast<element_t>(std::forward<Types>(args))... };
7292 template<
typename Type,
typename... Types>
7298 static_assert(common_type_v<parameter_types>,
"Common Type Does Not Exist");
7300 if constexpr(is_same_v<parameter_types>)
7302 using container_t = std::vector<common_type>;
7304 return container_t{ std::forward<Type>(arg), std::forward<Types>(args)... };
7306 else if constexpr(tpf::types::is_integral_v<common_type>)
7309 if constexpr (are_unsigned_integrals_v<parameter_types>)
7311 using container_t = std::vector<common_type>;
7313 return container_t{
static_cast<common_type
>(std::forward<Type>(arg) ),
7314 static_cast<common_type
>( std::forward<Types>(args) )...};
7318 using element_t = std::make_signed_t<common_type>;
7319 using container_t = std::vector<element_t>;
7322 static_cast<element_t>(std::forward<Type>(arg)),
7323 static_cast<element_t>(std::forward<Types>(args))... };
7329 using container_t = std::vector<element_t>;
7331 return container_t{
static_cast<element_t>(std::forward<Type>(arg)),
7332 static_cast<element_t>(std::forward<Types>(args))... };
7336 template<
typename Type,
typename... Types>
7342 static_assert(common_type_v<parameter_types>,
"Common Type Does Not Exist");
7344 if constexpr(is_same_v<parameter_types>)
7346 using container_t = std::deque<common_type>;
7348 return container_t{ std::forward<Type>(arg), std::forward<Types>(args)... };
7350 else if constexpr(tpf::types::is_integral_v<common_type>)
7353 if constexpr (are_unsigned_integrals_v<parameter_types>)
7355 using container_t = std::deque<common_type>;
7357 return container_t{
static_cast<common_type
>(std::forward<Type>(arg) ),
7358 static_cast<common_type
>( std::forward<Types>(args) )...};
7362 using element_t = std::make_signed_t<common_type>;
7363 using container_t = std::deque<element_t>;
7366 static_cast<element_t>(std::forward<Type>(arg)),
7367 static_cast<element_t>(std::forward<Types>(args))... };
7373 using container_t = std::deque<element_t>;
7375 return container_t{
static_cast<element_t>(std::forward<Type>(arg)),
7376 static_cast<element_t>(std::forward<Types>(args))... };
7389 template<
typename ArgType,
typename... ArgTypes>
7392 constexpr bool common_exisits =
7395 if constexpr (common_exisits)
7399 return std::vector { smart_forward<ele_t, ArgType>(arg),
7400 smart_forward<ele_t, ArgTypes>(args)... };
7404 return std::tuple{ std::forward<ArgType>(arg), std::forward<ArgTypes>(args)... };
7408 template<
template<
typename,
typename...>
class ContainerType,
7409 typename ArgType,
typename... ArgTypes>
7412 constexpr bool common_exisits =
7415 if constexpr (common_exisits)
7419 return ContainerType{ smart_forward<ele_t, ArgType>(arg),
7420 smart_forward<ele_t, ArgTypes>(args)... };
7424 return std::tuple{ std::forward<ArgType>(arg), std::forward<ArgTypes>(args)... };
7428 template<
template<
typename, std::
size_t>
class ContainerType,
7429 typename ArgType,
typename... ArgTypes>
7432 constexpr bool common_exisits =
7435 if constexpr (common_exisits)
7439 return ContainerType{ smart_forward<ele_t, ArgType>(arg),
7440 smart_forward<ele_t, ArgTypes>(args)... };
7444 return std::tuple{ std::forward<ArgType>(arg), std::forward<ArgTypes>(args)... };
7457 template<
typename ArgType,
typename... ArgTypes>
7460 constexpr bool common_exisits =
7463 if constexpr (common_exisits)
7467 return std::array { smart_forward<ele_t, ArgType>(arg),
7468 smart_forward<ele_t, ArgTypes>(args)... };
7472 return std::tuple{ std::forward<ArgType>(arg), std::forward<ArgTypes>(args)... };
7476 #if !defined(__clang_major__)
7478 template<
typename Type,
typename... Types>
7483 if constexpr(is_same_v<parameter_types> || common_type_v<parameter_types>)
7485 return make_vector(std::forward<Type>(arg), std::forward<Types>(args)...);
7491 return std::vector<element_t>{
element_t{ std::forward<Type>(arg) },
7492 element_t{ std::forward<Types>(args) }... };
7498 template<
typename ContainerType>
7502 ContainerType m_container;
7507 m_container{ container } { }
7509 auto empty() const noexcept {
return m_container.empty(); }
7510 auto size() const noexcept {
return m_container.size(); }
7514 static_assert(!is_const_reference_v<ContainerType>,
"--- use const auto&");
7516 return m_container.rbegin();
7521 static_assert(!is_const_reference_v<ContainerType>,
"--- use const auto&");
7522 return m_container.rend();
7527 return m_container.crbegin();
7530 decltype(
auto)
cend()
const noexcept
7532 return m_container.crend();
7539 return container_type{ m_container.crbegin(), m_container.crend() };
7543 template<
typename ElementType,
size_t ElementCount>
7547 using ContainerType = ElementType(&)[ElementCount];
7549 ContainerType m_container;
7552 auto empty() const noexcept {
return false; }
7553 auto size() const noexcept {
return ElementCount; }
7574 decltype(
auto)
cend()
const noexcept
7581 using element_t = std::remove_cv_t<ElementType>;
7582 return std::vector<element_t>{ cbegin(), cend() };
7586 template<
typename ContainerType>
7591 return reserve_t{ std::forward<ContainerType>(container) };
7594 template<
typename ElementType,
size_t ElementCount>
7597 using array_type = ElementType(&)[ElementCount];
7601 return reverse_t{array};
7604 template<
typename Type,
typename... Types>
7609 static_assert(common_type_v<parameter_types>,
"Common Type Does Not Exist");
7611 auto v =
make_vector(std::forward<Type>(arg), std::forward<Types>(args)...);
7613 return reverse_st<
decltype(v)>{ std::move(v) };
7616 template<
typename ContainerType,
typename IndexType>
7621 if constexpr(tpf::types::is_index_operator_available_v<container_t>)
7623 return container[(size_t)index];
7627 if constexpr(std::is_const_v<ContainerType>)
7629 auto itr = container.cbegin();
7630 std::advance(itr, index);
7635 auto itr = container.begin();
7636 std::advance(itr, index);
7642 template<
size_t StartIndex,
size_t EndIndex>
7646 template<
typename VisitorType,
typename PairType>
7647 static std::enable_if_t<is_pair_of_variant_v<remove_cv_ref_t<PairType>>>
7650 if constexpr(StartIndex < EndIndex)
7652 auto& [key, vt] = vpr;
7654 if(
auto ptr = std::get_if<StartIndex>(&vt))
7656 std::get<StartIndex>(visitors.m_visitors)(key, *ptr);
7661 if constexpr(StartIndex + 1 < EndIndex)
7665 std::forward<PairType>(vpr));
7669 template<
typename VisitorType,
typename VariantType>
7670 static std::enable_if_t<is_variant_v<remove_cv_ref_t<VariantType>>>
7673 if constexpr(StartIndex < EndIndex)
7675 if(
auto ptr = std::get_if<StartIndex>(&vpr))
7677 std::get<StartIndex>(visitors.m_visitors)(*ptr);
7682 if constexpr(StartIndex + 1 < EndIndex)
7686 std::forward<VariantType>(vpr));
7692 template<
typename VisitorType,
typename IteratorType,
typename PairType>
7693 static std::enable_if_t<is_pair_of_variant_v<remove_cv_ref_t<PairType>>>
7696 if constexpr(StartIndex < EndIndex)
7698 auto& [key, vt] = vpr;
7700 if(
auto ptr = std::get_if<StartIndex>(&vt))
7702 std::get<StartIndex>(visitors.m_visitors)(std::forward<IteratorType>(itr), key, *ptr);
7707 if constexpr(StartIndex + 1 < EndIndex)
7711 std::forward<IteratorType>(itr), std::forward<PairType>(vpr));
7715 template<
typename VisitorType,
typename IteratorType,
typename VariantType>
7716 static std::enable_if_t<is_variant_v<remove_cv_ref_t<VariantType>>>
7719 if constexpr(StartIndex < EndIndex)
7721 if(
auto ptr = std::get_if<StartIndex>(&vpr))
7723 std::get<StartIndex>(visitors.m_visitors)(std::forward<IteratorType>(itr), *ptr);
7728 if constexpr(StartIndex + 1 < EndIndex)
7732 std::forward<IteratorType>(itr), std::forward<VariantType>(vpr));
7738 template<
typename VisitorType,
typename PairType>
7739 std::enable_if_t<is_pair_of_variant_v<remove_cv_ref_t<PairType>>>
7743 using second_type =
typename pair_t::second_type;
7749 template<
typename VisitorType,
typename VariantType>
7750 std::enable_if_t<is_variant_v<remove_cv_ref_t<VariantType>>>
7757 std::forward<VariantType>(vt));
7760 template<
typename VisitorType,
typename IteratorType,
typename PairType>
7761 std::enable_if_t<is_pair_of_variant_v<remove_cv_ref_t<PairType>>>
7765 using second_type =
typename pair_t::second_type;
7769 std::forward<IteratorType>(itr), std::forward<PairType>(vpr));
7772 template<
typename VisitorType,
typename IteratorType,
typename VariantType>
7773 std::enable_if_t<is_variant_v<remove_cv_ref_t<VariantType>>>
7780 std::forward<IteratorType>(itr), std::forward<VariantType>(vt));
7784 template<
typename... CallbackTypes>
7794 template<
typename Type>
7800 template<
typename ContainerType>
7803 for(
decltype(
auto) item: std::forward<ContainerType>(container))
7809 template<
typename ContainerType>
7812 for(
decltype(
auto) item:
reverse(std::forward<ContainerType>(container)))
7819 template<
typename ContainerType>
7822 if constexpr (is_const_reference_v<ContainerType>)
7824 for(
auto itr = container.cbegin(); itr != container.cend(); ++itr)
7826 std::forward<
decltype(*itr)>(*itr));
7830 for(
auto itr = container.begin(); itr != container.end(); ++itr)
7832 std::forward<
decltype(*itr)>(*itr));
7837 template<
typename ContainerType>
7840 if constexpr (is_const_reference_v<ContainerType>)
7842 for(
auto itr = container.cbegin(); itr != container.cend(); ++itr)
7844 auto index = std::distance(container.cbegin(), itr);
7845 visit_variant(*
this, index, std::forward<
decltype(*itr)>(*itr));
7850 for(
auto itr = container.begin(); itr != container.end(); ++itr)
7852 auto index = std::distance(container.begin(), itr);
7853 visit_variant(*
this, index, std::forward<
decltype(*itr)>(*itr));
7858 template<
typename ContainerType>
7864 template<
typename ContainerType>
7871 template<
typename VariantType>
7872 std::enable_if_t<is_variant_v<remove_cv_ref_t<VariantType>>>
7878 template<
typename PairType>
7879 std::enable_if_t<is_pair_of_variant_v<remove_cv_ref_t<PairType>>>
7886 template<
typename... CallbackTypes>
7889 template<
typename... CallbackTypes>
7893 return { std::forward<CallbackTypes>(visitors)... };
7898 template<
typename ContainerType,
typename IndexType>
7901 return tpf::types::get_element<ContainerType, IndexType>(container, index);
7904 template<
template<
typename,
typename...>
class ContainerType,
typename Type,
typename... Types>
7907 return types::make_random_access_container<ContainerType>(std::forward<Type>(arg), std::forward<Types>(args)...);
7910 template<
typename Type,
typename... Types>
7916 template<
typename Type,
typename... Types>
7919 return types::make_deque(std::forward<Type>(arg), std::forward<Types>(args)...);
7922 template<
typename Type,
typename... Types>
7928 template<
template<
typename,
typename...>
class ContainerType,
7929 typename Type,
typename... Types>
7932 return types::make_container<ContainerType>(std::forward<Type>(arg), std::forward<Types>(args)...);
7935 template<
template<
typename, std::
size_t>
class ContainerType,
7936 typename Type,
typename... Types>
7939 return types::make_container<ContainerType>(std::forward<Type>(arg), std::forward<Types>(args)...);
7942 template<
typename Type,
typename... Types>
7948 #if !defined(__clang_major__)
7950 template<
typename Type,
typename... Types>
7958 template<
typename ContainerType>
7964 template<
typename ElementType,
size_t ElementCount>
7965 decltype(
auto)
reverse(ElementType(&array)[ElementCount])
7970 template<
typename Type,
typename... Types>
7971 decltype(
auto)
reverse(Type&& arg, Types&&... args)
7973 return types::reverse(std::forward<Type>(arg), std::forward<Types>(args)...);
7976 template<
typename IndexType,
typename ContainerType,
typename iterator_type>
7980 using diff_t =
typename iterator_type::difference_type;
7981 auto pos = cntr.begin(); std::advance(pos, (diff_t)index);
7985 template<
typename IndexType,
typename ContainerType,
typename reverse_iterator_type>
7989 using diff_t =
typename reverse_iterator_type::difference_type;
7990 auto pos = cntr.begin(); std::advance(pos, (diff_t)index);
7992 return reverse_iterator_type{ pos };
7995 template<
typename ContainerType,
typename iterator_type>
7998 return (
size_t)std::distance(cntr.begin(), itr);
8001 template<
typename ContainerType,
typename reverse_iterator_type>
8004 auto itr =
typename ContainerType::iterator_type{ rev_itr.base() };
8005 return (
size_t)std::distance(cntr.begin(), itr);
8009 typename ContainerType,
8010 typename container_t,
8011 typename iterator_type,
8012 typename reverse_iterator_type>
8015 using container_type =
decltype(cntr);
8019 return [](iterator_type begin,
auto&& offset, iterator_type end)
8023 if constexpr(tpf::types::is_integral_v<offset_t>)
8025 using diff_t =
typename iterator_type::difference_type;
8026 auto offset_pos = begin; std::advance(offset_pos, (diff_t)offset);
8028 return std::rotate(begin, offset_pos, end);
8030 else if constexpr(std::is_same_v<reverse_iterator_type, offset_t>)
8032 return std::rotate(begin, offset.base()-1, end);
8035 return std::rotate(begin, offset, end);
8040 return [](iterator_type begin,
auto&& offset, iterator_type end)
8044 if constexpr(tpf::types::is_integral_v<offset_t>)
8046 using diff_t =
typename reverse_iterator_type::difference_type;
8048 auto offset_pos = reverse_iterator_type{end};
8049 std::advance(offset_pos, (diff_t)offset);
8051 return std::rotate(reverse_iterator_type{end},
8052 offset_pos, reverse_iterator_type{begin});
8054 else if constexpr(std::is_same_v<reverse_iterator_type, offset_t>)
8055 return std::rotate(reverse_iterator_type{end}, offset, reverse_iterator_type{begin});
8057 return std::rotate(reverse_iterator_type{end},
8058 reverse_iterator_type{offset}, reverse_iterator_type{begin});
8064 typename ContainerType,
8065 typename container_t,
8066 typename iterator_type,
8067 typename reverse_iterator_type,
8068 typename execution_policy_type>
8071 using container_type =
decltype(cntr);
8075 return [policy](iterator_type begin,
auto&& offset, iterator_type end)
8079 if constexpr(tpf::types::is_integral_v<offset_t>)
8081 using diff_t =
typename iterator_type::difference_type;
8082 auto offset_pos = begin; std::advance(offset_pos, (diff_t)offset);
8084 return std::rotate(policy, begin, offset_pos, end);
8086 else if constexpr(std::is_same_v<reverse_iterator_type, offset_t>)
8088 return std::rotate(policy, begin, offset.base()-1, end);
8091 return std::rotate(policy, begin, offset, end);
8096 return [policy](iterator_type begin,
auto&& offset, iterator_type end)
8100 if constexpr(tpf::types::is_integral_v<offset_t>)
8102 using diff_t =
typename reverse_iterator_type::difference_type;
8104 auto offset_pos = reverse_iterator_type{end};
8105 std::advance(offset_pos, (diff_t)offset);
8107 return std::rotate(policy, reverse_iterator_type{end},
8108 offset_pos, reverse_iterator_type{begin});
8110 else if constexpr(std::is_same_v<reverse_iterator_type, offset_t>)
8111 return std::rotate(policy, reverse_iterator_type{end}, offset, reverse_iterator_type{begin});
8113 return std::rotate(policy, reverse_iterator_type{end},
8114 reverse_iterator_type{offset}, reverse_iterator_type{begin});
8126#define Tpf_IsTemplateV(type_arg) tpf::types::is_template_v<type_arg>
8132#define Tpf_IsTemplateInstanceV(instance_arg) tpf::types::is_template_v<decltype(instance_arg)>
reference_wrapper< Type > ref(Type &val) noexcept
std::deque< set_t > sets_t
typename enable_if< predicate, ReturnType >::type enable_if_t
This class implements all debugging requirements for C++ Library Extension.
virtual const char * what() const noexcept override
debug_exception(std::string message, int lineno, std::string file_name)
std::map< KeyType, std::tuple< ElementTypes... > > base_type
typename base_type::value_type value_type
std::tuple< ElementTypes... > tuple_type
typename base_type::value_type value_type
std::tuple< ElementTypes... > tuple_type
std::multimap< KeyType, std::tuple< ElementTypes... > > base_type
std::tuple< ElementTypes... > tuple_type
std::unordered_map< KeyType, std::tuple< ElementTypes... > > base_type
typename base_type::value_type value_type
typename base_type::value_type value_type
std::tuple< ElementTypes... > tuple_type
std::unordered_multimap< KeyType, std::tuple< ElementTypes... > > base_type
typename base_type::value_type value_type
ContainerType< std::tuple< ElementTypes... > > base_type
decltype(auto) crend() const noexcept
std::map< KeyType, std::variant< ElementTypes... > > base_type
decltype(auto) crbegin() const noexcept
typename base_type::value_type value_type
typename base_type::value_type value_type
std::multimap< KeyType, std::variant< ElementTypes... > > base_type
std::pair< KeyType, std::variant< ElementTypes... > > base_type
typename base_type::first_type first_type
typename base_type::second_type second_type
typename base_type::value_type value_type
std::unordered_map< KeyType, std::variant< ElementTypes... > > base_type
typename base_type::value_type value_type
std::unordered_multimap< KeyType, std::variant< ElementTypes... > > base_type
typename base_type::value_type value_type
ContainerType< std::variant< ElementTypes... > > base_type
decltype(auto) crend() const noexcept
decltype(auto) crbegin() const noexcept
decltype(auto) begin() noexcept
auto empty() const noexcept
std::reverse_iterator< ElementType * > reverse_iterator
reverse_st(ContainerType container)
decltype(auto) end() noexcept
decltype(auto) cbegin() const noexcept
decltype(auto) cend() const noexcept
auto size() const noexcept
decltype(auto) begin() noexcept
decltype(auto) cbegin() const noexcept
reverse_st(ContainerType container)
auto empty() const noexcept
auto size() const noexcept
decltype(auto) cend() const noexcept
decltype(auto) end() noexcept
static constexpr Type tag
const Type & get() const noexcept
tag_type(const tag_type &) noexcept=default
tag_type(Type v=Type{}) noexcept
tag_type(tag_type &&) noexcept=default
tag_type(ArgType arg, ArgTypes... args) noexcept
tag_type & operator=(const tag_type &) noexcept=default
std::common_type_t< S, T > common_t
constexpr auto make_tuple(ArgTypes &&... args) noexcept
constexpr decltype(auto) apply(F &&f, T(&&c_array)[N])
constexpr decltype(auto) get(T(&c_array)[N]) noexcept
Implements set operations.
constexpr auto is_signed_integral_v
typename st_is_arg_list< Type >::type arg_to_type_t
constexpr auto is_same_template_v
constexpr bool is_tag_type_v
no_type_t safe_apply(...)
container_of_tuples_t< std::vector, ElementTypes... > vector_of_tuples_t
constexpr bool is_division_valid_v
typename push_back_type_st< ArgType, Types... >::type push_back_type_t
constexpr auto sequence_span_v
typename union_type_st< LeftList, RightList >::type union_type_t
typename st_reverse_sequence< SequenceType >::type reverse_sequence_t
typename replace_type_st< NewType, OldType, TypeList >::type replace_type_t
constexpr bool is_reserve_available_v
constexpr bool is_pop_back_available_v
typename container_of_variants_st< ContainerType, KeyType, unique_types_t< ElementTypes... > >::type container_map_of_variants_t
no_type_t subtraction_vaild_fn(...)
decltype(iterator_value_type_fn(std::declval< T >())) iterator_value_type_t
container_of_tuples_t< std::unordered_map, KeyType, ElementTypes... > unordered_map_of_tuples_t
container_of_variants_t< std::unordered_set, ElementTypes... > unordered_set_of_variants_t
constexpr auto is_index_operator_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.operator[]((size_t) 1))
constexpr bool is_emplace_back_available_v
std::enable_if_t<!is_integer_v< Type >, ReturnType > enable_if_not_integer_t
container_of_tuples_t< std::multimap, KeyType, ElementTypes... > multimap_of_tuples_t
auto for_tuple(FuncType &&f, typed_sequence_t< Ints... >)
typename make_unsigned_integral_st< Type, is_integral_v< Type > >::type make_unsigned_integral_t
constexpr auto is_shrink_to_fit_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.shrink_to_fit())
constexpr auto are_real_numbers_v
constexpr auto is_signed_integer_v
constexpr auto is_emplace_front_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.emplace_front(std::declval< Type >()))
constexpr auto is_pair_of_variant_v
constexpr auto is_back_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.back())
typename select_first_type_st< Types... >::type select_first_type_t
auto for_array(FuncType &&f, typed_sequence_t< Ints... >)
std::enable_if_t< is_signed_integral_v< Type >, ReturnType > enable_if_signed_integral_t
constexpr auto compute_span()
constexpr auto is_insert_iterator_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.insert(arg.cend(), std::declval< Type >()))
typename append_type_st< ArgType, RightList >::type append_type_t
constexpr bool is_integer_sequence_v
typename st_has_tuple_common_type< TupleType >::type tuple_common_element_t
constexpr bool is_rbegin_available_v
container_of_tuples_t< std::unordered_multimap, KeyType, ElementTypes... > unordered_multimap_of_tuples_t
constexpr auto sequence_nth_element_v
typename st_tuple_to_type_list< TupleType >::type tuple_to_type_list_t
constexpr auto is_rbegin_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.rbegin())
constexpr bool is_empty_available_v
constexpr auto is_end_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.end())
typename return_type_st< Type >::type return_type_t
constexpr bool is_subtraction_valid_v
std::enable_if_t< is_iterator_type_v< Type >, ReturnType > enable_if_iterator_type_t
container_map_of_variants_t< std::unordered_multimap, KeyType, ElementTypes... > unordered_multimap_of_variants_t
constexpr auto is_emplace_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.emplace(arg.cbegin(), std::declval< Type >()))
constexpr auto is_same_template_type_v
constexpr bool is_index_operator_available_v
constexpr auto is_reference_wrapper_v
constexpr bool is_template_type_v
constexpr auto are_unsigned_integrals_v
container_of_variants_t< std::unordered_multiset, ElementTypes... > unordered_multiset_of_variants_t
typename st_type_list_to_tuple< TypeList >::type type_list_to_tuple_t
constexpr bool is_arithmetic_valid_v
constexpr bool is_in_list_v
constexpr bool is_addition_valid_v
auto set_tuple_to_container(TupleType &&tuple, typed_sequence_t< Indices... >)
typename first_n_types_st< FirstN, type_list_t<>, RightTypes... >::type first_n_types_t
constexpr auto template_parameter_count
constexpr bool is_begin_available_v
typename push_front_type_st< ArgType, Types... >::type push_front_type_t
typename nth_type_to_template_class_st< TypeIndex, TemplateClass, Types... >::type nth_type_to_template_class_t
constexpr auto is_resize_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.resize(std::declval< size_t >()))
container_map_of_variants_t< std::unordered_map, KeyType, ElementTypes... > unordered_map_of_variants_t
constexpr bool is_rend_available_v
typename container_of_variants_st< ContainerType, unique_types_t< ElementTypes... > >::type container_of_variants_t
constexpr auto is_push_front_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.push_front(std::declval< Type >()))
auto set_array_to_tuple(const std::array< T, Size > &array, typed_sequence_t< Indices... >)
container_of_tuples_t< std::deque, ElementTypes... > deque_of_tuples_t
typename last_n_types_st< LastN, LeftTypes... >::type last_n_types_t
std::enable_if_t< is_type_in_list_v< TestType, TypeList >, ReturnType > enable_if_in_list_t
constexpr auto common_type_v
constexpr bool is_container_type_v
constexpr auto is_basic_string_v
std::enable_if_t< is_integral_v< Type >, ReturnType > enable_if_integral_t
constexpr auto is_tuple_empty_v
typename make_signed_st< Type, is_integer_v< Type > >::type make_signed_t
container_map_of_variants_t< std::pair, KeyType, ElementTypes... > pair_of_variants_t
constexpr auto sequence_first_element_v
constexpr auto is_unique_ptr_v
typename st_sequence_element_type< T >::type sequence_element_t
container_map_of_variants_t< std::multimap, KeyType, ElementTypes... > multimap_of_variants_t
container_of_tuples_t< std::map, KeyType, ElementTypes... > map_of_tuples_t
void drive_workhorse(WorkhorseType &&workhorse, typed_sequence_t< Indices... >)
constexpr bool is_insert_available_v
typename pop_back_type_wrapper_st< Types... >::type pop_back_type_t
typename make_unsigned_st< Type, is_integer_v< Type > >::type make_unsigned_t
std::remove_reference_t< decltype(is_operable_fn(std::declval< Type1 >(), std::declval< Type2 >()))> is_operable_t
typename to_tuple_st< Types... >::type to_tuple_t
constexpr bool is_capacity_available_v
container_of_variants_t< std::set, ElementTypes... > set_of_variants_t
std::enable_if_t< is_iterator_type_v< T >, iterator_value_type_t< T > > enable_if_iterator_value_type_t
std::enable_if_t< std::is_invocable_v< remove_cvref_t< WorkhorseType >, indexer_t< 0 > > > run_workhorse(WorkhorseType &&workhorse, typed_sequence_t< Indices... >)
constexpr auto is_operable_fn(Type1 &&arg1, Type2 &&arg2) noexcept(noexcept(std::declval< remove_cv_ref_t< Type1 > >()) &&noexcept(std::declval< remove_cv_ref_t< Type2 > >())) -> decltype(true ? arg1 :arg2)
last_type_t< template_parameter_type_list_t< Type > > last_parameter_type_t
auto tuple_addition_operator(const std::tuple< ArgTypes1... > &tuple_a, const std::tuple< ArgTypes2... > &tuple_b)
constexpr auto is_emplace_back_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.emplace_back(std::declval< Type >()))
typename st_recursive_type_list< T >::type to_recursive_type_list_t
constexpr auto is_integer_v
constexpr bool is_emplace_front_available_v
typename remove_type_wrapper_st< ArgType, Types... >::type remove_type_t
select_nth_type_t< SelectIndex, Types... > nth_type_t
void process_arguments(ArgTypes &&...)
no_type_t array_apply(...)
constexpr auto are_unsigned_integers_v
auto set_tuple_to_array(TupleType &&tuple, typed_sequence_t< Indices... >)
constexpr auto are_numerical_numbers_v
constexpr auto is_map_or_unordered_map_v
constexpr auto is_integral_v
std::enable_if_t< is_container_type_v< remove_cv_ref_t< Type > >, ReturnType > enable_if_container_type_t
constexpr auto is_pop_back_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.pop_back())
constexpr bool is_resize_available_v
typename st_unique_ptr_wrapper_deleter< deleter, ArgTypes... >::type make_unique_ptr_deleter_wrapper_t
constexpr bool is_void_return_type_v
typename is_map_or_unordered_map_st< remove_cv_ref_t< Type > >::type map_or_unordered_map_pair_t
constexpr auto sequence_last_element_v
select_first_type_t< Types... > first_type_t
constexpr bool is_push_back_available_v
typename types_to_template_class_wrapper_st< Type, Types... >::type types_to_template_class_t
constexpr auto is_variant_v
auto tuple_addition(const std::tuple< ArgTypes1... > &tuple_a, const std::tuple< ArgTypes2... > &tuple_b, types::typed_sequence_t< Indices... >)
typename st_common_type_solver< Types... >::type common_type_t
constexpr bool is_callable_v
no_type_t addition_vaild_fn(...)
constexpr auto is_operable_v
select_first_type_t< Types... > front_type_t
constexpr auto type_count_v
typename first_n_types_to_template_class_st< FirstN, TemplateClass, Types... >::type first_n_types_to_template_class_t
constexpr auto is_template_template_v
std::enable_if_t< is_numerical_number_v< Type >, ReturnType > enable_if_numerical_number_t
constexpr bool is_end_available_v
typename unique_types_st< type_list_t<>, Types... >::type unique_types_t
container_of_variants_t< std::list, ElementTypes... > list_of_variants_t
container_of_tuples_t< std::set, ElementTypes... > set_of_tuples_t
typename pop_front_wrapper_st< Types... >::type pop_front_type_t
constexpr auto are_signed_integrals_v
select_last_type_t< Types... > back_type_t
no_type_t function_return_type_fn(...)
constexpr auto are_integers_v
constexpr bool has_tuple_common_type_v
constexpr auto is_type_list_equivalent_v
std::enable_if_t< is_unsigned_integral_v< Type >, ReturnType > enable_if_unsigned_integral_t
constexpr auto is_tuple_v
constexpr auto are_signed_integers_v
typename intersection_type_st< LeftList, RightList >::type intersection_type_t
std::enable_if_t< is_unsigned_integer_v< Type >, ReturnType > enable_if_unsigned_integer_t
constexpr bool is_insert_iterator_available_v
constexpr auto fn_create_sequence_in_order(std::integer_sequence< T, Indices... >, st_workhorse_range< T, Begin, End, Increment >)
typename is_template_st< Type >::type template_parameter_type_list_t
container_of_tuples_t< std::list, ElementTypes... > list_of_tuples_t
constexpr auto is_reserve_valid_fn(ContainerType< Type, Types... > &&arg) -> decltype(arg.reserve((size_t) 0))
std::enable_if_t< is_real_number_v< Type >, ReturnType > enable_if_real_number_t
constexpr auto is_unsigned_integral_v
auto evaluate_lambdas_tuple(typed_sequence_t< Indices... >, TupleType &&tuple, ArgTuple &&arguments)
typename make_signed_integral_st< Type, is_integral_v< Type > >::type make_signed_integral_t
first_n_types_t< FirstN, RightTypes... > select_first_n_types_t
typename to_variant_st< Type, Types... >::type to_variant_t
select_last_type_t< Types... > last_type_t
constexpr bool is_type_list_v
no_type_t division_vaild_fn(...)
container_map_of_variants_t< std::map, KeyType, ElementTypes... > map_of_variants_t
constexpr auto is_capacity_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.capacity())
constexpr auto is_pop_front_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.pop_front())
typename type_list_to_template_class_wrapper_st< ClassTemplate, Types... >::type type_list_to_template_class_t
container_of_variants_t< std::vector, ElementTypes... > vector_of_variants_t
constexpr bool is_iterator_excluding_pointer_v
constexpr auto is_size_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.size())
constexpr bool is_push_front_available_v
typename difference_type_st< LeftList, RightList >::type difference_type_t
constexpr auto is_unsigned_integer_v
constexpr auto is_erase_valid_fn(ContainerType< Type, Types... > &&arg) -> decltype(arg.erase(arg.cbegin()))
constexpr bool is_emplace_available_v
last_n_types_t< LastN, LeftTypes... > select_last_n_types_t
typename first_n_types_list_to_template_class_st< FirstN, TemplateClass, Types... >::type first_n_types_list_to_template_class_t
constexpr auto sequence_element_count_v
constexpr auto is_push_back_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.push_back(std::declval< Type >()))
first_type_t< template_parameter_type_list_t< Type > > first_parameter_type_t
constexpr auto is_template_v
constexpr auto is_empty_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.empty())
std::enable_if_t< are_all_in_list_v< TypeList, TestTypeList >, ReturnType > enable_if_all_in_list_t
constexpr auto is_set_or_unordered_set_v
constexpr auto is_numerical_number_v
typename std::conditional< is_iterator_type_v< T >, iterator_value_type_t< T >, T >::type conditional_iterator_value_type_t
typename select_nth_type_st< SelectIndex, Types... >::type select_nth_type_t
remove_cvref_t< decltype(function_return_type_fn(std::declval< FuncType >(), std::declval< ArgTypes >()...))> function_return_type_t
constexpr auto tuple_size_v
constexpr bool is_front_available_v
auto for_vector(FuncType &&f, typed_sequence_t< Ints... >)
typename prepend_type_st< ArgType, RightList >::type prepend_type_t
nth_type_t< SelectIndex, template_parameter_type_list_t< Type > > nth_parameter_type_t
constexpr auto is_string_v
constexpr auto are_integrals_v
constexpr bool is_size_available_v
typename st_make_non_class_wrapper< Type, Tag, std::is_class_v< Type > >::type non_class_wrapper_t
constexpr auto is_insert_valid_fn(ContainerType< Type, Types... > &&arg) noexcept(noexcept(std::declval< ContainerType< Type, Types... > >())) -> decltype(arg.insert(std::declval< Type >()))
constexpr auto is_front_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.front())
typename container_of_tuples_st< ContainerType, ElementTypes... >::type container_of_tuples_t
constexpr auto fn_create_sequence_reverse_order(std::integer_sequence< T, Indices... >, st_workhorse_range< T, Begin, End, Increment >)
std::enable_if_t< is_signed_integer_v< Type >, ReturnType > enable_if_signed_integer_t
constexpr std::enable_if_t< true, typename std::iterator_traits< T >::value_type > iterator_value_type_fn(T &&)
constexpr auto is_real_number_v
constexpr bool is_multiplication_valid_v
typename st_variant_to_type_list< VarType >::type variant_to_type_list_t
constexpr bool is_pop_front_available_v
typename st_unique_ptr_wrapper< ArgTypes... >::type make_unique_ptr_wrapper_t
constexpr auto is_rend_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.rend())
constexpr auto is_type_in_list_v
constexpr auto is_begin_available_fn(Type &&arg) noexcept(noexcept(std::declval< remove_cv_ref_t< Type > >())) -> decltype(arg.begin())
container_of_variants_t< std::deque, ElementTypes... > deque_of_variants_t
no_type_t multiplication_vaild_fn(...)
constexpr bool is_iterator_type_v
constexpr bool is_back_available_v
typename select_last_type_st< Types... >::type select_last_type_t
constexpr bool is_shrink_to_fit_available_v
std::array< tuple_common_element_t< TupleType >, tuple_size_v< TupleType > > tuple_to_std_array_t
constexpr auto are_all_in_list_v
std::enable_if_t< is_integer_v< Type >, ReturnType > enable_if_integer_t
constexpr bool is_erase_available_v
container_of_variants_t< std::multiset, ElementTypes... > multiset_of_variants_t
Type to string name conversions are defined.
hidden::append_type_t< ArgType, RightList > append_type_t
constexpr bool is_valid_type_v
constexpr bool operator!=(no_type_t, no_type_t) noexcept
constexpr bool is_arithmetic_valid_v
auto seq_to_array(std::integer_sequence< T, Id, Ids... >)
hidden::unordered_set_of_variants_t< ElementTypes... > unordered_set_of_variants_t
type_list_t< unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long > unsigned_integral_list_t
Type list of unsigned integral type INCLUDING character type, but EXCLUDING boolean type.
hidden::enable_if_signed_integer_t< Type, ReturnType > enable_if_signed_integer_t
hidden::push_back_type_t< ArgType, Types... > push_back_type_t
auto erase(ContainerType< EleType, Types... > &container, size_t index)
typename hidden::st_create_workhorse_range< SequenceInOrder, RangeValues... >::type make_sequence_t
constexpr auto common_type_v
constexpr no_type_t operator/(no_type_t, no_type_t) noexcept
constexpr bool InOrderSequence
variant_visitors(CallbackTypes...) -> variant_visitors< CallbackTypes... >
hidden::first_n_types_list_to_template_class_t< FirstN, TemplateClass, Types... > first_n_types_list_to_template_class_t
std::vector< std::common_type_t< apply_return_t< FuncType, TupleTypes >... > > apply_return_vector_t
hidden::map_or_unordered_map_pair_t< Type > map_or_unordered_map_pair_t
constexpr bool is_numbers_type_v
constexpr auto sequence_nth_element_v
constexpr bool is_integer_sequence_v
make_unsigned_t< common_type_t< Types... > > common_unsigned_t
std::array< std::common_type_t< apply_return_t< FuncType, TupleTypes >... >, sizeof...(TupleTypes)> apply_return_array_t
constexpr bool is_reserve_available_v
constexpr auto is_same_template_type_v
constexpr auto is_integral_v
decltype(auto) tuple_reader(TupleType &&tuple)
constexpr auto is_template_v
Test whether the type parameter is a template type.
constexpr bool is_front_available_v
constexpr bool is_pop_back_available_v
std::enable_if_t< is_same_v< Type, Types... > > void_if_same_t
hidden::select_first_type_t< Types... > select_first_type_t
hidden::to_variant_t< TupleType > tuple_to_variant_t
std::enable_if_t< all_apply_v< FuncType, TupleTypes... >, ReturnType > enable_if_all_apply_t
hidden::last_n_types_t< LastN, Types... > last_n_types_t
std::enable_if_t< is_same_v< Types... > > void_if_all_the_same_t
hidden::enable_if_iterator_type_t< remove_cv_ref_t< Type >, ReturnType > enable_if_iterator_type_t
decltype(auto) array_indexer(ArrayType &&array)
std::enable_if_t< common_type_v< remove_cvref_t< ArgTypes >... > > void_if_common_exisits_t
std::enable_if_t< std::is_invocable_v< WorkhorseType, indexer_t< 0 > > > drive_workhorse(WorkhorseType &&workhorse)
constexpr bool is_insert_available_v
void reverse_order_in_place(ContainerType< Type, Types... > &container)
constexpr bool is_rend_available_v
std::enable_if_t< is_same_v< Type, Types... >, ReturnType > enable_if_same_t
constexpr no_type_t operator-(no_type_t, no_type_t) noexcept
constexpr bool is_std_array_v
constexpr bool is_type_list_v
ContainerType< Type, Types... > reverse_order(const ContainerType< Type, Types... > &container)
hidden::multiset_of_variants_t< ElementTypes... > multiset_of_variants_t
hidden::nth_type_to_template_class_t< SelectTypeIndex, TemplateClass, Types... > nth_type_to_template_class_t
hidden::make_signed_integral_t< Type > make_signed_integral_t
hidden::first_type_t< Types... > first_type_t
typename hidden::st_arg_to_type_list< Types... >::type arg_to_type_list_t
hidden::replace_type_t< NewType, OldType, TypeList > replace_type_t
constexpr auto is_signed_integer_v
types::vector_if_all_apply_t< FuncType, ArgTypes... > apply_vector(FuncType &&f, ArgTypes &&... args)
constexpr bool is_erase_available_v
constexpr auto is_reference_wrapper_v
constexpr auto is_map_or_unordered_map_v
typename hidden::st_tuple_common_type< remove_cvref_t< T >, remove_cvref_t< S > >::type tuple_common_type_t
std::basic_ostream< CharType > & operator>>(std::basic_ostream< CharType > &os, const no_type_t &)
hidden::function_return_type_t< FuncType, ArgTypes... > function_return_type_t
hidden::last_type_t< Types... > last_type_t
hidden::unordered_multimap_of_variants_t< KeyType, ElementTypes... > unordered_multimap_of_variants_t
hidden::enable_if_in_list_t< TestType, TypeList, ReturnType > enable_if_in_list_t
std::enable_if_t< tuple_common_type_v< T, S >, tuple_common_type_t< T, S > > tuple_operation_valid_t
types::array_if_all_apply_t< FuncType, ArgTypes... > apply_array(FuncType &&f, ArgTypes &&... args)
range(Type, Type) -> range< Type >
hidden::sequence_element_t< remove_cvref_t< SequenceType > > sequence_element_t
hidden::non_class_wrapper_t< Type, Tag > non_class_wrapper_t
constexpr no_type_t operator+(no_type_t, no_type_t) noexcept
constexpr bool is_no_type_v
hidden::enable_if_not_integer_t< Type, ReturnType > enable_if_not_integer_t
auto reverse_tuple(std::tuple< Types... > const &tuple)
make_signed_t< common_type_t< Types... > > common_signed_t
auto reverse_array(std::array< Type, N > const &array)
hidden::enable_if_container_type_t< Type, ReturnType > enable_if_container_type_t
hidden::tuple_to_type_list_t< remove_cvref_t< TupleType > > tuple_to_type_list_t
hidden::prepend_type_t< ArgType, RightList > prepend_type_t
hidden::vector_of_tuples_t< ElementTypes... > vector_of_tuples_t
decltype(hidden::fn_apply(std::declval< FuncType >(), std::declval< TupleType >())) apply_return_t
decltype(auto) get_value(Type &&arg)
constexpr bool is_capacity_available_v
auto convert_to_array(const std::tuple< Type, Types... > &tuple)
constexpr bool is_tag_type_v
auto make_random_access_container(Type &&arg, Types &&... args)
typename hidden::sequence_info_t< StackOrder, remove_cvref_t< SequenceType > > sequence_info_t
Container< types::to_variant_t< remove_cvref_t< TupleType > > > tuple_to_container_of_variants_t
hidden::vector_of_variants_t< ElementTypes... > vector_of_variants_t
constexpr bool is_emplace_available_v
constexpr bool StackInOrder
void append_to_container(TargetContainerType &target_container, SourceContainerType &&source_container)
constexpr auto are_numerical_numbers_v
constexpr bool is_iterator_type_v
constexpr auto is_operable_v
type_list_t< unsigned short, unsigned int, unsigned long, unsigned long long > unsigned_integer_list_t
Unsigned integers EXCLUDING unsigned char and boolean.
typename hidden::st_std_array_element< remove_cv_ref_t< Type > >::type std_array_element_t
hidden::unique_types_t< Types... > unique_types_t
array_wrapper_t(ElementType(&)[ElementCount]) -> array_wrapper_t< ElementType *, size_t >
constexpr bool is_vector_v
hidden::enable_if_integral_t< Type, ReturnType > enable_if_integral_t
hidden::map_of_variants_t< KeyType, ElementTypes... > map_of_variants_t
enable_if_all_apply_t< apply_return_tuple_t< FuncType, TupleTypes... >, FuncType, TupleTypes... > tuple_if_all_apply_t
hidden::union_type_t< unique_types_t< LeftList >, unique_types_t< RightList > > union_type_t
constexpr bool is_apply_v
constexpr T fn_seq_element(std::integer_sequence< T, Id, Ids... >)
void emplace_back(ContainerType< Type, Types... > &container, EleTypes &&... eles)
hidden::reverse_sequence_t< remove_cvref_t< SequenceType > > reverse_sequence_t
std::make_integer_sequence< remove_cvref_t< decltype(Size)>, Size > make_typed_sequence_t
constexpr bool is_constructible_over_the_set_v
constexpr bool is_callable_v
hidden::multimap_of_variants_t< KeyType, ElementTypes... > multimap_of_variants_t
hidden::map_of_tuples_t< KeyType, ElementTypes... > map_of_tuples_t
auto create_container(ArgType &&arg, ArgTypes &&... args)
Create a container object.
type_list_t< char, short, int, long int, long long int > signed_integral_list_t
Type list of signed integral type INCLUDING character type, but EXCLUDING boolean type.
auto to_ref(const Type &value)
hidden::enable_if_integer_t< Type, ReturnType > enable_if_integer_t
hidden::push_front_type_t< ArgType, Types... > push_front_type_t
std::enable_if_t< is_same_flat_v< Type, Types... >, ReturnType > enable_if_same_flat_t
hidden::type_list_to_template_class_t< ClassTemplate, Types... > type_list_to_template_class_t
decltype(auto) tuple_reader_row_column(TupleType &&tuple)
constexpr auto template_parameter_count
constexpr auto are_all_in_list_v
constexpr bool is_rbegin_available_v
typename hidden::st_is_callable< CallbackType, type_list_t<>, type_list_t<>, Types... >::non_callables non_callable_list_t
constexpr auto are_signed_integers_v
auto make_deque(Type &&arg, Types &&... args)
constexpr bool is_assignable_from_the_set_v
decltype(auto) array_reader_row_column(ArrayType &&array)
constexpr bool is_multiplication_valid_v
std::array< IntType, N > seq_indices(IdType i, std::array< IntType, N > const &powers)
hidden::front_type_t< Types... > front_type_t
decltype(auto) get_nth_argument(ArgTypes &&... args)
constexpr bool has_tuple_common_type_v
hidden::template_parameter_type_list_t< Type > template_parameter_type_list_t
std::common_type_t< apply_return_t< FuncType, TupleTypes >... > common_apply_t
auto pop_front(ContainerType< Type, Types... > &container)
constexpr auto are_real_numbers_v
decltype(auto) array_writer_row_column(ArrayType &&array)
constexpr bool pairwise_common_type_v
hidden::select_last_n_types_t< LastN, Types... > select_last_n_types_t
hidden::tuple_to_std_array_t< remove_cvref_t< TupleType > > tuple_to_std_array_t
constexpr bool ReverseSequence
constexpr no_type_t operator*(no_type_t, no_type_t) noexcept
result_type signed_common_t
hidden::last_type_t< Type > last_parameter_type_t
types::tuple_if_all_apply_t< FuncType, ArgTypes... > apply_tuple(FuncType &&f, ArgTypes &&... args)
make_unsigned_t< common_type_t< Types... > > make_common_unsigned_t
constexpr bool all_apply_v
hidden::pop_back_type_t< Types... > pop_back_type_t
decltype(auto) tuple_writer(TupleType &&tuple)
constexpr auto is_integer_v
std::integer_sequence< std::common_type_t< remove_cvref_t< decltype(Indices)>... >, Indices... > typed_sequence_t
hidden::enable_if_signed_integral_t< Type, ReturnType > enable_if_signed_integral_t
hidden::common_type_t< Types... > common_type_t
auto convert_to_tuple(const std::array< T, Size > &array)
constexpr auto sequence_first_element_v
void prepend_to_container(TargetContainerType &target_container, SourceContainerType &&source_container)
constexpr bool is_push_back_available_v
constexpr bool is_empty_available_v
constexpr bool is_size_available_v
constexpr auto is_set_or_unordered_set_v
hidden::intersection_type_t< unique_types_t< LeftList >, unique_types_t< RightList > > intersection_type_t
constexpr auto type_max_v
hidden::select_last_type_t< Types... > select_last_type_t
constexpr size_t SelectAll
typename concate_type_st< Types... >::type concate_type_t
std::make_index_sequence< sizeof...(Types)> index_for
hidden::enable_if_unsigned_integer_t< Type, ReturnType > enable_if_unsigned_integer_t
hidden::back_type_t< Types... > back_type_t
decltype(types::convert_to_tuple(std::array< Type, Size >{})) create_tuple_t
auto make_vector(Type &&arg, Types &&... args)
constexpr bool is_shrink_to_fit_available_v
constexpr auto is_type_list_equivalent_v
hidden::enable_if_unsigned_integral_t< Type, ReturnType > enable_if_unsigned_integral_t
auto for_tuple(FuncType &&f)
constexpr auto are_integrals_v
constexpr auto get_nth_value(std::integer_sequence< Type, Index, Indices... >) noexcept
hidden::return_type_t< Type > return_type_t
constexpr bool is_resize_available_v
std::enable_if_t< is_same_flat_v< Types... >, ReturnType > enable_if_all_the_same_flat_t
hidden::difference_type_t< LeftList, RightList > difference_type_t
hidden::to_tuple_t< VarType > variant_to_tuple_t
auto for_vector(FuncType &&f)
std::enable_if_t< std::is_invocable_v< remove_cvref_t< WorkhorseType >, indexer_t< 0 > >||std::is_invocable_v< remove_cvref_t< WorkhorseType >, indexer_t< 0 >, sequence_info > > for_workhorse(WorkhorseType &&workhorse)
auto convert_to_container(const std::tuple< Type, Types... > &tuple)
std::index_sequence<(std::size_t) Id,(std::size_t) Ids... > index_t
constexpr auto is_noexcept_v
Test if a function is specified with the keyword noexcept.
decltype(auto) array_reader(ArrayType &&array)
constexpr bool is_template_type_v
constexpr auto is_variant_v
hidden::first_parameter_type_t< Type > first_parameter_type_t
constexpr auto is_unsigned_integral_v
constexpr bool is_any_callable_v
constexpr auto is_unsigned_integer_v
constexpr bool is_pop_front_available_v
typename hidden::st_index_tuple_vector< std::make_index_sequence< N > >::type index_tuple_vector_t
hidden::tuple_common_element_t< remove_cvref_t< TupleType > > tuple_common_element_t
hidden::types_to_template_class_t< Type, Types... > types_to_template_class_t
constexpr size_t array_size(ElementType(&array)[ElementSize]) noexcept
constexpr auto sequence_last_element_v
constexpr bool is_assignable_to_the_set_v
void emplace_front(ContainerType< Type, Types... > &container, EleTypes &&... eles)
constexpr auto is_signed_integral_v
constexpr auto template_category()
decltype(auto) array_writer(ArrayType &&array)
constexpr auto is_basic_string_v
constexpr auto is_type_in_list_v
constexpr auto is_same_template_v
enable_if_variant_t< VariantType > visit(VisitorType &&visitor, VariantType &&vt)
enable_if_all_apply_t< void, FuncType, TupleTypes... > void_if_all_apply_t
bool is_parameter_stack_order_reversed()
constexpr bool is_all_callable_v
hidden::to_variant_t< Type, Types... > to_variant_t
constexpr auto sequence_span_v
auto pop_back(ContainerType< Type, Types... > &container)
constexpr bool is_back_available_v
hidden::make_signed_t< Type > make_signed_t
remove_cv_ref_t< Type > remove_cvref_t
auto cast_array(T(&array)[N]) noexcept
hidden::set_of_variants_t< ElementTypes... > set_of_variants_t
constexpr bool is_container_type_v
type_list_t< float, double, long double > real_number_list_t
Type list of real numbers (floating-point numbers).
auto evaluate_lambdas(const std::tuple< FuncType, FuncTypes... > &tuple, ArgFirst &&arg, ArgTypes &&... args)
constexpr size_t InvalidIndex
auto make_variants(Type &&arg, Types &&... args)
hidden::to_recursive_type_list_t< remove_cv_ref_t< T > > to_recursive_type_list_t
auto array_wrapper(ElementType(&array)[ElementSize]) noexcept
decltype(auto) array_indexer_row_column(ArrayType &&array)
constexpr auto is_numerical_number_v
std::make_index_sequence<(std::size_t) N > make_index_t
hidden::nth_type_t< SelectIndex, Type > nth_parameter_type_t
constexpr auto is_tuple_v
make_signed_t< common_type_t< Types... > > make_common_signed_t
hidden::deque_of_variants_t< ElementTypes... > deque_of_variants_t
hidden::type_list_to_tuple_t< remove_cvref_t< TypeList > > type_list_to_tuple_t
hidden::unordered_multimap_of_tuples_t< KeyType, ElementTypes... > unordered_multimap_of_tuples_t
constexpr std::enable_if_t< std::is_same_v< std::remove_reference_t< TargetType >, std::remove_reference_t< _Ty > >, _Ty && > smart_forward(std::remove_reference_t< _Ty > &_Arg) noexcept
constexpr bool is_push_front_available_v
constexpr bool is_iterator_excluding_pointer_v
constexpr bool is_array_v
constexpr size_t std_array_size_v
hidden::make_unsigned_t< Type > make_unsigned_t
result_type unsigned_common_t
constexpr auto sequence_element_count_v
auto freeze_parameter(FuncType &&func, ArgType arg, ArgTypes... args)
std::enable_if_t< is_same_flat_v< Types... > > void_if_all_the_same_flat_t
constexpr bool is_type_in_the_set_v
enable_if_all_apply_t< apply_return_vector_t< FuncType, TupleTypes... >, FuncType, TupleTypes... > vector_if_all_apply_t
constexpr auto is_in_list_v
test if TestType exists in Types...
constexpr auto are_unsigned_integrals_v
void push_front(ContainerType< Type, Types... > &container, EleType &&ele)
std::enable_if_t< is_same_v< Types... >, ReturnType > enable_if_all_the_same_t
constexpr auto is_pair_of_variant_v
hidden::deque_of_tuples_t< ElementTypes... > deque_of_tuples_t
hidden::multimap_of_tuples_t< KeyType, ElementTypes... > multimap_of_tuples_t
constexpr auto are_integers_v
hidden::to_tuple_t< Types... > to_tuple_t
decltype(auto) get_element(ContainerType container, IndexType index)
hidden::first_n_types_t< FirstN, Types... > first_n_types_t
constexpr bool operator==(no_type_t, no_type_t) noexcept
hidden::select_nth_type_t< SelectIndex, Types... > select_nth_type_t
hidden::set_of_tuples_t< ElementTypes... > set_of_tuples_t
std::enable_if_t< common_type_v< remove_cvref_t< ArgTypes >... >, ReturnType > enable_if_common_exisits_t
hidden::unordered_multiset_of_variants_t< ElementTypes... > unordered_multiset_of_variants_t
hidden::pop_front_type_t< Types... > pop_front_type_t
constexpr auto is_real_number_v
type_list_t< short, int, long, long long > signed_integer_list_t
Signed integers EXCLUDING char and boolean.
variant_visitors< remove_cv_ref_t< CallbackTypes >... > make_variant_visitors(CallbackTypes &&... visitors)
constexpr bool is_invocable_v
type_list_t< short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long > integer_list_t
Type list of integers EXCLUSING character type and boolean type.
enable_if_all_apply_t< apply_return_array_t< FuncType, TupleTypes... >, FuncType, TupleTypes... > array_if_all_apply_t
hidden::enable_if_all_in_list_t< TestTypeList, TypeList, ReturnType > enable_if_all_in_list_t
hidden::unordered_map_of_variants_t< KeyType, ElementTypes... > unordered_map_of_variants_t
std::enable_if_t< pairwise_common_type_v< T, Types... > > enable_pairwise_common_type_t
auto make_container(Type &&arg, Types &&... args)
constexpr bool is_begin_available_v
constexpr auto tuple_size_v
void push_back(ContainerType< Type, Types... > &container, EleType &&ele)
hidden::unordered_map_of_tuples_t< KeyType, ElementTypes... > unordered_map_of_tuples_t
type_list_t< char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long > integral_list_t
Type list of integral type INCLUDING character type, but EXCLUDING boolean type.
constexpr bool is_end_available_v
constexpr auto is_tuple_empty_v
hidden::variant_to_type_list_t< remove_cvref_t< VarType > > variant_to_type_list_t
std::tuple< apply_return_t< FuncType, TupleTypes > ... > apply_return_tuple_t
hidden::enable_if_real_number_t< Type, ReturnType > enable_if_real_number_t
constexpr auto is_string_v
Test is Type is of string type.
typename hidden::st_type_list_to_tuple_of_vectors< Types... >::type tuple_of_vectors_t
auto & cast_ref(std::unique_ptr< T[], Deleter > &uptr) noexcept
std::ostream & operator<<(std::ostream &os, range< Type > const &r)
constexpr auto is_same_flat_v
hidden::nth_type_t< SelectIndex, Types... > nth_type_t
constexpr bool is_insert_iterator_available_v
auto reverse(ContainerType &&container)
hidden::container_of_variants_t< ContainerType, ElementTypes... > container_of_variants_t
decltype(auto) tuple_writer_row_column(TupleType &&tuple)
constexpr std::enable_if_t< std::is_same_v< std::remove_reference_t< TargetType >, std::remove_reference_t< _Ty > >, std::remove_reference_t< _Ty > && > smart_move(_Ty &&_Arg) noexcept
hidden::list_of_variants_t< ElementTypes... > list_of_variants_t
range(Type) -> range< Type >
hidden::first_n_types_to_template_class_t< FirstN, TemplateClass, Types... > first_n_types_to_template_class_t
typename hidden::st_is_callable< CallbackType, type_list_t<>, type_list_t<>, Types... >::callables callable_list_t
std::string type_to_string()
Returns Type's string name.
hidden::remove_type_t< ArgType, Types... > remove_type_t
std::enable_if_t< common_apply_v< FuncType, TupleTypes... >, std::common_type_t< apply_return_t< FuncType, TupleTypes >... > > common_type_if_all_apply_t
std::enable_if_t< is_pair_of_variant_v< remove_cv_ref_t< PairType > > > visit_variant(VisitorType &&visit, PairType &&vpr)
constexpr bool is_emplace_front_available_v
constexpr bool is_index_operator_available_v
hidden::select_first_n_types_t< FirstN, Types... > select_first_n_types_t
decltype(auto) decay(Type &&arg)
constexpr bool common_apply_v
typename hidden::st_build_arg_types< Heads, Tails >::type arg_list_t
hidden::make_unsigned_integral_t< Type > make_unsigned_integral_t
constexpr bool is_void_return_type_v
constexpr auto is_unique_ptr_v
constexpr bool is_subtraction_valid_v
hidden::list_of_tuples_t< ElementTypes... > list_of_tuples_t
constexpr bool tuple_common_type_v
constexpr auto is_template_template_v
constexpr auto type_count_v
unsigned long long big_unsigned_t
constexpr auto are_signed_integrals_v
constexpr auto are_unsigned_integers_v
constexpr auto is_same_v
Test if all types are the same.
type_list_t< char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, long double > numerical_number_list_t
All numbers mathematical operations.
std::enable_if_t< is_same_flat_v< Type, Types... > > void_if_same_flat_t
hidden::enable_if_numerical_number_t< Type, ReturnType > enable_if_numerical_number_t
constexpr bool is_addition_valid_v
auto for_array(FuncType &&f)
constexpr bool is_emplace_back_available_v
constexpr bool is_division_valid_v
Includes subnamespace conversion.
std::remove_reference_t< std::decay_t< Type > > decay_remove_ref_t
Decay, remove reference.
typename SetTagType::trio_set_t trio_set_t
auto reverse_iterator_to_iterator(ReverseIteratorType &&itr)
decltype(auto) make_container(Type &&arg, Types &&... args)
typename SetTagType::trio_sets_of_sets_t trio_sets_of_sets_t
typename SetTagType::trio_sets_t trio_sets_t
auto find_range_iterators(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
typename SetTagType::duet_set_of_sets_t duet_set_of_sets_t
constexpr unsigned long long two_power_n(Type n)
auto minimum(Type_1 a, Type_2 b)
constexpr bool is_const_reference_v
Test if Type is reference to const object.
typename SetTagType::duet_sets_of_sets_t duet_sets_of_sets_t
typename SetTagType::set_t set_t
typename SetTagType::duet_sets_t duet_sets_t
typename SetTagType::sets_of_sets_t sets_of_sets_t
auto reverse_iterator_to_index(ContainerType &&cntr, reverse_iterator_type &&offset)
constexpr bool is_const_v
typename SetTagType::duet_set_t duet_set_t
decltype(auto) make_deque(Type &&arg, Types &&... args)
auto binary_find_index(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
decltype(auto) reverse(Type &&arg, Types &&... args)
decltype(auto) reverse(ContainerType &&container)
typename SetTagType::trio_set_of_sets_t trio_set_of_sets_t
decltype(auto) make_vector(Type &&arg, Types &&... args)
auto index_to_reverse_iterator(ContainerType &&cntr, IndexType &&offset)
auto iterator_to_index(ContainerType &&cntr, iterator_type &&offset)
auto binary_find_iterator(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
std::remove_cv_t< std::remove_reference_t< Type > > remove_cv_ref_t
Remove const volatile reference from Type.
remove_cv_ref_t< std::remove_pointer_t< decay_remove_cv_ref_t< Type > > > primitive_type_t
Decay, remove const, volatile, reference, then remove pointer and remove const and volatile.
auto iterator_to_reverse_iterator(IteratorType &&itr)
typename SetTagType::set_of_duets_t set_of_duets_t
auto binary_find_bool_index_pair(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
auto binary_find_bool_iterator_pair(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
std::remove_cv_t< std::remove_reference_t< std::decay_t< Type > > > decay_remove_cv_ref_t
Decay, remove const, volatile, reference.
typename SetTagType::trio_set_element_t trio_set_element_t
typename SetTagType::duet_set_element_t duet_set_element_t
auto maximum(Type_1 a, Type_2 b)
auto make_rotator(ContainerType &&cntr)
decltype(auto) make_random_access_container(Type &&arg, Types &&... args)
typename SetTagType::set_element_t set_element_t
typename SetTagType::set_of_sets_t set_of_sets_t
decltype(auto) create_container(Type &&arg, Types &&... args)
auto find_range_indices(ForwardIterator first, ForwardIterator last, const EleType &value, CompareCallbackType &&compare_callback=CompareCallbackType{})
auto index_to_iterator(ContainerType &&cntr, IndexType &&index)
decltype(auto) make_variants(Type &&arg, Types &&... args)
decltype(auto) get_element(ContainerType container, IndexType index)
typename SetTagType::sets_t sets_t
static constexpr bool Before
static constexpr bool After
static constexpr bool Append
static constexpr bool True
static constexpr bool Yes
static constexpr bool False
static constexpr bool Left
static constexpr bool Prepend
static constexpr bool Right
static constexpr bool And
ContainerType< EleType, Types... > set_t
ContainerType< ContainerType< ContainerType< EleType, Types... > > > set_of_sets_t
std::tuple< set_t, set_t, set_t > trio_set_t
std::tuple< set_element_t, set_element_t, set_element_t > trio_set_element_t
ContainerType< ContainerType< EleType, Types... > > sets_t
std::tuple< sets_of_sets_t, sets_of_sets_t, sets_of_sets_t > trio_sets_of_sets_t
ContainerType< ContainerType< ContainerType< ContainerType< EleType, Types... > > > > sets_of_sets_t
std::tuple< sets_t, sets_t, sets_t > trio_sets_t
std::tuple< set_of_sets_t, set_of_sets_t, set_of_sets_t > trio_set_of_sets_t
std::tuple< set_of_sets_t, set_of_sets_t > duet_set_of_sets_t
std::tuple< sets_of_sets_t, sets_of_sets_t > duet_sets_of_sets_t
std::tuple< set_t, set_t > duet_set_t
std::tuple< sets_t, sets_t > duet_sets_t
std::tuple< set_element_t, set_element_t > duet_set_element_t
ContainerType< duet_set_t > set_of_duets_t
std::atomic< int > thread_count
array_wrapper_t(ElementType(&array)[ElementCount]) noexcept
std::pair< PointerType, SizeType > base_type
is_operable_t< typename common_type_st< Type1, Type2 >::type, typename common_type_st< Type2, Types... >::type > type
is_operable_t< Type1, Type2 > type
typename common_type_st< Type1, Type2, Types... >::type type
typename common_type_st< Type1, Type2 >::type type
remove_type_t< Type, type_list_t< Types... > > type
typename difference_type_st< type_list_t< Types... >, Type, RightTypes... >::type type
std::conditional_t< sizeof...(RightTypes)==0, list, typename difference_type_st< list, RightTypes... >::type > type
typename difference_type_st< type_list_t< Types... >, Type >::type list
typename difference_type_st< type_list_t< Types... >, Type >::type type
std::conditional_t< FirstN==0, type_list_0, type_list_1 > type
std::conditional_t< FirstN==1, type_list_t< LeftTypes..., RightType >, typename first_n_types_list_st< FirstN-1, type_list_t< LeftTypes..., RightType >, type_list_t< RightTypes... > >::type > type_list_1
std::conditional_t< is_valid_type_v< n_types >, type_list_to_template_class_t< TemplateClass, n_types >, no_type_t > class_t
first_n_types_t< FirstN, type_list_t< Types... > > n_types
std::conditional_t< is_valid_type_v< class_t >, class_t, no_type_t > type
first_n_types_t< FirstN, type_list_t< Types... > > n_types
std::conditional_t< is_valid_type_v< n_types >, type_list_to_template_class_t< TemplateClass, n_types >, no_type_t > class_t
std::conditional_t< is_valid_type_v< class_t >, class_t, no_type_t > type
std::conditional_t< FirstN==0, type_list_t<>, std::conditional_t< FirstN >=sizeof...(RightTypes), type_list_t< RightTypes... >, typename first_n_types_list_st< FirstN, type_list_t<>, type_list_t< RightTypes... > >::type > > type
std::conditional_t< FirstN==0, type_list_t<>, std::conditional_t< FirstN >=sizeof...(RightTypes), type_list_t< RightTypes... >, typename first_n_types_list_st< FirstN, type_list_t<>, type_list_t< RightTypes... > >::type > > type
std::conditional_t< is_valid_type_v< n_types >, type_list_to_template_class_t< TemplateClass, n_types >, no_type_t > class_t
first_n_types_t< FirstN, type_list_t< Types... > > n_types
std::conditional_t< is_valid_type_v< class_t >, class_t, no_type_t > type
first_n_types_t< FirstN, type_list_t< Types... > > n_types
std::conditional_t< is_valid_type_v< n_types >, type_list_to_template_class_t< TemplateClass, n_types >, no_type_t > class_t
std::conditional_t< is_valid_type_v< class_t >, class_t, no_type_t > type
typename intersection_type_st< type_list_t< Types... >, Type, RightTypes... >::type type
std::conditional_t< is_type_in_list_v< Type, list >, type_list_t< Type >, type_list_t<> > type
std::conditional_t< sizeof...(RightTypes)==0, list, append_type_t< list, typename intersection_type_st< left_list, RightTypes... >::type > > type
typename intersection_type_st< left_list, Type >::type list
typename intersection_type_st< type_list_t< Types... >, Type >::type type
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
std::pair< KeyType, ValueType > type
std::pair< KeyType, ValueType > type
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr size_t count
static constexpr bool value
static constexpr bool value
static constexpr bool empty
static constexpr bool value
static constexpr bool value
pop_back_type_t< type_list_t< LeftType, LeftTypes... > > new_left
std::conditional_t< LastN==0, type0, type1 > type
std::conditional_t< LastN==1, new_right, typename last_n_types_list_st< LastN-1, new_left, new_right >::type > type1
std::conditional_t< LastN==0, type_list_t<>, std::conditional_t< LastN >=sizeof...(LeftTypes), type_list_t< LeftTypes... >, typename last_n_types_list_st< LastN, type_list_t< LeftTypes... >, type_list_t<> >::type > > type
std::conditional_t< LastN==0, type_list_t<>, std::conditional_t< LastN >=sizeof...(LeftTypes), type_list_t< LeftTypes... >, typename last_n_types_list_st< LastN, type_list_t< LeftTypes... >, type_list_t<> >::type > > type
std::make_signed_t< Type > type
std::make_signed_t< Type > type
std::make_signed_t< Type > type
std::make_unsigned_t< Type > type
std::conditional_t< is_valid_type_v< nth_type >, TemplateClass< nth_type >, nth_type > type
select_nth_type_t< TypeIndex, type_list_t< Types... > > nth_type
std::conditional_t< is_valid_type_v< nth_type >, TemplateClass< nth_type >, nth_type > type
select_nth_type_t< TypeIndex, type_list_t< Types... > > nth_type
std::conditional_t< sizeof...(RightTypes)==0, type_list_t< LeftTypes... >, typename pop_back_type_st< left_list, right_list >::type > type
push_back_type_t< Type, type_list_t< LeftTypes... > > left_list
typename pop_back_type_st< type_list_t<>, type_list_t< Types... > >::type type
typename pop_back_type_st< type_list_t<>, type_list_t< Types... > >::type type
typename pop_front_type_st< type_list_t< Types... > >::type type
typename pop_front_type_st< type_list_t< Types... > >::type type
std::conditional_t< sizeof...(RightTypes)==0, list, prepend_type_t< list, typename remove_type_st< ArgType, RightTypes... >::type > > type
typename remove_type_st< ArgType, Type >::type list
std::conditional_t< std::is_same_v< ArgType, Type >, type_list_t<>, type_list_t< Type > > type
typename remove_type_st< ArgType, Type, RightTypes... >::type type
typename remove_type_st< ArgType, Type >::type type
typename remove_type_st< ArgType, type_list_t< Types... > >::type type
typename remove_type_st< ArgType, type_list_t< Types... > >::type type
typename replace_type_st< NewType, OldType, Type >::type list
std::conditional_t< sizeof...(RightTypes), list, prepend_type_t< list, typename replace_type_st< NewType, OldType, RightTypes... >::type > > type
std::conditional_t< std::is_same_v< OldType, Type >, type_list_t< NewType >, type_list_t< Type > > type
typename replace_type_st< NewType, OldType, Type, RightTypes... >::type type
typename replace_type_st< NewType, OldType, Type >::type type
std::conditional_t< sizeof...(Types)==0, Type, typename select_last_type_st< Types... >::type > type
std::conditional_t< sizeof...(Types)==0, Type, typename select_last_type_st< Types... >::type > type
std::conditional_t< SelectIndex==0, Type, typename select_nth_type_st< SelectIndex-1, Types... >::type > type
std::conditional_t< SelectIndex==0, Type, typename select_nth_type_st< SelectIndex-1, Types... >::type > type
typename common_type_st< Type, Types... >::type type
typename common_type_st< Type, Types... >::type type
static constexpr bool value
std::make_signed_t< remove_cvref_t< decltype(EndValue)> > value_type
std::conditional_t< SequenceInOrder, remove_cvref_t< decltype(fn_create_sequence_in_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))>, remove_cvref_t< decltype(fn_create_sequence_reverse_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))> > type
std::make_signed_t< remove_cvref_t< decltype(EndValue)> > value_type
std::conditional_t< SequenceInOrder, remove_cvref_t< decltype(fn_create_sequence_in_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))>, remove_cvref_t< decltype(fn_create_sequence_reverse_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))> > type
std::make_signed_t< remove_cvref_t< decltype(EndValue)> > value_type
std::conditional_t< SequenceInOrder, remove_cvref_t< decltype(fn_create_sequence_in_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))>, remove_cvref_t< decltype(fn_create_sequence_reverse_order(std::integer_sequence< value_type >{}, workhorse_range_type{}))> > type
common_type_t< arg_types > type
static constexpr bool value
std::tuple< typename st_vector< Is >::type... > type
std::conditional_t<!value, types::push_back_type_t< void, non_callable_list >, non_callable_list > non_callables
std::conditional_t< value, types::push_back_type_t< void, callable_list >, callable_list > callables
typename base_type::callables callables
typename base_type::non_callables non_callables
typename base_type::callables callables
typename base_type::non_callables non_callables
std::conditional_t< value, types::push_back_type_t< Type, callable_list >, callable_list > callables
std::conditional_t<!value, types::push_back_type_t< Type, non_callable_list >, non_callable_list > non_callables
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
typename st_revese_sequence_operation< std::integer_sequence< T >, std::integer_sequence< T, args... > >::type type
std::integer_sequence< T, args... > type
typename st_revese_sequence_operation< left, right >::type type
std::integer_sequence< T, args2... > right
std::integer_sequence< T, first, args1... > left
static constexpr size_t value
static constexpr bool InOrder
static constexpr size_t Count
static constexpr size_t value
std::tuple< ArgTypes2... > S
decltype(tuple_addition_operator(std::declval< T >(), std::declval< S >())) type
std::tuple< ArgTypes1... > T
static constexpr bool value
static constexpr size_t value
std::tuple< Types... > type
std::tuple< std::vector< Types >... > type
std::tuple< std::vector< Types >... > type
std::tuple< std::vector< Types >... > type
tpf::types::common_type_t< tpf::types::remove_cvref_t< ArgTypes >... > common_t
static constexpr std::size_t N
static constexpr std::size_t N
tpf::types::common_type_t< tpf::types::remove_cvref_t< ArgTypes >... > common_t
std::vector< std::size_t > type
static constexpr type Begin
static constexpr type Increment
static constexpr type End
std::tuple< Types... > type
std::tuple< Types... > type
std::tuple< Types... > type
unique_types_t< Type, Types... > list_t
typename to_variant_st< list_t >::type type
std::variant< Type, Types... > type
std::variant< Type, Types... > type
static constexpr size_t value
ClassTemplate< Types... > type
ClassTemplate< Types... > type
typename type_list_to_template_class_st< ClassTemplate, Types... >::type type
typename type_list_to_template_class_st< std::variant, unique_types_t< Types... > >::type type
typename type_list_to_template_class_st< std::variant, unique_types_t< Types... > >::type type
typename type_list_to_template_class_st< ClassTemplate, Types... >::type type
ClassTemplate< Types... > type
ClassTemplate< Types... > type
typename types_to_template_class_st< ClassTemplate< InnerTypes... >, Types... >::type type
typename types_to_template_class_st< ClassTemplate< InnerTypes... >, Types... >::type type
typename types_to_template_class_st< std::variant< InnerTypes... >, unique_types_t< Types... > >::type type
typename types_to_template_class_st< std::variant< InnerTypes... >, unique_types_t< Types... > >::type type
typename types_to_template_class_st< Type, Types... >::type type
std::conditional_t< is_in_list_v< ArgType, list >, list, type_list_t< ArgType, Types... > > type
typename union_type_st< type_list_t< Types... >, Type >::type list
std::conditional_t< sizeof...(RightTypes)==0, list, typename union_type_st< list, RightTypes... >::type > type
std::conditional_t< is_type_in_list_v< Type, list >, list, type_list_t< Types..., Type > > type
typename union_type_st< type_list_t< Types... >, Type, RightTypes... >::type type
typename union_type_st< type_list_t< Types... >, Type >::type type
typename unique_types_st< type_list_t< Types... >, Type >::type list
typename unique_types_st< list, RightTypes... >::type type
std::conditional_t< is_type_in_list_v< Type, list >, list, type_list_t< Types..., Type > > type
typename unique_types_st< type_list_t< Types... >, RightTypes... >::type type
static constexpr T RowSize
static constexpr T ColumnSize
static constexpr T Column
constexpr auto operator()(indexer_t< RowIndex >, indexer_t< ColumnIndex >)
constexpr auto operator()(indexer_t< HeightIndex >, indexer_t< RowIndex >, indexer_t< ColumnIndex >)
static constexpr T RowSize
static constexpr T HeightSize
static constexpr T Column
static constexpr T ColumnSize
static constexpr T Height
This type is used to test validity of a type.
static std::enable_if_t< is_pair_of_variant_v< remove_cv_ref_t< PairType > > > visit_variant(VisitorType &&visitors, IteratorType &&itr, PairType &&vpr)
static std::enable_if_t< is_variant_v< remove_cv_ref_t< VariantType > > > visit_variant(VisitorType &&visitors, VariantType &&vpr)
static std::enable_if_t< is_variant_v< remove_cv_ref_t< VariantType > > > visit_variant(VisitorType &&visitors, IteratorType &&itr, VariantType &&vpr)
static std::enable_if_t< is_pair_of_variant_v< remove_cv_ref_t< PairType > > > visit_variant(VisitorType &&visitors, PairType &&vpr)
This type is used to manipulate type list.
static constexpr bool value
T & operator[](IndexType n) noexcept
static constexpr auto Count
auto & ref() const noexcept
std::unique_ptr< T[], deleter > uptr
const T & operator[](IndexType n) const noexcept
void for_each_reverse_iterator(ContainerType &&container)
variant_visitors(CallbackTypes... visitors)
std::enable_if_t< is_pair_of_variant_v< remove_cv_ref_t< PairType > > > operator()(PairType &&vt)
void for_each_reverse_index(ContainerType &&container)
std::tuple< CallbackTypes... > visitors_t
void for_each(ContainerType &&container)
void for_each_reverse(ContainerType &&container)
std::enable_if_t< is_variant_v< remove_cv_ref_t< VariantType > > > operator()(VariantType &&vt)
decltype(auto) handle(Type &&item)
void for_each_iterator(ContainerType &&container)
void for_each_index(ContainerType &&container)
#define Tpf_ThrowDebugException(debug_message)
Throw a debug_exception with message as argument.