8 #include <ints/IntSeqCat.hpp> 9 #include <smet/BaseSmET.hpp> 10 #include <smet/Reference.hpp> 11 #include <tens/TensKind.hpp> 12 #include <tuple/TupleOrder.hpp> 13 #include <utility/Position.hpp> 24 #define STATIC_ASSERT_IS_NNARY_SMET(...) 29 #define IDENTITY_REPRESENTATIVE_FUNCTION 32 static DECLAUTO representativeFunction(T&& t) 105 #define EVAL_THROUGH_REPRESENTATIVE_FUNCTION_PASSING_COMPS_BY_NAME 113 template <typename...Args> 116 return this->evalThroughRepresentativeFunctionPassingCompsByName(IntsUpTo<NSmET>{}, 117 forw<Args>(args)...); 126 #define PROVIDE_NNARY_SMET_REFS_AND_CHECK_ARE_N(N) 132 Tuple<Reference<_Refs>...> refs; 137 TupleElementType<I,Tuple<_Refs...>>; 145 static_assert(N==sizeof...(_Refs)) 151 #define PROVIDE_SIMPLE_NNARY_COMP_SIZE 153 template <typename TC, 157 static_assert(I>=0
and I<NSmET,"Cannot search in negative or larger-than-N ref"); 164 constexpr bool found= 165 RefTk::template contains<TC>; 169 return get<I>(refs).template compSize<TC>(); 171 return compSize<TC,I+1
>(); 175 #define PROVIDE_FUND_ACCORDING_TO_REPRESENTATIVE_FUNCTION 182 static DECLAUTO _fundThroughRepresentativeFunction(IntSeq<Is...>) 184 return representativeFunction(typename RemRef<Ref<Is>>::Fund{}...); 189 decltype(_fundThroughRepresentativeFunction(IntsUpTo<NSmET>{})) 192 #define SAME_FUND_AS_REF(ID) 197 #define AS_ASSIGNABLE_AS_REF(ID) 201 #define SAME_TK_AS_REF(ID) 206 #define PROVIDE_POS_OF_RES_TCS_IN_REFS 208 using PosOfResTcsInRefsTk= 209 PosOfTcsOfTkInListOfTks<Tk,typename RemRef<_Refs>::Tk...>; 212 using PosOfResTcsPresInRefsTk= 213 PosOfTcsOfTkPresInListOfTks<Tk,typename RemRef<_Refs>::Tk...> 306 template <
typename RefsMD,
313 #define PROVIDE_EXTRA_MERGE_DELIMS(...) 319 #define NO_EXTRA_MERGE_DELIMS 324 #define PROVIDE_MERGEABLE_COMPS_ACCORDING_TO_REFS_AND_EXTRA 326 NnarySmETCompsMergeability< 327 Tuple<typename RemRef<_Refs>::MergeableComps...>, 334 #define MERGED_COMPS_VIEW_OF_REF(I) 335 get<I>(refs).template getMergedCompsView<TupleElementType<I,MDs>>() 338 #define PROVIDE_NNARY_GET_MERGED_COMPS_VIEW(DESCRIPTION,...) 340 template <typename Is> 345 assertMergeableWith<Is>(); 348 Tuple<InsertInOrderedIntSeq 350 IntSeqGetElsAfterAppending 351 <RemRef<_Refs>::Tk::nTypes, 354 PosOfTypesNotAsserting<typename Tk::types, 355 typename RemRef<_Refs>::Tk::types>>, 365 #define PROVIDE_NNARY_GET_MERGED_COMPS_VIEW_ACCORDING_TO_REPRESENTATIVE_FUNCTION 369 DECLAUTO mergedCompsViewAccordingToRepresentativeFunction(IntSeq<Is...>, 378 return mergedCompsViewAccordingToRepresentativeFunction(IntsUpTo<NSmET>{},MDs{})) 383 #define PROVIDE_NNARY_SMET_SIMPLE_CREATOR(NNARY_SMET ) 385 template <typename...SMETS, 386 typename=EnableIf<((isSame<Unqualified<SMETS>,Unqualified<_Refs>>) && ...)>> 387 explicit NNARY_SMET(SMETS&&...smets) : refs(forw<SMETS>(smets)...) 394 #define STATIC_ASSERT_IS_NNARY_SMET(...) 406 #define SIMPLE_NNARY_SMET_BUILDER(BUILDER, 411 template <typename...Ts> 412 NNARY_SMET<Ts...> BUILDER(Ts&&...smets) 414 return NNARY_SMET<Ts...>(forw<Ts>(smets)...); 420 #define FORWARD_IS_ALIASING_TO_REFS 422 template <typename Tref> 423 bool isAliasing(const Tref& alias) const 432 #define REPRESENTATIVE_FUNCTION_WINS_ALL 451 #define CANCEL_DUPLICATED_NNARY_SMET_CALL(CALLER, 456 template <typename T, 457 typename RrT=RemRef<T>, 458 typename Ref=typename RrT::template Ref<0
>, 459 typename RrRef=RemRef<Ref>, 460 bool SmETIsLvalue=isLvalue<RrT>, 461 bool RefIsLvalue=isLvalue<RrRef>, 462 bool RefIsStoring=isStoring<RrRef>, 463 bool RetByRef=RefIsStoring or 464 RefIsLvalue or SmETIsLvalue, 465 typename Ret=Conditional<RetByRef,RrRef&,RrRef>, 471 constexpr bool SmETIsConst=isConst<T>; 472 constexpr bool RefIsConst=isConst<Ref>; 475 cout<<"Removing duplicated call " # CALLER<<" "<<__PRETTY_FUNCTION__<<endl; 476 constexpr bool SmETIs=std::is_reference<T>::value; 477 constexpr bool RefIs=std::is_reference<Ref>::value; 478 cout<<" SmETIsLvalue: "<<SmETIsLvalue<<endl; 479 cout<<" SmETIs: "<<SmETIs<<endl; 480 cout<<" SmETIsConst: "<<SmETIsConst<<endl; 481 cout<<" RefIsLvalue: "<<RefIsLvalue<<endl; 482 cout<<" RefIs: "<<RefIs<<endl; 483 cout<<" RefIsConst: "<<RefIsConst<<endl; 486 return static_cast<Ret>(get<0
>(smet.refs)); 494 #define NNARY_SMET_GOES_INSIDE(EXT_FUN, 500 template <typename D, 504 return INT_FUN(EXT_FUN(get<0
>(smet.refs))); 515 #define ABSORB_DUPLICATED_NNARY_SMET_CALL(CALLER, 520 template <typename D, 524 return forw<D>(smet); #define MERGED_COMPS_VIEW_OF_REF(I)
Returns the merged comps view of the I-th Ref.
#define PROVIDE_NNARY_GET_MERGED_COMPS_VIEW_ACCORDING_TO_REPRESENTATIVE_FUNCTION
Uses the representativeFunction to provide a merged view.
#define DEFINE_HAS_MEMBER(TAG)
#define STATIC_ASSERT_IS_SMET(...)
#define EVAL_THROUGH_REPRESENTATIVE_FUNCTION_PASSING_COMPS_BY_NAME
Provides an evaluator through a representative function.
#define PROVIDE_POS_OF_RES_TCS_IN_REFS
Provide the position of result Tk TensComp in each input.
#define STATIC_ASSERT_ARE_N_TYPES(N, UNEXP_PARPACK)
Static assert if not passing exactly N types.
#define PROVIDE_TK(...)
Provides the Tk member.
#define PROVIDE_MERGEABLE_COMPS_ACCORDING_TO_REFS_AND_EXTRA
Provide MergeableComps delimiter according to references and extra.
#define PROVIDE_FUND(...)
Provides the Fund member.
#define CRASH
Initialize the crasher.
#define PROVIDE_CRTP_CAST_OPERATOR(CLASS)
#define CALL_CLASS_CONST_METHOD_REMOVING_CONST(...)
Call a const method removing any const qualifier.
#define PROVIDE_MERGEABLE_COMPS(LONG_DESCRIPTION,...)
#define PROVIDE_NNARY_GET_MERGED_COMPS_VIEW(DESCRIPTION,...)
Provides a getMergedCompsView method, taking Is as template parameter.
#define IS_ASSIGNABLE_ATTRIBUTE(LONG_DESCRIPTION,...)
Provides a isAssignable attribute.
#define SWALLOW_SEMICOLON_AT_GLOBAL_SCOPE
#define PROVIDE_EXTRA_MERGE_DELIMS(...)
Add an ExtraDelims IntSeq called ExtraDelims.
#define SFINAE_ON_TEMPLATE_ARG(...)
#define PROVIDE_FUND_ACCORDING_TO_REPRESENTATIVE_FUNCTION
Defines the Fund type using the call to representativeFunction.
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 STATIC_ASSERT_HAS_MEMBER(TAG,...)
decltype(auto) evalThroughRepresentativeFunctionPassingCompsByName(Ts &&...ts)
decltype(auto) constexpr _nnarySmETCompsMergeability(Tuple< MergeDelim... >, Tuple< PosOfResTcsInRefTk... >, IntSeq< PrevPosInts... >, ExtraDelim)
#define DEFINE_BASE_TYPE(TYPE,...)