// -*- C++ -*- #ifndef __container_range_h__ #define __container_range_h__ #include #include "base_def.h" namespace MultiArrayTools { template class ContainerRangeFactory : public RangeFactoryBase { public: typedef ContainerRange oType; ContainerRangeFactory() = delete; ContainerRangeFactory(const std::shared_ptr&... rs); ContainerRangeFactory(const ContainerRange::SpaceType& space); virtual std::shared_ptr create() override; protected: }; template class ContainerRange : public RangeInterface > { public: typedef std::tuple...> SpaceType; typedef typename RangeInterface >::IndexType IndexType; static const size_t dim = sizeof...(Ranges); virtual size_t dim() const override; virtual size_t size() const override; virtual typename IndexType begin() const override; virtual typename IndexType end() const override; virtual std::shared_ptr index() const override; friend ContainerRangeFactory; protected: ContainerRange() = default; ContainerRange(const ContainerRange& in) = delete; ContainerRange(const std::shared_ptr&... rs); ContainerRange(const SpaceType& space); SpaceType mSpace; }; template class ContainerIndex : public IndexInterface > { public: typedef std::tuple MetaType; typedef std::tuple...> IndexPack; ContainerIndex() = default; ContainerIndex(const ContainerIndex& in); ContainerIndex& operator=(const ContainerIndex& in); template ContainerIndex(const std::shared_ptr& range); virtual ContainerIndex& operator++() override; virtual ContainerIndex& operator--() override; virtual ContainerIndex& operator=(size_t pos) override; virtual MetaType meta() const override; virtual ContainerIndex& at(const MetaType& metaPos) override; virtual size_t dim() const override; virtual size_t pos() const override; // recalculate when externalControl == true ContainerIndex& operator()(const std::shared_ptr&... inds); // control via external indices protected: bool mExternControl = false; IndexPack mIPack; }; } // end namespace MultiArrayTools #include "container_range.cc" #endif