some fixes, introduce const operation classes for conistency reasons
This commit is contained in:
parent
0066cfef54
commit
ed53e4b3c7
10 changed files with 371 additions and 18 deletions
|
@ -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 = ∈
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
|
|
@ -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()){
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
10
src/slice.cc
10
src/slice.cc
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue