// -*- C++ -*- #ifndef __multi_array_h__ #define __multi_array_h__ #include #include "multi_array_base.h" #include "ranges/anonymous_range.h" namespace MultiArrayTools { template struct ArrayCatter; template struct ArrayCatter { template static auto cat(const MultiArray& ma) -> MultiArray { return ma; } }; template class MultiArray : public MutableMultiArrayBase { public: typedef ContainerRange CRange; typedef MultiArrayBase MAB; typedef ContainerIndex IndexType; using MultiArrayBase::operator[]; using MutableMultiArrayBase::operator[]; DEFAULT_MEMBERS(MultiArray); MultiArray(const std::shared_ptr&... ranges); MultiArray(const std::shared_ptr&... ranges, const T& val); MultiArray(const std::shared_ptr&... ranges, const vector& vec); MultiArray(const std::shared_ptr&... ranges, vector&& vec); template MultiArray(const std::shared_ptr&... ranges, MultiArray&& in); // same effect as format MultiArray(const typename CRange::Space& space); MultiArray(const typename CRange::Space& space, const vector& vec); MultiArray(MultiArray&& ama, SIZET... sizes); // Only if ALL ranges have default extensions: //MultiArray(const vector& vec); //MultiArray(vector&& vec); // template // MultiArray(const MultiArray,Range3> in); // implement contstructor using FunctionalMultiArray as Input !!! //template //MultiArray& operator=(const MultiArray,Range3> in); virtual T& operator[](const IndexType& i) final; virtual const T& operator[](const IndexType& i) const final; virtual T& at(const typename IndexType::MetaType& meta) override; virtual const T& at(const typename IndexType::MetaType& meta) const override; virtual bool isConst() const override; virtual bool isSlice() const override; template MultiArray format(const std::shared_ptr&... nrs); // reformat array using 'nr' which in // total must have the same size as mRange template MultiArray format(const std::tuple...>& nrs); template Slice slformat(const std::shared_ptr&... nrs); template ConstSlice slformat(const std::shared_ptr&... nrs) const; virtual const T* data() const override; virtual T* data() override; virtual vector& vdata() { return mCont; } virtual const vector& vdata() const { return mCont; } vector&& vmove() { MAB::mInit = false; return std::move(mCont); } virtual std::shared_ptr > anonymous(bool slice = false) const override; //virtual std::shared_ptr > anonymousMove() override; auto cat() const -> decltype(ArrayCatter::cat(*this)); operator T() const; MultiArray& operator=(const T& in); MultiArray& operator+=(const MultiArray& in); MultiArray& operator-=(const MultiArray& in); MultiArray& operator*=(const T& in); MultiArray& operator/=(const T& in); template friend class MultiArray; private: vector mCont; }; template using Scalar = MultiArray; template Scalar scalar(const T& in); template struct ArrayCatter > { template static auto cat(const MultiArray,Ranges...>& ma) -> MultiArray { auto sma = *ma.begin(); const size_t smas = sma.size(); const size_t mas = ma.size(); auto cr = ma.range()->cat(sma.range()); vector ov; ov.reserve(mas * smas); for(auto& x: ma){ assert(x.size() == smas); ov.insert(ov.end(), x.vdata().begin(), x.vdata().end()); } return MultiArray(cr->space(), std::move(ov)); } }; } /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ #endif