diff --git a/src/include/arith.h b/src/include/arith.h index 540c071..b77d9aa 100644 --- a/src/include/arith.h +++ b/src/include/arith.h @@ -41,6 +41,16 @@ namespace MultiArrayHelper } }; + template + struct dynamic_function + { + template + static inline T apply(const Func& f, Us... args) + { + return f(args...); + } + } + } // end namespace MultiArrayHelper #endif diff --git a/src/include/multi_array_operation.h b/src/include/multi_array_operation.h index ccf12e1..fa032d5 100644 --- a/src/include/multi_array_operation.h +++ b/src/include/multi_array_operation.h @@ -258,6 +258,7 @@ namespace MultiArrayTools -> decltype(PackNum::mkLoop( mOps, exp)); }; + template class Contraction : public OperationTemplate > diff --git a/src/include/ranges/single_range.h b/src/include/ranges/single_range.h index c23d10d..a769d60 100644 --- a/src/include/ranges/single_range.h +++ b/src/include/ranges/single_range.h @@ -48,6 +48,7 @@ namespace MultiArrayTools int mm(std::intptr_t idxPtrNum); U meta(); + U* metaPtr(); SingleIndex& at(const U& metaPos); size_t dim(); // = 1 @@ -72,6 +73,8 @@ namespace MultiArrayTools auto iforh(Expr ex) const -> For,Expr,ForType::HIDDEN>; + private: + U* mMetaPtr; }; template @@ -110,7 +113,7 @@ namespace MultiArrayTools static constexpr bool defaultable = false; static constexpr size_t ISSTATIC = 0; static constexpr size_t SIZE = -1; - + static constexpr bool HASMETACONT = true; protected: @@ -136,7 +139,8 @@ namespace MultiArrayTools template SingleIndex::SingleIndex(const std::shared_ptr >& range) : - IndexInterface,U>(range, 0) {} + IndexInterface,U>(range, 0), + mMetaPtr(&IB::mRangePtr->get(0)) {} template IndexType SingleIndex::type() const @@ -182,9 +186,15 @@ namespace MultiArrayTools template U SingleIndex::meta() { - return std::dynamic_pointer_cast const>( IB::mRangePtr )->get( IB::pos() ); + return mMetaPtr[IB::mPos]; } + template + U* SingleIndex::metaPtr() + { + return mMetaPtr; + } + template SingleIndex& SingleIndex::at(const U& metaPos) {