// -*- C++ -*- #ifndef __ma_block_h__ #define __ma_block_h__ #include #include #include "base_def.h" namespace MultiArrayHelper { enum class BlockType { INDEF = 0, BLOCK = 1, VALUE = 2, SPLIT = 3, RESULT = 4 }; // manage vectorization in the future !! template class BlockBinaryOp { public: BlockBinaryOp() = default; BlockResult operator()(const BlockBase& arg1, const BlockBase& arg2); }; template class BlockBase { public: BlockBase() = default; BlockBase(size_t size); BlockBase(BlockBase&& res) = default; BlockBase& operator=(BlockBase&& res) = default; virtual BlockType type() const = 0; virtual size_t size() const; virtual const T& operator[](size_t pos) const = 0; virtual BlockBase& set(size_t npos) = 0; template BlockResult operate(const BlockBase& in); BlockResult operator+(const BlockBase& in); BlockResult operator-(const BlockBase& in); BlockResult operator*(const BlockBase& in); BlockResult operator/(const BlockBase& in); protected: size_t mSize; }; template class MutableBlockBase : public BlockBase { public: MutableBlockBase() = default; MutableBlockBase(size_t size); MutableBlockBase& operator=(const BlockBase& in); MutableBlockBase(MutableBlockBase&& res) = default; MutableBlockBase& operator=(MutableBlockBase&& res) = default; virtual T& operator[](size_t pos) = 0; }; template class Block : public BlockBase { public: Block() = default; Block(const std::vector& data, size_t begPos, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual Block& set(size_t npos) override; protected: const std::vector* mData; const T* mBegPtr; }; template class MBlock : public MutableBlockBase { public: MBlock() = default; MBlock(std::vector& data, size_t begPos, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual T& operator[](size_t pos) override; virtual MBlock& set(size_t npos) override; protected: std::vector* mData; T* mBegPtr; }; template class BlockValue : public BlockBase { public: BlockValue() = default; BlockValue(const std::vector& data, size_t pos, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual BlockValue& set(size_t npos) override; protected: const std::vector* mData; T& mVal; }; template class MBlockValue : public MutableBlockBase { public: MBlockValue() = default; MBlockValue(std::vector& data, size_t pos, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual T& operator[](size_t pos) override; virtual MBlockValue& set(size_t npos) override; protected: std::vector* mData; T& mVal; }; template class SplitBlock : public BlockBase { public: SplitBlock() = default; SplitBlock(const std::vector& data, size_t begPos, size_t stepSize, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual SplitBlock& set(size_t npos) override; protected: const std::vector* mData; size_t mStepSize; const T* mBegPtr; }; template class MSplitBlock : public MutableBlockBase { public: MSplitBlock() = default; MSplitBlock(std::vector& data, size_t begPos, size_t stepSize, size_t size); virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual T& operator[](size_t pos) override; virtual MSplitBlock& set(size_t npos) override; protected: std::vector* mData; size_t mStepSize; T* mBegPtr; }; template class BlockResult : public MutableBlockBase { public: BlockResult() = default; BlockResult(size_t size); BlockResult(BlockResult&& res) = default; BlockResult& operator=(BlockResult&& res) = default; virtual BlockType type() const override; virtual const T& operator[](size_t pos) const override; virtual T& operator[](size_t i) override; virtual BlockResult& set(size_t npos) override; protected: std::vector mRes; }; } // end namespace MultiArrayHelper #include "block.cc" #endif