xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
types.hpp
浏览该文件的文档.
1#pragma once
2#ifndef XCMATH_TYPES_HPP
3#define XCMATH_TYPES_HPP
4#include <type_traits>
5#include <utility>
6namespace xcmath {
7
8template <typename T>
9concept TVector = requires(class _T) {
10 { T::size } -> std::convertible_to<size_t>;
11 { T::template has<_T> } -> std::convertible_to<bool>;
12};
13
14template <typename... Ts>
15struct tvector {
16 template <typename T>
17 static constexpr bool has = false || (std::is_same_v<T, Ts> || ...);
18 static constexpr size_t size = sizeof...(Ts);
19 template <size_t I>
20 using at = std::tuple_element_t<I, std::tuple<Ts...>>;
21 template <typename... T>
22 using push_back = tvector<Ts..., T...>;
23 template <typename... T>
24 using push_front = tvector<T..., Ts...>;
25 using pop_front =
26 std::remove_pointer<decltype([]<size_t... I>(
27 std::index_sequence<I...>) {
28 return (tvector<at<I + 1>...> *)nullptr;
29 }(std::make_index_sequence<size - 1>{}))>::type;
30 using pop_back =
31 std::remove_pointer<decltype([]<size_t... I>(
32 std::index_sequence<I...>) {
33 return (tvector<at<I>...> *)nullptr;
34 }(std::make_index_sequence<size - 1>{}))>::type;
35 template <TVector T>
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;
40
41 private:
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;
48 } else {
49 return (tvector<_T> *)nullptr;
50 }
51 } else {
52 if constexpr (tvector<T...>::template has<_T>) {
53 return (typename tvector<_Ts...>::template remove_all<T...>
54 *)nullptr;
55 } else {
56 return (typename tvector<_Ts...>::template remove_all<
57 T...>::template push_front<_T> *)nullptr;
58 }
59 }
60 }.template operator()<Ts...>())>::type;
61 };
62
63 public:
64 template <size_t T>
65 requires(T < size)
66 using remove = std::remove_pointer<
67 decltype([]<size_t... I, size_t... J>(std::index_sequence<I...>,
68 std::index_sequence<J...>) {
69 return (tvector<at<I>..., at<J + T + 1>...> *)nullptr;
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;
74 template <TVector T>
76 std::remove_pointer<decltype([]<class... _Rt>(tvector<_Rt...> *) {
77 return (remove_all<_Rt...> *)nullptr;
78 }((T *)nullptr))>::type;
79 template <class T>
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>) {
83 return I;
84 }
85 if constexpr (sizeof...(_Ts) == 0) {
86 return I + 1;
87 } else {
88 return self.template operator()<I + 1, _Ts...>();
89 }
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...>) {
96 return (tvector<at<Start + I>...> *)nullptr;
97 }(std::make_index_sequence<End - Start>{}))>::type;
98};
99template <>
100struct tvector<> {
101 static constexpr size_t size = 0;
102 template <typename T>
103 static constexpr bool has = false;
104 template <typename... T>
105 using push_back = tvector<T...>;
106 template <typename... T>
107 using push_front = tvector<T...>;
108 template <TVector T>
109 using concat = T;
110 template <size_t... T>
111 requires(sizeof...(T) == 0)
112 using remove = tvector<>;
113 template <size_t... T>
114 requires(sizeof...(T) == 0)
116 template <TVector T>
118};
119
120} // namespace xcmath
121
122#endif // XCMATH_TYPES_HPP
Compiler-specific type information handling for MSVC
Definition complex.hpp:12
std::tuple_element_t< I, std::tuple< Ts... > > at
Definition types.hpp:20
std::remove_pointer< decltype([]< size_t... I >(std::index_sequence< I... >) { return(tvector< at< Start+I >... > *) nullptr slice
Definition types.hpp:96
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
Definition types.hpp:69
std::remove_pointer< decltype([]< size_t... I >(std::index_sequence< I... >) { return(tvector< at< I+1 >... > *) nullptr pop_front
Definition types.hpp:28
std::remove_pointer< decltype([]< size_t... I >(std::index_sequence< I... >) { return(tvector< at< I >... > *) nullptr pop_back
Definition types.hpp:33
typename remove_all_helper< T... >::Type remove_all
Definition types.hpp:73
std::remove_pointer< decltype([]< size_t... I >(std::index_sequence< I... >) { return(tvector< Ts..., typename T::template at< I >... > *) nullptr concat
Definition types.hpp:38
static constexpr size_t find
Definition types.hpp:80
static constexpr size_t size
Definition types.hpp:18
static constexpr bool has
Definition types.hpp:17
std::remove_pointer< decltype([]< class... _Rt >(tvector< _Rt... > *) { return(remove_all< _Rt... > *) nullptr remove_all_from_list
Definition types.hpp:77