17 static constexpr bool has =
false || (std::is_same_v<T, Ts> || ...);
18 static constexpr size_t size =
sizeof...(Ts);
20 using at = std::tuple_element_t<I, std::tuple<Ts...>>;
21 template <
typename... T>
23 template <
typename... T>
26 std::remove_pointer<
decltype([]<
size_t... I>(
27 std::index_sequence<I...>) {
29 }(std::make_index_sequence<
size - 1>{}))>::type;
31 std::remove_pointer<
decltype([]<
size_t... I>(
32 std::index_sequence<I...>) {
34 }(std::make_index_sequence<
size - 1>{}))>::type;
36 using concat = std::remove_pointer<
decltype([]<
size_t... I>(
37 std::index_sequence<I...>) {
38 return (
tvector<Ts...,
typename T::template
at<I>...> *)
nullptr;
39 }(std::make_index_sequence<T::size>{}))>::type;
42 template <
typename... T>
43 struct remove_all_helper {
44 using Type = std::remove_pointer<
decltype([]<
class _T, class... _Ts>() {
45 if constexpr (
sizeof...(_Ts) == 0) {
46 if constexpr (tvector<T...>::template has<_T>) {
47 return (tvector<> *)
nullptr;
49 return (tvector<_T> *)
nullptr;
52 if constexpr (tvector<T...>::template has<_T>) {
53 return (
typename tvector<_Ts...>::template remove_all<T...>
56 return (
typename tvector<_Ts...>::template remove_all<
57 T...>::template push_front<_T> *)
nullptr;
60 }.template operator()<Ts...>())>::type;
67 decltype([]<
size_t... I,
size_t... J>(std::index_sequence<I...>,
68 std::index_sequence<J...>) {
70 }(std::make_index_sequence<T>{},
71 std::make_index_sequence<
size - T - 1>{}))>::type;
72 template <
typename... T>
73 using remove_all =
typename remove_all_helper<T...>::Type;
76 std::remove_pointer<
decltype([]<
class... _Rt>(
tvector<_Rt...> *) {
78 }((T *)
nullptr))>::type;
80 static constexpr size_t find =
81 []<
size_t I,
class _T, class... _Ts>(this auto &&self) {
82 if constexpr (std::is_same_v<T, _T>) {
85 if constexpr (
sizeof...(_Ts) == 0) {
88 return self.template operator()<I + 1, _Ts...>();
90 }.template operator()<0, Ts...>();
91 template <
size_t... T>
93 template <
size_t Start,
size_t End>
94 using slice = std::remove_pointer<
decltype([]<
size_t... I>(
95 std::index_sequence<I...>) {
97 }(std::make_index_sequence<End - Start>{}))>::type;
std::remove_pointer< decltype([]< size_t... I, size_t... J >(std::index_sequence< I... >, std::index_sequence< J... >) { return(tvector< at< I >..., at< J+T+1 >... > *) nullptr remove