diff --git a/src/multi_array.cc b/src/multi_array.cc index f48fe92..cfcbac4 100644 --- a/src/multi_array.cc +++ b/src/multi_array.cc @@ -35,6 +35,13 @@ namespace MultiArrayTools return *mRange; } + template + template + MultiArrayOperationRoot MultiArrayBase::operator()(const NameTypes&... str) + { + return MultiArrayOperationRoot(*this, Name("master", str...)); + } + /******************* * MultiArray * *******************/ @@ -76,13 +83,6 @@ namespace MultiArrayTools return mCont[ i.pos() ]; } - template - template - MultiArrayOperationRoot MultiArray::operator()(const NameTypes&... str) - { - return MultiArrayOperationRoot(*this, Name("master", str...)); - } - template bool MultiArray::isSlice() const { diff --git a/src/multi_array.h b/src/multi_array.h index a4de6af..f630bd5 100644 --- a/src/multi_array.h +++ b/src/multi_array.h @@ -32,6 +32,9 @@ namespace MultiArrayTools virtual auto end() -> decltype(Range().end()); virtual const Range& range() const; + + template + MultiArrayOperationRoot operator()(const NameTypes&... str); protected: std::shared_ptr mRange; @@ -50,9 +53,6 @@ namespace MultiArrayTools MultiArray(const Range& range, const std::vector& vec); MultiArray(const Range& range, std::vector&& vec); - template - MultiArrayOperationRoot operator()(const NameTypes&... str); - T& operator[](const typename Range::IndexType& i) override; const T& operator[](const typename Range::IndexType& i) const override; diff --git a/src/multi_array_operation.cc b/src/multi_array_operation.cc index ecde2e2..20353f6 100644 --- a/src/multi_array_operation.cc +++ b/src/multi_array_operation.cc @@ -43,12 +43,16 @@ namespace MultiArrayTools MultiArrayOperationRoot& MultiArrayOperationRoot::operator=(const MultiArrayOperationRoot& in) { + if(mArrayRef.isSlice()){ + Slice& sl = dynamic_cast&>( mArrayRef ); + + sl.set() + return *this; + } + in.linkIndicesTo(MAOB::mIibPtr); IndexType& iref = dynamic_cast(*MAOB::mIibPtr); - //if(mArrayRef.isSlice()){ - // linkSlice(&in.index(), MAOB::mIibPtr); - // return *this; - //} + for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){ // build in vectorization later get() = in.get(); @@ -62,12 +66,11 @@ namespace MultiArrayTools MultiArrayOperationRoot& MultiArrayOperationRoot::operator=(const MultiArrayOperation& in) { + // NO SLICE CREATION !!! (total array not initialized!!) + in.linkIndicesTo(MAOB::mIibPtr); IndexType& iref = dynamic_cast(*MAOB::mIibPtr); - //if(mArrayRef.isSlice()){ - // linkSlice(&in.index(), MAOB::mIibPtr); - // return *this; - //} + for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){ // build in vectorization later get() = in.get(); @@ -76,26 +79,6 @@ namespace MultiArrayTools return *this; } - /* - template - template - MultiArrayOperationRoot& - MultiArrayOperationRoot::operator=(const MultiArrayOperationBase& in) - { - in.linkIndicesTo(MAOB::mIibPtr); - IndexType& iref = dynamic_cast(*MAOB::mIibPtr); - if(mArrayRef.isSlice()){ - linkSlice(&in.index(), MAOB::mIibPtr); - return *this; - } - for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){ - // build in vectorization later - get() = in.get(); - } - MAOB::mIibPtr->freeLinked(); - return *this; - }*/ - template template MultiArrayOperation, MAOps...> diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index e44a9a7..11861ad 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -45,14 +45,6 @@ namespace MultiArrayTools template MultiArrayOperationRoot& operator=(const MultiArrayOperation& in); - //MultiArrayOperationRoot& operator=(const MultiArrayOperationRoot& in) = delete; - //MultiArrayOperationRoot(const MultiArrayOperationRoot& in) = default; - - // execute AnyOperation - // exception if range types are inconsitent with names - //MultiArrayOperationRoot& operator=(const MultiArrayOperationBase& in); - - template MultiArrayOperation, MAOps...> operator()(Operation& op, const MAOps&... secs); diff --git a/src/slice.cc b/src/slice.cc index 1aa1554..aaeeee6 100644 --- a/src/slice.cc +++ b/src/slice.cc @@ -5,32 +5,23 @@ namespace MultiArrayTools { - template + template Slice:: - Slice(MultiArrayBase& ma, const Index& slicePos) : + Slice() : MultiArrayBase(ma.range()), - multiArrayRef(ma), - mSlicePos(slicePos) {} + mMultiArrayRef(*this) {} - template - Slice& Slice::setSlicePos(const Index& slicePos) - { - mSlicePos = slicePos; - mMAPtr->linkTo(&mSlicePos); - return *this; - } - - template + template bool Slice::isSlice() const { return true; } - template - void Slice::setPtr(IndefinitIndexBase* MAPtr, - IndefinitIndexBase* ownPtr) + template + void Slice::set(MultiArrayBase& multiArrayRef, IndefinitIndexBase* MAPtr) { + mMultiArrayRef = multiArrayRef; + mMAPtr.reset(new typename MARange::IndexType(MAPtr)); - mOwnPtr.reset(new typename Range::IndexType(ownPtr)); } } diff --git a/src/slice.h b/src/slice.h index 7c295af..49b23f3 100644 --- a/src/slice.h +++ b/src/slice.h @@ -14,20 +14,19 @@ namespace MultiArrayTools // Range = range of slice // MARange = original range of multi array of which this is the slice // Index = index which determines the slice position (remnant of MARange w.o. Range) - template + template class Slice : public MultiArrayBase // yes, 'Range' is correct !!! { - //MA::mCont has to be empty; only make use of the provided functions public: - typedef MultiArrayBase MAB; + typedef MultiArrayBase MAB; - Slice(MultiArray& ma, const Index& slicePos); + Slice(); T& operator[](const typename Range::IndexType& i) override; const T& operator[](const typename Range::IndexType& i) const override; - Slice& setSlicePos(const Index& slicePos); + //Slice& setSlicePos(const Index& slicePos); // link given Index to mMAPtr which is index of total array auto begin() override -> decltype(Range().begin()); @@ -35,15 +34,14 @@ namespace MultiArrayTools virtual bool isSlice() const override; - void setPtr(IndefinitIndexBase* MAPtr, - IndefinitIndexBase* ownPtr); + void set(MultiArrayBase& multiArrayRef, IndefinitIndexBase* MAPtr); private: - MultiArrayBase& multiArrayRef; - IndefinitIndexBase* mMAPtr; // idx ptr for original MA Range + MultiArrayBase& mMultiArrayRef; + std::shared_ptr mMAPtr; // idx ptr for original MA Range IndefinitIndexBase* mOwnPtr; // idx ptr for own Range - Index mSlicePos; + //Index mSlicePos; };