// -*- C++ -*- #ifndef __anonymous_range_h__ #define __anonymous_range_h__ #include #include "base_def.h" namespace MultiArrayTools { typedef SingleIndex AnonymousIndex; template class AnonymousRangeFactory : public RangeFactoryBase { public: typedef SingleRange oType; AnonymousRangeFactory() = delete; AnonymousRangeFactory(const std::shared_ptr... origs); std::shared_ptr create(); }; class AnonymousRange : public RangeInterface { typedef RangeBase RB; typedef typename RangeInterface::IndexType IndexType; virtual size_t size() const override; virtual size_t dim() const override; const size_t& get(size_t pos) const; size_t getMeta(const size_t& metaPos) const; virtual IndexType begin() const override; virtual IndexType end() const override; virtual std::shared_ptr index() const override; friend AnonymousRangeFactory; protected: AnonymousRange() = delete; AnonymousRange(const AnonymousRange& in) = delete; template AnonymousRange(const std::shared_ptr... origs); size_t mSize; std::vector > mOrig; }; } /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ namespace MultiArrayTools { /******************** * AnonymousRange * ********************/ AnonymousRangeFactory::AnonymousRangeFactory(const std::shared_ptr... origs) { mProd = std::shared_ptr( new AnonymousRange( space ) ); } std::shared_ptr AnonymousRangeFactory::create() { setSelf(); return mProd; } /******************** * AnonymousRange * ********************/ AnonymousRange::AnonymousRange(const std::shared_ptr... origs) : RangeInterface() { // mOrig !!!! // mSize !!! = (prod origs.size...) } const size_t& AnonymousRange::get(size_t pos) const { static size_t x; x = pos; return x; } size_t AnonymousRange::getMeta(const size_t& metaPos) const { return metaPos; } size_t AnonymousRange::size() const { return mSize; } size_t AnonymousRange::dim() const { return 1; } typename AnonymousRange::IndexType AnonymousRange::begin() const { SingleIndex i( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ); i = 0; return i; } typename AnonymousRange::IndexType AnonymousRange::end() const { SingleIndex i( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ); i = size(); return i; } // put this in the interface class !!! std::shared_ptr AnonymousRange::index() const { return std::make_shared ( std::dynamic_pointer_cast ( std::shared_ptr( RB::mThis ) ) ); } } #endif