// -*- C++ -*- #ifndef __multi_array_operation_h__ #define __multi_array_operation_h__ #include #include #include "base_def.h" #include "index_base.h" namespace MultiArrayTools { template class MultiArrayOperationBase { public: typedef decltype(MultiArray().begin()) IndexType; MultiArrayOperationBase(MultiArray& ma, const Name& nm); MultiArrayOperationBase& operator=(const MultiArrayOperationBase& in); //MultiArrayOperationBase(const MultiArrayOperationBase& in) = default; virtual ~MultiArrayOperationBase(); // execute AnyOperation // exception if range types are inconsitent with names template MultiArrayOperationBase& operator=(const MultiArrayOperationBase& in); template MultiArrayOperation operator()(Operation& op, const MultiArrayOperationBase&... secs); template MultiArrayOperation operator()(const Operation& op, const MultiArrayOperationBase&... secs); template MultiArrayOperation,Range2> operator+(const MultiArrayOperationBase& sec); template MultiArrayOperation,Range2> operator-(const MultiArrayOperationBase& sec); template MultiArrayOperation,Range2> operator*(const MultiArrayOperationBase& sec); template MultiArrayOperation,Range2> operator/(const MultiArrayOperationBase& sec); virtual size_t argNum() const; //IndexType& index() ; IndefinitIndexBase* index(); virtual void linkIndicesTo(IndefinitIndexBase* target) const; virtual T& get(); virtual const T& get() const; protected: MultiArray& mArrayRef; mutable IndexType mIndex; IndefinitIndexBase* mIibPtr = nullptr; Name mNm; }; template class MultiArrayOperation : public MultiArrayOperationBase { public: typedef MultiArrayOperationBase OB; typedef std::tuple... > OBT; MultiArrayOperation(MultiArray& ma, const Name& nm, Operation& op, const MultiArrayOperationBase&... secs); MultiArrayOperation(MultiArray& ma, const Name& nm, const Operation& op, const MultiArrayOperationBase&... secs); virtual size_t argNum() const override; virtual void linkIndicesTo(IndefinitIndexBase* target) const override; virtual T& get() override; virtual const T& get() const override; protected: mutable T mVal; Operation mOp; OBT mSecs; }; } #include "multi_array_operation.cc" #endif