28 #ifndef TOMOGRAPHER_TOOLS_NEEDOWNOPERATORNEW_H 29 #define TOMOGRAPHER_TOOLS_NEEDOWNOPERATORNEW_H 39 #include <type_traits> 41 #include <Eigen/Eigen> 59 namespace tomo_internal {
62 template<
typename T>
static auto test_has_ownopnewprovidertype_member(
int)
63 ->
typename sfinae_yes<typename T::OperatorNewProviderType>::yes&;
64 template<
typename T>
static auto test_has_ownopnewprovidertype_member(
long)
65 ->
typename sfinae_no<>::no&;
67 struct has_ownopnewprovidertype_member {
68 static constexpr
bool value = (
sizeof(tomo_internal::test_has_ownopnewprovidertype_member<T>(0))
69 ==
sizeof(
typename tomo_internal::sfinae_yes<>::yes));
71 template<
bool has_own_prov
ider,
typename T>
72 struct need_own_op_new_prov_helper {
76 struct need_own_op_new_prov_helper<true, T> {
77 typedef typename T::OperatorNewProviderType ProviderType;
135 template<
typename... Types>
146 typedef typename tomo_internal::need_own_op_new_prov_helper<
152 typedef typename ProviderType::template OperatorNewAllocatorType<T>::Type AllocatorType;
165 template<
typename Type1,
typename Type2,
typename... OtherTypes>
169 namespace tomo_internal {
171 template<
bool same_provider_type,
bool t1_trivial_provider,
bool t2_trivial_provider,
172 typename Type1,
typename Type2,
typename... OtherTypes>
173 struct need_own_operator_new_combination_helper {
175 static_assert(!same_provider_type && !t1_trivial_provider && !t2_trivial_provider,
176 "ERROR: you have a type which requested a NeedOwnOperatorNew<T1,T2> " 177 "with incompatible needs.") ;
180 template<
bool t1_trivial_provider,
bool t2_trivial_provider,
181 typename Type1,
typename Type2,
typename... OtherTypes>
182 struct need_own_operator_new_combination_helper<true, t1_trivial_provider, t2_trivial_provider,
183 Type1, Type2, OtherTypes...> {
188 template<
bool t2_trivial_provider,
189 typename Type1,
typename Type2,
typename... OtherTypes>
190 struct need_own_operator_new_combination_helper<false, true, t2_trivial_provider,
191 Type1, Type2, OtherTypes...> {
196 template<
typename Type1,
typename Type2,
typename... OtherTypes>
197 struct need_own_operator_new_combination_helper<false, false, true,
198 Type1, Type2, OtherTypes...> {
207 template<
typename Type1,
typename Type2,
typename... OtherTypes>
210 typedef tomo_internal::need_own_operator_new_combination_helper<
213 std::is_same<typename NeedOwnOperatorNew<Type1>::ProviderType,
217 Type1, Type2, OtherTypes...
239 EIGEN_MAKE_ALIGNED_OPERATOR_NEW ;
246 #ifdef TOMOGRAPHER_TEST_TOOLS_NEEDOWNOPERATORNEW_DEBUG_MEMBERS 249 : EigenAlignedOperatorNewIsActive(
true)
252 const bool EigenAlignedOperatorNewIsActive;
271 template<
typename Scalar,
int FixedRows,
int FixedCols,
int Options,
int MaxRows,
int MaxCols>
276 template<
typename Scalar,
int FixedRows,
int FixedCols,
int Options,
int MaxRows,
int MaxCols>
Base namespace for the Tomographer project.
Some C++ utilities, with a tad of C++11 tricks.
VarValueDecoder< T >::RetType value(const Var &var)
Access the value of the given variable, as a C++ type.