// -*- C++ -*- #ifndef __multi_array_h__ #define __multi_array_h__ #include #include #include #include "base_def.h" #include "multi_array_operation.h" #include "manipulator.h" #include "name.h" namespace MultiArrayTools { template class MultiArrayBase { public: // iterator ( containing idx of Range ) DEFAULT_MEMBERS(MultiArrayBase); MultiArrayBase(const Range& range); virtual ~MultiArrayBase() = default; virtual T& operator[](const typename Range::IndexType& i) = 0; virtual const T& operator[](const typename Range::IndexType& i) const = 0; virtual size_t size() const; virtual bool isSlice() const = 0; virtual auto begin() const -> decltype(Range().begin()); virtual auto end() const -> decltype(Range().end()); virtual const Range& range() const; template MultiArrayOperationRoot operator()(const NameTypes&... str); template MultiArrayOperationRoot operator()(const NameType& name, bool master); virtual bool isInit() const; protected: bool mInit = false; std::shared_ptr mRange; }; template class MultiArray : public MultiArrayBase { public: typedef MultiArrayBase MAB; DEFAULT_MEMBERS(MultiArray); MultiArray(const Range& range); MultiArray(const Range& range, const std::vector& vec); MultiArray(const Range& range, std::vector&& vec); template MultiArray(const MultiArray,Range3> in); template MultiArray& operator=(const MultiArray,Range3> in); T& operator[](const typename Range::IndexType& i) override; const T& operator[](const typename Range::IndexType& i) const override; virtual bool isSlice() const override; // virtual void manipulate(ManipulatorBase& mb, // const typename Range::IndexType& manBegin, // const typename Range::IndexType& manEnd); template friend class MultiArray; private: std::vector mCont; }; } #include "multi_array.cc" #endif