some fixes, introduce const operation classes for conistency reasons

This commit is contained in:
Christian Zimmermann 2017-03-16 19:30:43 +01:00
parent 0066cfef54
commit ed53e4b3c7
10 changed files with 371 additions and 18 deletions

View file

@ -28,6 +28,18 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
template <class MultiArray>
void checkPtr(const MultiArray& in, bool check = false)
{
static MultiArray const* ptr = nullptr;
if(not check){
ptr = &in;
}
else {
assert(ptr == &in);
}
}
/*********************** /***********************
* Provided Types * * Provided Types *
***********************/ ***********************/
@ -81,10 +93,18 @@ namespace MultiArrayTools
template <typename T> template <typename T>
class MultiArrayOperationBase; class MultiArrayOperationBase;
// multi_array_operation.h
template <typename T>
class MutableMultiArrayOperationBase;
// multi_array_operation.h // multi_array_operation.h
template <typename T, class Range> template <typename T, class Range>
class MultiArrayOperationRoot; class MultiArrayOperationRoot;
// multi_array_operation.h
template <typename T, class Range>
class ConstMultiArrayOperationRoot;
// multi_array_operation.h // multi_array_operation.h
template <typename T, class Operation, class... MAOps> template <typename T, class Operation, class... MAOps>
class MultiArrayOperation; class MultiArrayOperation;

View file

