@@ -97,6 +97,52 @@ struct wrapper<S, F, Flag::soa> : public S<F> {
9797template <template <template <class > class > class S , template <class > class F >
9898using SoA = wrapper<S, F, Flag::soa>;
9999
100+ namespace type_traits {
101+
102+ template <bool B, class T = void >
103+ struct enable_if {};
104+
105+ template <class T >
106+ struct enable_if <true , T> { typedef T type; };
107+
108+ template < bool B, class T = void >
109+ using enable_if_t = typename enable_if<B, T>::type;
110+
111+ struct false_type {
112+ static constexpr bool value = false ;
113+ constexpr operator bool () const noexcept { return value; }
114+ };
115+
116+ struct true_type {
117+ static constexpr bool value = true ;
118+ constexpr operator bool () const noexcept { return value; }
119+ };
120+
121+ template <class T , class U >
122+ struct is_same : false_type {};
123+
124+ template <class T >
125+ struct is_same <T, T> : true_type {};
126+
127+ } // namespace type_traits
128+
129+ template <class T_left , class T_right >
130+ using enable_if_equal = type_traits::enable_if_t <type_traits::is_same<T_left, T_right>::value>;
131+
132+ template <class T_left , class T_right >
133+ using disable_if_equal = type_traits::enable_if_t <!type_traits::is_same<T_left, T_right>::value>;
134+
135+ #if __cplusplus >= 202002L
136+ template <template <class > class F_left , template <class > class F_right >
137+ concept is_same = type_traits::is_same<F_left<int >, F_right<int >>::value;
138+ template <template <class > class F >
139+ concept is_value = is_same<F, value>;
140+ template <template <class > class F >
141+ concept is_reference = is_same<F, reference>;
142+ template <template <class > class F >
143+ concept is_const_reference = is_same<F, const_reference>;
144+ #endif
145+
100146} // namespace MemLayout
101147
102- #endif // MEMLAYOUT_H
148+ #endif // MEMLAYOUT_H
0 commit comments