27 #ifndef TOMOGRAPHER_TOOLS_NEEDOWNOPERATORNEW_H 28 #define TOMOGRAPHER_TOOLS_NEEDOWNOPERATORNEW_H 38 #include <type_traits> 40 #include <Eigen/Eigen> 62 namespace tomo_internal {
65 template<
typename T>
static auto test_has_ownopnewprovidertype_member(
int)
66 ->
typename sfinae_yes<typename T::OperatorNewProviderType>::yes&;
67 template<
typename T>
static auto test_has_ownopnewprovidertype_member(
long)
68 ->
typename sfinae_no<>::no&;
70 struct has_ownopnewprovidertype_member {
71 static constexpr
bool value = (
sizeof(tomo_internal::test_has_ownopnewprovidertype_member<T>(0))
72 ==
sizeof(
typename tomo_internal::sfinae_yes<>::yes));
74 template<
bool has_own_prov
ider,
typename T>
75 struct need_own_op_new_prov_helper {
79 struct need_own_op_new_prov_helper<true, T> {
80 typedef typename T::OperatorNewProviderType ProviderType;
114 template<
typename... Types>
125 typedef typename tomo_internal::need_own_op_new_prov_helper<
131 typedef typename ProviderType::template OperatorNewAllocatorType<T>::Type AllocatorType;
146 EIGEN_MAKE_ALIGNED_OPERATOR_NEW ;
153 #ifdef TOMOGRAPHER_TEST_TOOLS_NEEDOWNOPERATORNEW_DEBUG_MEMBERS 156 : EigenAlignedOperatorNewIsActive(
true)
159 const bool EigenAlignedOperatorNewIsActive;
173 template<
typename Scalar,
int FixedRows,
int FixedCols,
int Options,
int MaxRows,
int MaxCols>
177 template<
typename Scalar,
int FixedRows,
int FixedCols,
int Options,
int MaxRows,
int MaxCols>
193 template<
typename Type1,
typename Type2,
typename... OtherTypes>
197 namespace tomo_internal {
199 template<
bool same_provider_type,
bool t1_trivial_provider,
bool t2_trivial_provider,
200 typename Type1,
typename Type2,
typename... OtherTypes>
201 struct need_own_operator_new_combination_helper {
203 static_assert(!same_provider_type && !t1_trivial_provider && !t2_trivial_provider,
204 "ERROR: you have a type which requested a NeedOwnOperatorNew<T1,T2> " 205 "with incompatible needs.") ;
208 template<
bool t1_trivial_provider,
bool t2_trivial_provider,
209 typename Type1,
typename Type2,
typename... OtherTypes>
210 struct need_own_operator_new_combination_helper<true, t1_trivial_provider, t2_trivial_provider,
211 Type1, Type2, OtherTypes...> {
216 template<
bool t2_trivial_provider,
217 typename Type1,
typename Type2,
typename... OtherTypes>
218 struct need_own_operator_new_combination_helper<false, true, t2_trivial_provider,
219 Type1, Type2, OtherTypes...> {
224 template<
typename Type1,
typename Type2,
typename... OtherTypes>
225 struct need_own_operator_new_combination_helper<false, false, true,
226 Type1, Type2, OtherTypes...> {
235 template<
typename Type1,
typename Type2,
typename... OtherTypes>
238 typedef tomo_internal::need_own_operator_new_combination_helper<
241 std::is_same<typename NeedOwnOperatorNew<Type1>::ProviderType,
245 Type1, Type2, OtherTypes...
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.