diff --git a/src/multi_array.cc b/src/multi_array.cc index 2021591..a045264 100644 --- a/src/multi_array.cc +++ b/src/multi_array.cc @@ -62,7 +62,7 @@ namespace MultiArrayTools template ConstMultiArrayOperationRoot MultiArrayBase::operator()(const NameTypes&... str) const { - return MultiArrayOperationRoot(*this, Name("master", str...)); + return ConstMultiArrayOperationRoot(*this, Name("master", str...)); } template @@ -158,6 +158,12 @@ namespace MultiArrayTools return mCont[ i.pos() ]; } + template + bool MultiArray::isConst() const + { + return false; + } + template bool MultiArray::isSlice() const { diff --git a/src/multi_array.h b/src/multi_array.h index 25fec77..32eb447 100644 --- a/src/multi_array.h +++ b/src/multi_array.h @@ -38,6 +38,8 @@ namespace MultiArrayTools virtual const Range& range() const; + virtual bool isConst() const = 0; + template MultiArrayOperationRoot operator()(const NameTypes&... str); @@ -78,7 +80,8 @@ namespace MultiArrayTools T& operator[](const typename Range::IndexType& i) override; const T& operator[](const typename Range::IndexType& i) const override; - + + virtual bool isConst() const override; virtual bool isSlice() const override; // virtual void manipulate(ManipulatorBase& mb, diff --git a/src/multi_array_operation.cc b/src/multi_array_operation.cc index da34107..a969fab 100644 --- a/src/multi_array_operation.cc +++ b/src/multi_array_operation.cc @@ -40,7 +40,7 @@ namespace MultiArrayTools IndexType& iref = dynamic_cast(*MAOB::mIibPtr); //CHECK; const size_t endPos = mArrayRef.end().pos(); - std::cout << "assignment: " << endPos << "elements" << std::endl; + std::cout << "assignment: " << endPos << " elements" << std::endl; for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){ std::cout << iref.pos() << '\r' << std::flush; get() = in.get(); @@ -59,16 +59,17 @@ namespace MultiArrayTools return *this; } + template template const MultiArrayOperationRoot& MultiArrayOperationRoot::makeConstSlice(const MultiArrayOperationRoot& in) { - ConstSlice& sl = dynamic_cast&>( mArrayRef ); - sl.set(in.mArrayRef, name(), dynamic_cast( in.index() ), in.name()); + Slice& sl = dynamic_cast&>( mArrayRef ); + sl.setConst(in.mArrayRef, name(), dynamic_cast( in.index() ), in.name()); return *this; } - + // CONST SLICE !!!!! @@ -91,6 +92,7 @@ namespace MultiArrayTools MultiArrayOperationRoot::operator=(const MultiArrayOperationRoot& in) { performAssignment(in); + freeIndex(); return *this; } @@ -104,6 +106,7 @@ namespace MultiArrayTools return makeSlice(in); } performAssignment(in); + freeIndex(); return *this; } @@ -117,9 +120,11 @@ namespace MultiArrayTools return makeSlice(in); } performAssignment(in); + freeIndex(); return *this; } + template template const MultiArrayOperationRoot& @@ -131,6 +136,7 @@ namespace MultiArrayTools return makeConstSlice(in); } performAssignment(in); + freeIndex(); return *this; } @@ -146,6 +152,7 @@ namespace MultiArrayTools assert(0); } performAssignment(in); + freeIndex(); return *this; } @@ -301,17 +308,28 @@ namespace MultiArrayTools /************************************** * ConstMultiArrayOperationBase * **************************************/ - + + /* template template const ConstMultiArrayOperationRoot& - ConstMultiArrayOperationRoot::makeConstSlice(const ConstMultiArrayOperationRoot& in) const + ConstMultiArrayOperationRoot::makeConstSlice(const ConstMultiArrayOperationRoot& in) { ConstSlice& sl = dynamic_cast&>( mArrayRef ); sl.set(in.mArrayRef, name(), dynamic_cast( in.index() ), in.name()); return *this; } + template + template + const ConstMultiArrayOperationRoot& + ConstMultiArrayOperationRoot::makeConstSlice(const MultiArrayOperationRoot& in) + { + ConstSlice& sl = dynamic_cast&>( mArrayRef ); + sl.set(in.mArrayRef, name(), dynamic_cast( in.index() ), in.name()); + return *this; + } + */ // CONST SLICE !!!!! @@ -341,7 +359,8 @@ namespace MultiArrayTools MAOB::mIibPtr->name(mNm); //mIndex.name(nm); } - + + /* template const ConstMultiArrayOperationRoot& ConstMultiArrayOperationRoot::operator=(const ConstMultiArrayOperationRoot& in) @@ -368,6 +387,20 @@ namespace MultiArrayTools return *this; } + template + template + const ConstMultiArrayOperationRoot& + ConstMultiArrayOperationRoot::operator=(const MultiArrayOperationRoot& in) + { + //CHECK; + if(mArrayRef.isSlice() and not mArrayRef.isInit()){ + //CHECK; + return makeConstSlice(in); + } + assert(0); + return *this; + } + */ template template MultiArrayOperation, MAOps...> @@ -444,7 +477,6 @@ namespace MultiArrayTools template const T& ConstMultiArrayOperationRoot::get() const { - //return mArrayRef[mIndex]; return mArrayRef[*dynamic_cast(MAOB::mIibPtr)]; } diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index 8967ef9..ff74c66 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -59,6 +59,7 @@ namespace MultiArrayTools template MultiArrayOperationRoot& operator=(MultiArrayOperationRoot& in); + template const MultiArrayOperationRoot& operator=(const MultiArrayOperationRoot& in); @@ -122,6 +123,9 @@ namespace MultiArrayTools template friend class MultiArrayOperationRoot; + + template + friend class ConstMultiArrayOperationRoot; protected: @@ -130,6 +134,7 @@ namespace MultiArrayTools template MultiArrayOperationRoot& makeSlice(MultiArrayOperationRoot& in); + template const MultiArrayOperationRoot& makeConstSlice(const MultiArrayOperationRoot& in); @@ -149,12 +154,17 @@ namespace MultiArrayTools ConstMultiArrayOperationRoot(const MultiArrayBase& ma, const Name& nm); ConstMultiArrayOperationRoot(const MultiArrayOperationRoot& in); - + + /* const ConstMultiArrayOperationRoot& operator=(const ConstMultiArrayOperationRoot& in); template const ConstMultiArrayOperationRoot& operator=(const ConstMultiArrayOperationRoot& in); - + + template + const ConstMultiArrayOperationRoot& operator=(const MultiArrayOperationRoot& in); + */ + //template //MultiArrayOperation, MAOps...> //operator()(Operation& op, const MAOps&... secs) const; @@ -196,14 +206,22 @@ namespace MultiArrayTools const MultiArrayBase& getCont() const { return mArrayRef; } + template + friend class ConstMultiArrayOperationRoot; + template friend class MultiArrayOperationRoot; protected: + /* template - const ConstMultiArrayOperationRoot& makeConstSlice(const ConstMultiArrayOperationRoot& in) const; - + const ConstMultiArrayOperationRoot& makeConstSlice(const ConstMultiArrayOperationRoot& in); + + template + const ConstMultiArrayOperationRoot& makeConstSlice(const MultiArrayOperationRoot& in); + */ + // const MultiArrayBase const& mArrayRef; mutable IndexType mIndex; Name mNm; diff --git a/src/slice.cc b/src/slice.cc index 2e17a66..9d07fc0 100644 --- a/src/slice.cc +++ b/src/slice.cc @@ -23,6 +23,8 @@ namespace MultiArrayTools const Name& MANm) // for correct linkage) { MAB::mInit = true; + mOwnName = ownNm; + mMAName = MANm; mMultiArrayPtr = &multiArrayRef; mMAIdx = MAIdx; mOwnIdx = MAB::mRange->begin(); @@ -31,6 +33,24 @@ namespace MultiArrayTools mMAIdx.linkTo(&mOwnIdx); } + template + void Slice::setConst(const MultiArrayBase& multiArrayRef, + const Name& ownNm, // for correct linkage + const typename MARange::IndexType& MAIdx, // for desired slice position + const Name& MANm) // for correct linkage) + { + MAB::mInit = true; + mOwnName = ownNm; + mMAName = MANm; + mConstMultiArrayPtr = &multiArrayRef; + mMAIdx = MAIdx; + mOwnIdx = MAB::mRange->begin(); + mMAIdx.name(MANm); + mOwnIdx.name(ownNm); + mMAIdx.linkTo(&mOwnIdx); + } + + template auto Slice::begin() const -> decltype(Range().begin()) { @@ -58,23 +78,55 @@ namespace MultiArrayTools //mOwnIdx = i.pos(); return (*mMultiArrayPtr)[ mMAIdx ]; } - + + template + bool Slice::isConst() const + { + return false; + } + template ConstSlice:: ConstSlice(const Range& range) : MultiArrayBase(range) {} + template + ConstSlice:: + ConstSlice(const Slice& slice) : + MultiArrayBase(slice.range()), + mOwnIdx(slice.mOwnIdx), + mMAIdx(slice.mMAIdx) + { + if(slice.mInit){ + MAB::mInit = true; + mMultiArrayPtr = slice.mConstMultiArrayPtr; + mMAIdx = slice.mMAIdx; + mOwnIdx = MAB::mRange->begin(); + mMAIdx.name(slice.mMAName); + mOwnIdx.name(slice.mOwnName); + mMAIdx.linkTo(&mOwnIdx); + } + } + + template bool ConstSlice::isSlice() const { return true; } + template + bool ConstSlice::isConst() const + { + return true; + } + + /* template void ConstSlice::set(const MultiArrayBase& multiArrayRef, const Name& ownNm, // for correct linkage const typename MARange::IndexType& MAIdx, // for desired slice position - const Name& MANm) // for correct linkage) + const Name& MANm) const // for correct linkage) { MAB::mInit = true; mMultiArrayPtr = &multiArrayRef; @@ -84,7 +136,7 @@ namespace MultiArrayTools mOwnIdx.name(ownNm); mMAIdx.linkTo(&mOwnIdx); } - + */ template auto ConstSlice::begin() const -> decltype(Range().begin()) { diff --git a/src/slice.h b/src/slice.h index a9ff66e..7020ef3 100644 --- a/src/slice.h +++ b/src/slice.h @@ -33,17 +33,29 @@ namespace MultiArrayTools virtual auto end() const -> decltype(Range().end()) override; virtual bool isSlice() const override; - + virtual bool isConst() const override; + void set(MultiArrayBase& multiArrayRef, const Name& ownNm, const typename MARange::IndexType& MAIdx, - const Name& MANm); + const Name& MANm); + + void setConst(const MultiArrayBase& multiArrayRef, + const Name& ownNm, + const typename MARange::IndexType& MAIdx, + const Name& MANm); + + template + friend class ConstSlice; private: - + + MultiArrayBase const* mConstMultiArrayPtr = nullptr; MultiArrayBase* mMultiArrayPtr = nullptr; mutable typename Range::IndexType mOwnIdx; mutable typename MARange::IndexType mMAIdx; + Name mOwnName; + Name mMAName; }; template @@ -54,6 +66,7 @@ namespace MultiArrayTools typedef MultiArrayBase MAB; ConstSlice(const Range& range); + ConstSlice(const Slice& slice); virtual T& operator[](const typename Range::IndexType& i) override; virtual const T& operator[](const typename Range::IndexType& i) const override; @@ -65,12 +78,14 @@ namespace MultiArrayTools virtual auto end() const -> decltype(Range().end()) override; virtual bool isSlice() const override; - + virtual bool isConst() const override; + + /* void set(const MultiArrayBase& multiArrayRef, const Name& ownNm, const typename MARange::IndexType& MAIdx, - const Name& MANm); - + const Name& MANm) const; + */ private: // !!!