diff --git a/src/anonymous_range.h b/src/anonymous_range.h index 19bcba0..4fff219 100644 --- a/src/anonymous_range.h +++ b/src/anonymous_range.h @@ -9,11 +9,50 @@ namespace MultiArrayTools { - typedef SingleIndex AnonymousIndex; - - class AnonymousRange : public RangeBase - { + 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; }; } @@ -22,6 +61,80 @@ namespace MultiArrayTools * --- 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 diff --git a/src/range_types/header.h b/src/range_types/header.h new file mode 100644 index 0000000..d551506 --- /dev/null +++ b/src/range_types/header.h @@ -0,0 +1,12 @@ + +#ifdef __single_range_h__ +// singel_range is template which is specialized here +// therefore it must be defined before... + +#ifndef __ranges_header__ +#define __ranges_header__ + +#include "spin_range.h" + +#endif +#endif diff --git a/src/range_types/spin_range.h b/src/range_types/spin_range.h new file mode 100644 index 0000000..3918c4b --- /dev/null +++ b/src/range_types/spin_range.h @@ -0,0 +1,65 @@ + +#ifdef __ranges_header__ +// assert, that this is only used within range_types/header.h + +#ifndef __spin_range_h__ +#define __spin_range_h__ + +namespace MultiArrayTools +{ + typedef SingleIndex SpinIndex; + + template <> + class SingleRangeFactory : public RangeFactoryBase + { + public: + + typedef SingleRange oType; + + SingleRangeFactory() = delete; + SingleRangeFactory(size_t spinNum); // = 4 :) + std::shared_ptr create(); + + }; + + template <> + class SingleRange : public RangeInterface + { + public: + typedef RangeBase RB; + typedef typename RangeInterface >::IndexType IndexType; + + virtual size_t size() const override; + virtual size_t dim() const override; + + const U& get(size_t pos) const; + size_t getMeta(const U& metaPos) const; + + virtual IndexType begin() const override; + virtual IndexType end() const override; + virtual std::shared_ptr index() const override; + + friend SingleRangeFactory; + + protected: + + SingleRange() = delete; + SingleRange(const SingleRange& in) = delete; + + SingleRange(size_t spinNum); + + size_t mSpinNum = 4; + }; +} + +/* ========================= * + * --- TEMPLATE CODE --- * + * ========================= */ + +namespace MultiArrayTools +{ + // ... !!!! +} + +#endif +#endif diff --git a/src/single_range.h b/src/single_range.h index 100a60a..33d0ffa 100644 --- a/src/single_range.h +++ b/src/single_range.h @@ -276,4 +276,6 @@ namespace MultiArrayTools } +#include "range_types/header.h" + #endif