diff --git a/src/include/functional_multi_array.h b/src/include/functional_multi_array.h index bd014c2..6207432 100644 --- a/src/include/functional_multi_array.h +++ b/src/include/functional_multi_array.h @@ -3,6 +3,7 @@ #define __functional_multi_array__ #include "multi_array_base.h" +#include "slice.h" namespace MultiArrayTools { @@ -16,6 +17,13 @@ namespace MultiArrayTools typedef MultiArrayBase MAB; typedef typename MultiArrayBase::const_iterator const_iterator; typedef typename CRange::IndexType IndexType; + + + private: + mutable T mVal; + Function mFunc; + + public: DEFAULT_MEMBERS(FunctionalMultiArray); FunctionalMultiArray(const std::shared_ptr&... ranges, const Function& func); @@ -26,13 +34,10 @@ namespace MultiArrayTools virtual bool isSlice() const override; // EVALUTAION CLASS ??!!!! + + auto operator()(std::shared_ptr&... inds) const + -> decltype( mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ) ) - //virtual ConstOperationRoot - //operator()(std::shared_ptr&... inds) const override; - - private: - mutable T mVal; - Function mFunc; }; @@ -78,6 +83,15 @@ namespace MultiArrayTools return false; } + template + auto FunctionalMultiArray:: + operator()(std::shared_ptr&... inds) const + -> decltype( mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ) ) + { + return mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ); + } + + } // namespace MultiArrayTools #endif diff --git a/src/include/multi_array_operation.h b/src/include/multi_array_operation.h index fa032d5..4cba9e6 100644 --- a/src/include/multi_array_operation.h +++ b/src/include/multi_array_operation.h @@ -259,6 +259,12 @@ namespace MultiArrayTools }; + template + auto mkOperation(const OpFunction& f, const Ops&... ops) + -> Operation + { + return Operation(ops...); + } template class Contraction : public OperationTemplate > diff --git a/src/include/ranges/index_base.h b/src/include/ranges/index_base.h index d262306..6fd1962 100644 --- a/src/include/ranges/index_base.h +++ b/src/include/ranges/index_base.h @@ -60,6 +60,7 @@ namespace MultiArrayTools std::string id() const { return THIS().id(); } MetaType meta() const { return THIS().meta(); } + MetaType metaPtr() const { return THIS().metaPtr(); } I& at(const MetaType& meta) { return THIS().at(meta); } void print(size_t offset = 0) const { THIS().print(offset); } diff --git a/src/include/ranges/range_types/classic_range.h b/src/include/ranges/range_types/classic_range.h index 807cc02..e236443 100644 --- a/src/include/ranges/range_types/classic_range.h +++ b/src/include/ranges/range_types/classic_range.h @@ -45,6 +45,7 @@ namespace MultiArrayTools static constexpr bool defaultable = true; static constexpr size_t ISSTATIC = 0; static constexpr size_t SIZE = -1; + static constexpr bool HASMETACONT = false; static SingleRangeFactory factory(size_t size = 0) { return SingleRangeFactory(size); } diff --git a/src/include/ranges/range_types/spin_range.h b/src/include/ranges/range_types/spin_range.h index c21de74..0a8d118 100644 --- a/src/include/ranges/range_types/spin_range.h +++ b/src/include/ranges/range_types/spin_range.h @@ -51,6 +51,7 @@ namespace MultiArrayTools static constexpr size_t ISSTATIC = 1; static constexpr size_t SIZE = mSpinNum; + static constexpr bool HASMETACONT = false; static SingleRangeFactory factory() { return SingleRangeFactory(); } diff --git a/src/include/ranges/single_range.h b/src/include/ranges/single_range.h index a769d60..490dd55 100644 --- a/src/include/ranges/single_range.h +++ b/src/include/ranges/single_range.h @@ -137,10 +137,30 @@ namespace MultiArrayTools * SingleIndex * ******************/ + template + struct MetaPtrSetter + { + template + U* set(Range* r) + { + return &r->get(0); + } + }; + + template <> + struct MetaPtrSetter + { + template + U* set(Range* r) + { + return nullptr; + } + }; + template SingleIndex::SingleIndex(const std::shared_ptr >& range) : IndexInterface,U>(range, 0), - mMetaPtr(&IB::mRangePtr->get(0)) {} + mMetaPtr(MetaPtrSetter::HASMETACONT>::set(IB::mRangePtr)) {} template IndexType SingleIndex::type() const