8 #include <ints/IntSeqGetEl.hpp> 9 #include <metaprogramming/CRTP.hpp> 10 #include <metaprogramming/SwallowSemicolon.hpp> 11 #include <metaprogramming/TypeTraits.hpp> 12 #include <metaprogramming/UniversalReferences.hpp> 19 #define STATIC_CONSTEXPR(DESCRIPTION,LONG_DESCRIPTION,TYPE,NAME,...) 23 static constexpr TYPE NAME= 27 #define USING(DESCRIPTION,LONG_DESCRIPTION,NAME,...) 35 #define DEFINE_GETTER_WITH_DEFAULT(NAME, 43 constexpr bool _get ## NAME() 45 if constexpr(isClass<T>) 46 if constexpr(hasMember_ ## NAME<T>) 47 return RemRef<T>::NAME; 59 _get ## NAME<T,DEFVAL>() 78 #define IS_STORING_ATTRIBUTE(LONG_DESCRIPTION,...) 94 #define PROVIDE_TK(...) 102 template <
typename T,
108 #define PROVIDE_FUND(...) 116 template <
typename T,
127 #define PROVIDE_IS_ALIASING(LONG_DESCRIPTION,...) 129 template <typename Tref> 130 bool isAliasing(const Tref& alias) const 138 #define IS_ALIASING_ACCORDING_TO_POINTER(_p) 143 static_cast<const void*>(&alias); 145 static_cast<const void*>(_p); 155 #define IS_ASSIGNABLE_ATTRIBUTE(LONG_DESCRIPTION,...) 163 #define NOT_ASSIGNABLE 179 #define PROVIDE_MERGEABLE_COMPS(LONG_DESCRIPTION,...) 180 USING(,LONG_DESCRIPTION,MergeableComps,__VA_ARGS__); 183 template <typename Is, 184 typename=EnableIf<isIntSeq<Is>>> 185 static constexpr void assertMergeableWith() 187 static_assert(Unqualified<MergeableComps>::template isSubsetOf<Is>,"Unable to merge this components"); 191 DECLAUTO getMaximallyMergedCompsView() 193 return getMergedCompsView<MergeableComps>(); 197 #define NOT_MERGEABLE 201 #define PROVIDE_MERGEABLE_COMPS_MARKING_ONE_AS_NON_MERGEABLE(LONG_DESCRIPTION,IN_MERGEABLE_COMPS,POS) 203 InsertIntSeqInOrderedIntSeq< 216 #define PROVIDE_GET_MERGED_COMPS_VIEW(DESCRIPTION,...) 218 template <typename Is> 223 assertMergeableWith<Is>(); 236 #define PROVIDE_POS_OF_TCS_IN_RES_TK_AND_MERGED_DELIMS_FOR_REF(ID) 238 using PosOfRef ## ID ## TcsInResTk= 239 PosOfTypesNotAsserting<typename Tk::types,typename TK ## ID::types>; 242 using PosOfRef ## ID ## PresTcsInResTk= 243 FilterVariadicClassPos<IsPresent,PosOfRef ## ID ## TcsInResTk>; 246 template <typename MD> 247 using MergedDelims ## ID= 248 IntSeqGetElsAfterAppending<TK ## ID::nTypes,false,MD,PosOfRef ## ID ## TcsInResTk> 257 #define STATIC_ASSERT_IS_SMET(...) 270 template <
typename T>
277 #define PROVIDE_CALL_OPERATOR(QUALIFIER) 279 template <typename...Oth> 280 DECLAUTO operator
()(Oth&&...oth) QUALIFIER 283 std::cout<<"Using CRTP to cast call operator"<<std::endl; 286 (~(*this)).eval(forw<Oth>(oth)...); 292 #undef PROVIDE_CALL_OPERATOR 299 #define SMET_GOES_ON_LHS(LHS_FUN, 304 template <typename Lhs, 307 void assign(Lhs&& lhs, 313 cout<<"Moving " #SMET "to lhs"<<endl; 315 assign(LHS_FUN(forw<Lhs>(lhs)),rhs.ref);
#define DEFINE_HAS_MEMBER(TAG)
#define CRASH
Initialize the crasher.
#define PROVIDE_CRTP_CAST_OPERATOR(CLASS)
#define USING(DESCRIPTION, LONG_DESCRIPTION, NAME,...)
Provides an attribute.
#define PROVIDE_MERGEABLE_COMPS(LONG_DESCRIPTION,...)
#define IS_STORING_ATTRIBUTE(LONG_DESCRIPTION,...)
Provides a isStoring attribute.
#define DEFINE_GETTER_WITH_DEFAULT(NAME,DEFVAL)
Define a getter of an attibute, with a default.
#define IS_ASSIGNABLE_ATTRIBUTE(LONG_DESCRIPTION,...)
Provides a isAssignable attribute.
#define SWALLOW_SEMICOLON_AT_GLOBAL_SCOPE
#define SFINAE_ON_TEMPLATE_ARG(...)
#define STATIC_CONSTEXPR(DESCRIPTION, LONG_DESCRIPTION, TYPE, NAME,...)
Provides an attribute.
decltype(auto) operator+(T1 &&smet1, T2 &&smet2)
Implement smet1+smet2.
#define PROVIDE_ALSO_NON_CONST_METHOD(NAME)
Smart Expression Templates.
#define DECLAUTO
Short name for decltype(auto)
#define PROVIDE_CALL_OPERATOR(QUALIFIER)
Provide the call operator with a given qualifier.
#define STATIC_ASSERT_HAS_MEMBER(TAG,...)
#define DEFINE_BASE_TYPE(TYPE,...)
#define PROVIDE_IS_ALIASING(LONG_DESCRIPTION,...)
Provides a isAliasing method, taking alias as argument.