@ -83,6 +83,7 @@ namespace MultiArrayTools
void IndefinitIndexBase::setPos(size_t pos) void IndefinitIndexBase::setPos(size_t pos)
{ {
//CHECK;
//assert(not virt()); //assert(not virt());
mPos = pos; mPos = pos;
if(linked()){ if(linked()){

View file

@ -20,7 +20,10 @@ namespace MultiArrayTools
template <typename T, class Range> template <typename T, class Range>
auto MultiArrayBase<T,Range>::begin() const -> decltype(Range().begin()) auto MultiArrayBase<T,Range>::begin() const -> decltype(Range().begin())
{ {
return mRange->begin(); //VCHECK(not mRange);
auto i = mRange->begin();
//CHECK;
return i;
} }
template <typename T, class Range> template <typename T, class Range>
@ -46,6 +49,7 @@ namespace MultiArrayTools
template <class NameType> template <class NameType>
MultiArrayOperationRoot<T,Range> MultiArrayBase<T,Range>::operator()(const NameType& name, bool master) MultiArrayOperationRoot<T,Range> MultiArrayBase<T,Range>::operator()(const NameType& name, bool master)
{ {
//CHECK;
if(master){ if(master){
return MultiArrayOperationRoot<T,Range>(*this, name); return MultiArrayOperationRoot<T,Range>(*this, name);
} }
@ -54,6 +58,26 @@ namespace MultiArrayTools
} }
} }
template <typename T, class Range>
template <class... NameTypes>
ConstMultiArrayOperationRoot<T,Range> MultiArrayBase<T,Range>::operator()(const NameTypes&... str) const
{
return MultiArrayOperationRoot<T,Range>(*this, Name("master", str...));
}
template <typename T, class Range>
template <class NameType>
ConstMultiArrayOperationRoot<T,Range> MultiArrayBase<T,Range>::operator()(const NameType& name, bool master) const
{
//CHECK;
if(master){
return ConstMultiArrayOperationRoot<T,Range>(*this, name);
}
else {
return operator()(name);
}
}
template <typename T, class Range> template <typename T, class Range>
bool MultiArrayBase<T,Range>::isInit() const bool MultiArrayBase<T,Range>::isInit() const
{ {

View file

@ -44,6 +44,12 @@ namespace MultiArrayTools
template <class NameType> template <class NameType>
MultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master); MultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master);
template <class... NameTypes>
ConstMultiArrayOperationRoot<T,Range> operator()(const NameTypes&... str) const;
template <class NameType>
ConstMultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master) const;
virtual bool isInit() const; virtual bool isInit() const;
protected: protected:

View file

@ -21,6 +21,12 @@ namespace MultiArrayTools
return *mIibPtr; return *mIibPtr;
} }
template <typename T>
void MultiArrayOperationBase<T>::freeIndex()
{
mIibPtr->freeLinked();
}
/********************************* /*********************************
* MultiArrayOperationBase * * MultiArrayOperationBase *
*********************************/ *********************************/
@ -28,12 +34,18 @@ namespace MultiArrayTools
template <typename T, class Range> template <typename T, class Range>
void MultiArrayOperationRoot<T,Range>::performAssignment(const MultiArrayOperationBase<T>& in) void MultiArrayOperationRoot<T,Range>::performAssignment(const MultiArrayOperationBase<T>& in)
{ {
//CHECK;
in.linkIndicesTo(MAOB::mIibPtr); in.linkIndicesTo(MAOB::mIibPtr);
//CHECK;
IndexType& iref = dynamic_cast<IndexType&>(*MAOB::mIibPtr); IndexType& iref = dynamic_cast<IndexType&>(*MAOB::mIibPtr);
//CHECK;
const size_t endPos = mArrayRef.end().pos();
std::cout << "assignment: " << endPos << "elements" << std::endl;
for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){ for(iref = mArrayRef.begin().pos(); iref != mArrayRef.end(); ++iref){
// build in vectorization later std::cout << iref.pos() << '\r' << std::flush;
get() = in.get(); get() = in.get();
} }
//CHECK;
MAOB::mIibPtr->freeLinked(); MAOB::mIibPtr->freeLinked();
} }
@ -64,7 +76,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot<T,Range>:: MultiArrayOperationRoot<T,Range>::
MultiArrayOperationRoot(MultiArrayBase<T,Range>& ma, MultiArrayOperationRoot(MultiArrayBase<T,Range>& ma,
const Name& nm) : const Name& nm) :
MultiArrayOperationBase<T>(), MutableMultiArrayOperationBase<T>(),
mArrayRef(ma), mArrayRef(ma),
mIndex(mArrayRef.begin()), mIndex(mArrayRef.begin()),
mNm(nm) mNm(nm)
@ -86,6 +98,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot<T,Range>& MultiArrayOperationRoot<T,Range>&
MultiArrayOperationRoot<T,Range>::operator=(MultiArrayOperationRoot<T,Range>& in) MultiArrayOperationRoot<T,Range>::operator=(MultiArrayOperationRoot<T,Range>& in)
{ {
//CHECK;
maketurnSlice(in); maketurnSlice(in);
if(mArrayRef.isSlice() and not mArrayRef.isInit()){ if(mArrayRef.isSlice() and not mArrayRef.isInit()){
return makeSlice(in); return makeSlice(in);
@ -99,6 +112,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot<T,Range>& MultiArrayOperationRoot<T,Range>&
MultiArrayOperationRoot<T,Range>::operator=(MultiArrayOperationRoot<T,Range2>& in) MultiArrayOperationRoot<T,Range>::operator=(MultiArrayOperationRoot<T,Range2>& in)
{ {
//CHECK;
if(mArrayRef.isSlice() and not mArrayRef.isInit()){ if(mArrayRef.isSlice() and not mArrayRef.isInit()){
return makeSlice(in); return makeSlice(in);
} }
@ -111,7 +125,9 @@ namespace MultiArrayTools
const MultiArrayOperationRoot<T,Range>& const MultiArrayOperationRoot<T,Range>&
MultiArrayOperationRoot<T,Range>::operator=(const MultiArrayOperationRoot<T,Range2>& in) MultiArrayOperationRoot<T,Range>::operator=(const MultiArrayOperationRoot<T,Range2>& in)
{ {
//CHECK;
if(mArrayRef.isSlice() and not mArrayRef.isInit()){ if(mArrayRef.isSlice() and not mArrayRef.isInit()){
//CHECK;
return makeConstSlice(in); return makeConstSlice(in);
} }
performAssignment(in); performAssignment(in);
@ -123,6 +139,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot<T,Range>& MultiArrayOperationRoot<T,Range>&
MultiArrayOperationRoot<T,Range>::operator=(const MultiArrayOperation<T,Operation,MAOps...>& in) MultiArrayOperationRoot<T,Range>::operator=(const MultiArrayOperation<T,Operation,MAOps...>& in)
{ {
//CHECK;
if(mArrayRef.isSlice() and not mArrayRef.isInit()){ if(mArrayRef.isSlice() and not mArrayRef.isInit()){
// NO SLICE CREATION !!! (total array not initialized!!) // NO SLICE CREATION !!! (total array not initialized!!)
// throw ! // throw !
@ -132,19 +149,12 @@ namespace MultiArrayTools
return *this; return *this;
} }
/* template <typename T, class Range>
template <class Operation, class... MAOps>
MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
MultiArrayOperationRoot<T,Range>::operator()(Operation& op, const MAOps&... secs) const
{
return MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>(op, *this, secs...);
}*/
template <typename T, class Range> template <typename T, class Range>
template <class Operation, class... MAOps> template <class Operation, class... MAOps>
MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...> MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
MultiArrayOperationRoot<T,Range>::operator()(const Operation& op, const MAOps&... secs) const MultiArrayOperationRoot<T,Range>::operator()(const Operation& op, const MAOps&... secs) const
{ {
//CHECK;
return MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>(op, *this, secs...); return MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>(op, *this, secs...);
} }
@ -177,12 +187,14 @@ namespace MultiArrayTools
auto MultiArrayOperationRoot<T,Range>::operator/(const MAOp& sec) auto MultiArrayOperationRoot<T,Range>::operator/(const MAOp& sec)
-> decltype(operator()(std::divides<T>(), sec)) -> decltype(operator()(std::divides<T>(), sec))
{ {
//CHECK;
return operator()(std::divides<T>(), sec); return operator()(std::divides<T>(), sec);
} }
template <typename T, class Range> template <typename T, class Range>
MultiArrayOperationRoot<T,Range> MultiArrayOperationRoot<T,Range>::copyThis() MultiArrayOperationRoot<T,Range> MultiArrayOperationRoot<T,Range>::copyThis()
{ {
//CHECK;
return MultiArrayOperationRoot<T,Range>(mArrayRef, mNm); return MultiArrayOperationRoot<T,Range>(mArrayRef, mNm);
} }
@ -215,6 +227,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot<T,Range>& MultiArrayOperationRoot<T,Range>&
MultiArrayOperationRoot<T,Range>::operator/=(const MAOp& sec) MultiArrayOperationRoot<T,Range>::operator/=(const MAOp& sec)
{ {
//CHECK;
return (*this) = copyThis() / sec; return (*this) = copyThis() / sec;
} }
@ -276,6 +289,188 @@ namespace MultiArrayTools
return *this; return *this;
} }
template <typename T, class Range>
void MultiArrayOperationRoot<T,Range>::freeIndex()
{
MAOB::mIibPtr->freeLinked();
mIndex = mArrayRef.begin();
MAOB::mIibPtr = &mIndex;
MAOB::mIibPtr->name(mNm);
}
/**************************************
* ConstMultiArrayOperationBase *
**************************************/
template <typename T, class Range>
template <class RangeX>
const ConstMultiArrayOperationRoot<T,Range>&
ConstMultiArrayOperationRoot<T,Range>::makeConstSlice(const ConstMultiArrayOperationRoot<T,RangeX>& in) const
{
ConstSlice<T,Range,RangeX>& sl = dynamic_cast<ConstSlice<T,Range,RangeX>&>( mArrayRef );
sl.set(in.mArrayRef, name(), dynamic_cast<const typename RangeX::IndexType&>( in.index() ), in.name());
return *this;
}
// CONST SLICE !!!!!
template <typename T, class Range>
ConstMultiArrayOperationRoot<T,Range>::
ConstMultiArrayOperationRoot(const MultiArrayBase<T,Range>& ma,
const Name& nm) :
MultiArrayOperationBase<T>(),
mArrayRef(ma),
mIndex(mArrayRef.begin()),
mNm(nm)
{
MAOB::mIibPtr = &mIndex;
MAOB::mIibPtr->name(nm);
//mIndex.name(nm);
}
template <typename T, class Range>
ConstMultiArrayOperationRoot<T,Range>::
ConstMultiArrayOperationRoot(const MultiArrayOperationRoot<T,Range>& in) :
MultiArrayOperationBase<T>(),
mArrayRef(in.getCont()),
mIndex(mArrayRef.begin()),
mNm(in.name())
{
MAOB::mIibPtr = &mIndex;
MAOB::mIibPtr->name(mNm);
//mIndex.name(nm);
}
template <typename T, class Range>
const ConstMultiArrayOperationRoot<T,Range>&
ConstMultiArrayOperationRoot<T,Range>::operator=(const ConstMultiArrayOperationRoot<T,Range>& in)
{
//CHECK;
if(mArrayRef.isSlice() and not mArrayRef.isInit()){
return makeConstSlice(in);
}
assert(0);
return *this;
}
template <typename T, class Range>
template <class Range2>
const ConstMultiArrayOperationRoot<T,Range>&
ConstMultiArrayOperationRoot<T,Range>::operator=(const ConstMultiArrayOperationRoot<T,Range2>& in)
{
//CHECK;
if(mArrayRef.isSlice() and not mArrayRef.isInit()){
//CHECK;
return makeConstSlice(in);
}
assert(0);
return *this;
}
template <typename T, class Range>
template <class Operation, class... MAOps>
MultiArrayOperation<T,Operation,ConstMultiArrayOperationRoot<T,Range>, MAOps...>
ConstMultiArrayOperationRoot<T,Range>::operator()(const Operation& op, const MAOps&... secs) const
{
//CHECK;
return MultiArrayOperation<T,Operation,ConstMultiArrayOperationRoot<T,Range>, MAOps...>(op, *this, secs...);
}
template <typename T, class Range>
template <class MAOp>
auto ConstMultiArrayOperationRoot<T,Range>::operator+(const MAOp& sec) const
-> decltype(operator()(std::plus<T>(), sec))
{
return operator()(std::plus<T>(), sec);
}
template <typename T, class Range>
template <class MAOp>
auto ConstMultiArrayOperationRoot<T,Range>::operator-(const MAOp& sec) const
-> decltype(operator()(std::minus<T>(), sec))
{
return operator()(std::minus<T>(), sec);
}
template <typename T, class Range>
template <class MAOp>
auto ConstMultiArrayOperationRoot<T,Range>::operator*(const MAOp& sec) const
-> decltype(operator()(std::multiplies<T>(), sec))
{
return operator()(std::multiplies<T>(), sec);
}
template <typename T, class Range>
template <class MAOp>
auto ConstMultiArrayOperationRoot<T,Range>::operator/(const MAOp& sec) const
-> decltype(operator()(std::divides<T>(), sec))
{
//CHECK;
return operator()(std::divides<T>(), sec);
}
template <typename T, class Range>
ConstMultiArrayOperationRoot<T,Range> ConstMultiArrayOperationRoot<T,Range>::copyThis() const
{
//CHECK;
return ConstMultiArrayOperationRoot<T,Range>(mArrayRef, mNm);
}
template <typename T, class Range>
const MultiArrayBase<T,Range>& ConstMultiArrayOperationRoot<T,Range>::operator*() const
{
return mArrayRef;
}
template <typename T, class Range>
MultiArrayBase<T,Range> const* ConstMultiArrayOperationRoot<T,Range>::operator->() const
{
return &mArrayRef;
}
template <typename T, class Range>
size_t ConstMultiArrayOperationRoot<T,Range>::argNum() const
{
return 1;
}
template <typename T, class Range>
void ConstMultiArrayOperationRoot<T,Range>::linkIndicesTo(IndefinitIndexBase* target) const
{
MAOB::mIibPtr->linkTo(target);
}
template <typename T, class Range>
const T& ConstMultiArrayOperationRoot<T,Range>::get() const
{
//return mArrayRef[mIndex];
return mArrayRef[*dynamic_cast<IndexType*>(MAOB::mIibPtr)];
}
template <typename T, class Range>
const Name& ConstMultiArrayOperationRoot<T,Range>::name() const
{
return mNm;
}
template <typename T, class Range>
const ConstMultiArrayOperationRoot<T,Range>& ConstMultiArrayOperationRoot<T,Range>::operator[](const IndexType& ind) const
{
mIndex.copyPos(ind);
return *this;
}
template <typename T, class Range>
void ConstMultiArrayOperationRoot<T,Range>::freeIndex()
{
MAOB::mIibPtr->freeLinked();
mIndex = mArrayRef.begin();
MAOB::mIibPtr = &mIndex;
MAOB::mIibPtr->name(mNm);
}
/***************************** /*****************************
* MultiArrayOperation * * MultiArrayOperation *
*****************************/ *****************************/
@ -411,13 +606,14 @@ namespace MultiArrayTools
TupleIndicesLinker<sizeof...(MAOps)-1>::linkTupleIndicesTo(mArgs, target); TupleIndicesLinker<sizeof...(MAOps)-1>::linkTupleIndicesTo(mArgs, target);
} }
/*
template <typename T, class Operation, class... MAOps> template <typename T, class Operation, class... MAOps>
T& MultiArrayOperation<T,Operation,MAOps...>::get() T& MultiArrayOperation<T,Operation,MAOps...>::get()
{ {
mVal = OperationCall<sizeof...(MAOps)-1>:: mVal = OperationCall<sizeof...(MAOps)-1>::
template callOperation(mOp, mArgs); template callOperation(mOp, mArgs);
return mVal; return mVal;
} }*/
template <typename T, class Operation, class... MAOps> template <typename T, class Operation, class... MAOps>
const T& MultiArrayOperation<T,Operation,MAOps...>::get() const const T& MultiArrayOperation<T,Operation,MAOps...>::get() const

View file

@ -17,22 +17,33 @@ namespace MultiArrayTools
{ {
public: public:
MultiArrayOperationBase() = default; MultiArrayOperationBase() /*{ CHECK; }*/ = default;
virtual ~MultiArrayOperationBase(); virtual ~MultiArrayOperationBase();
virtual size_t argNum() const = 0; virtual size_t argNum() const = 0;
const IndefinitIndexBase& index() const; const IndefinitIndexBase& index() const;
virtual void linkIndicesTo(IndefinitIndexBase* target) const = 0; virtual void linkIndicesTo(IndefinitIndexBase* target) const = 0;
virtual T& get() = 0;
virtual const T& get() const = 0; virtual const T& get() const = 0;
virtual void freeIndex();
protected: protected:
IndefinitIndexBase* mIibPtr = nullptr; IndefinitIndexBase* mIibPtr = nullptr;
}; };
template <typename T>
class MutableMultiArrayOperationBase : public MultiArrayOperationBase<T>
{
public:
MutableMultiArrayOperationBase() /*{ CHECK; }*/ = default;
virtual T& get() = 0;
};
template <typename T, class Range> template <typename T, class Range>
class MultiArrayOperationRoot : public MultiArrayOperationBase<T> class MultiArrayOperationRoot : public MutableMultiArrayOperationBase<T>
{ {
public: public:
@ -89,6 +100,7 @@ namespace MultiArrayTools
MultiArrayOperationRoot& operator/=(const MAOp& sec); MultiArrayOperationRoot& operator/=(const MAOp& sec);
const MultiArrayBase<T,Range>& operator*() const; const MultiArrayBase<T,Range>& operator*() const;
//MultiArrayBase<T,Range>& operator*();
MultiArrayBase<T,Range> const* operator->() const; MultiArrayBase<T,Range> const* operator->() const;
virtual size_t argNum() const override; virtual size_t argNum() const override;
@ -104,6 +116,10 @@ namespace MultiArrayTools
const Name& name() const; const Name& name() const;
virtual void freeIndex() override;
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
template <typename U, class RangeX> template <typename U, class RangeX>
friend class MultiArrayOperationRoot; friend class MultiArrayOperationRoot;
@ -122,6 +138,77 @@ namespace MultiArrayTools
Name mNm; Name mNm;
}; };
template <typename T, class Range>
class ConstMultiArrayOperationRoot : public MultiArrayOperationBase<T>
{
public:
typedef MultiArrayOperationBase<T> MAOB;
typedef typename Range::IndexType IndexType;
//typedef decltype(MultiArray<T,Range>().begin()) IndexType;
ConstMultiArrayOperationRoot(const MultiArrayBase<T,Range>& ma, const Name& nm);
ConstMultiArrayOperationRoot(const MultiArrayOperationRoot<T,Range>& in);
const ConstMultiArrayOperationRoot& operator=(const ConstMultiArrayOperationRoot& in);
template <class Range2>
const ConstMultiArrayOperationRoot& operator=(const ConstMultiArrayOperationRoot<T,Range2>& in);
//template <class Operation, class... MAOps>
//MultiArrayOperation<T,Operation,MultiArrayOperationRoot<T,Range>, MAOps...>
//operator()(Operation& op, const MAOps&... secs) const;
template <class Operation, class... MAOps>
MultiArrayOperation<T,Operation,ConstMultiArrayOperationRoot<T,Range>, MAOps...>
operator()(const Operation& op, const MAOps&... secs) const;
template <class MAOp>
auto operator+(const MAOp& sec) const -> decltype(operator()(std::plus<T>(), sec));
template <class MAOp>
auto operator-(const MAOp& sec) const -> decltype(operator()(std::minus<T>(), sec));
template <class MAOp>
auto operator*(const MAOp& sec) const -> decltype(operator()(std::multiplies<T>(), sec));
template <class MAOp>
auto operator/(const MAOp& sec) const -> decltype(operator()(std::divides<T>(), sec));
ConstMultiArrayOperationRoot copyThis() const;
const MultiArrayBase<T,Range>& operator*() const;
//MultiArrayBase<T,Range>& operator*();
MultiArrayBase<T,Range> const* operator->() const;
virtual size_t argNum() const override;
// set index -> implement !!!!!
const ConstMultiArrayOperationRoot<T,Range>& operator[](const IndexType& ind) const;
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
virtual const T& get() const override;
const Name& name() const;
virtual void freeIndex() override;
const MultiArrayBase<T,Range>& getCont() const { return mArrayRef; }
template <typename U, class RangeX>
friend class MultiArrayOperationRoot;
protected:
template <class RangeX>
const ConstMultiArrayOperationRoot& makeConstSlice(const ConstMultiArrayOperationRoot<T,RangeX>& in) const;
MultiArrayBase<T,Range> const& mArrayRef;
mutable IndexType mIndex;
Name mNm;
};
template <typename T, class Operation, class... MAOps> template <typename T, class Operation, class... MAOps>
class MultiArrayOperation : public MultiArrayOperationBase<T> class MultiArrayOperation : public MultiArrayOperationBase<T>
{ {
@ -157,7 +244,7 @@ namespace MultiArrayTools
virtual void linkIndicesTo(IndefinitIndexBase* target) const override; virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
virtual T& get() override; //virtual T& get() override;
virtual const T& get() const override; virtual const T& get() const override;
protected: protected:

View file

@ -585,12 +585,15 @@ namespace MultiArrayTools
if(name == IIB::mName){ if(name == IIB::mName){
return this; return this;
} }
for(size_t i = 0; i != sizeof...(Indices); ++i){ for(size_t i = 0; i != sizeof...(Indices); ++i){
IndefinitIndexBase* iibPtr = get(i).getLinked(name); IndefinitIndexBase* iibPtr = get(i).getLinked(name);
if(iibPtr != nullptr){ if(iibPtr != nullptr){
//CHECK;
return iibPtr; return iibPtr;
} }
} }
//CHECK;
return nullptr; return nullptr;
} }

View file

@ -194,7 +194,7 @@ namespace MultiArrayTools
#ifdef LORENTZ_DIMENSION #ifdef LORENTZ_DIMENSION
return LORENTZ_DIMENSION; return LORENTZ_DIMENSION;
#else #else
return 4; return 1; // 4
#endif #endif
} }
@ -327,6 +327,8 @@ namespace MultiArrayTools
template <typename U, RangeType TYPE> template <typename U, RangeType TYPE>
IndefinitIndexBase* SingleIndex<U,TYPE>::getLinked(const std::string& name) IndefinitIndexBase* SingleIndex<U,TYPE>::getLinked(const std::string& name)
{ {
//VCHECK(name);
//VCHECK(IIB::mName);
if(name == IIB::mName){ if(name == IIB::mName){
return this; return this;
} }

View file

@ -104,4 +104,14 @@ namespace MultiArrayTools
//mOwnIdx = i.pos(); //mOwnIdx = i.pos();
return (*mMultiArrayPtr)[ mMAIdx ]; return (*mMultiArrayPtr)[ mMAIdx ];
} }
template <typename T, class Range, class MARange>
T& ConstSlice<T,Range,MARange>::operator[](const typename Range::IndexType& i)
{
assert(0);
mOwnIdx.copyPos(i);
//mOwnIdx = i.pos();
return x;
}
} }

View file

@ -55,6 +55,7 @@ namespace MultiArrayTools
ConstSlice(const Range& range); ConstSlice(const Range& range);
virtual T& operator[](const typename Range::IndexType& i) override;
virtual const T& operator[](const typename Range::IndexType& i) const override; virtual const T& operator[](const typename Range::IndexType& i) const override;
//Slice& setSlicePos(const Index& slicePos); //Slice& setSlicePos(const Index& slicePos);
@ -72,6 +73,9 @@ namespace MultiArrayTools
private: private:
// !!!
T x = static_cast<T>(0);
MultiArrayBase<T,MARange> const* mMultiArrayPtr = nullptr; MultiArrayBase<T,MARange> const* mMultiArrayPtr = nullptr;
mutable typename Range::IndexType mOwnIdx; mutable typename Range::IndexType mOwnIdx;
mutable typename MARange::IndexType mMAIdx; mutable typename MARange::IndexType mMAIdx;