2020-07-10 00:17:38 +02:00
|
|
|
|
|
|
|
#include "dynamic_operation.h"
|
2020-08-27 23:48:04 +02:00
|
|
|
#include "helper_tools.h"
|
2020-07-10 00:17:38 +02:00
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
template <typename T, class Operation>
|
2020-08-24 17:39:56 +02:00
|
|
|
T DynamicOperation<T,Operation>::get(const DExtT& pos) const
|
2020-07-10 00:17:38 +02:00
|
|
|
{
|
2020-08-12 16:48:07 +02:00
|
|
|
return mOp.get(pos.expl<ET>());
|
2020-07-10 00:17:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation>
|
2020-07-13 01:00:35 +02:00
|
|
|
DynamicOperationBase<T>& DynamicOperation<T,Operation>::set(const DExtT& pos)
|
2020-07-10 00:17:38 +02:00
|
|
|
{
|
|
|
|
mOp.set(pos.expl<ET>());
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation>
|
2020-07-13 01:00:35 +02:00
|
|
|
DExtT DynamicOperation<T,Operation>::rootSteps(std::intptr_t iPtrNum) const
|
2020-07-10 00:17:38 +02:00
|
|
|
{
|
2020-08-24 16:35:14 +02:00
|
|
|
return DExtT(mkDExt(mkExtT(mOp.rootSteps(iPtrNum))),None(0));
|
2020-07-10 00:17:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation>
|
|
|
|
DynamicExpression DynamicOperation<T,Operation>::loop(const DynamicExpression& exp) const
|
|
|
|
{
|
|
|
|
return mOp.loop(exp);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation>
|
|
|
|
const T* DynamicOperation<T,Operation>::data() const
|
|
|
|
{
|
|
|
|
return mOp.data();
|
|
|
|
}
|
|
|
|
|
2020-08-24 16:35:14 +02:00
|
|
|
template <typename T, class Operation>
|
|
|
|
std::shared_ptr<DynamicOperationBase<T>> DynamicOperation<T,Operation>::deepCopy() const
|
|
|
|
{
|
|
|
|
return std::make_shared<DynamicOperation<T,Operation>>(*this);
|
|
|
|
}
|
|
|
|
|
2020-08-27 17:46:30 +02:00
|
|
|
template <typename T, class Operation, class... Ranges>
|
|
|
|
DynamicOuterOp<T,Operation,Ranges...>::DynamicOuterOp(const Operation& op,
|
|
|
|
const std::shared_ptr<typename Ranges::IndexType>&... inds)
|
2020-08-27 23:48:04 +02:00
|
|
|
: mOp(op),
|
|
|
|
mMa(std::make_shared<MultiArray<T,Ranges...>>(mkArray<T>(inds->range()...))),
|
2020-08-28 13:46:12 +02:00
|
|
|
mProto(OperationRoot<T,Ranges...>(*mMa,inds...)),
|
|
|
|
mL(std::make_tuple(mProto.mOp,mOp), std::make_tuple(inds...),
|
|
|
|
std::make_tuple(mMa), std::make_tuple(mProto.mOp.assign( mOp )),
|
|
|
|
std::array<size_t,1>({0}), std::array<size_t,1>({0}))
|
2020-08-27 17:46:30 +02:00
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
VCHECK(reinterpret_cast<std::intptr_t>(mProto.mOp.data()));
|
|
|
|
VCHECK(reinterpret_cast<std::intptr_t>(mMa->data()));
|
2020-08-27 17:46:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
2020-08-27 23:48:04 +02:00
|
|
|
OpH<OperationRoot<T,Ranges...>> DynamicOuterOp<T,Operation,Ranges...>::get(const DExtT& pos) const
|
2020-08-27 17:46:30 +02:00
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
|
|
|
//mOp.get(pos.expl<ET>());
|
|
|
|
//mL(0,pos.expl<ET>());
|
2020-08-27 17:46:30 +02:00
|
|
|
// execute assignment... care about threads!!!
|
2020-08-27 23:48:04 +02:00
|
|
|
return mProto.mOp; // empty
|
2020-08-27 17:46:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
2020-08-27 23:48:04 +02:00
|
|
|
DynamicOperationBase<OpH<OperationRoot<T,Ranges...>>>&
|
2020-08-27 17:46:30 +02:00
|
|
|
DynamicOuterOp<T,Operation,Ranges...>::set(const DExtT& pos)
|
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
2020-08-27 17:46:30 +02:00
|
|
|
mOp.set(pos.expl<ET>());
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
|
|
|
DExtT DynamicOuterOp<T,Operation,Ranges...>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
|
|
|
return DExtT(mkDExt(mkExtT(mL.rootSteps(iPtrNum))),None(0));
|
2020-08-27 17:46:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
|
|
|
DynamicExpression DynamicOuterOp<T,Operation,Ranges...>::loop(const DynamicExpression& exp) const
|
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
|
|
|
return mOp.loop(exp); // ???!!
|
2020-08-27 17:46:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
2020-08-27 23:48:04 +02:00
|
|
|
const OpH<OperationRoot<T,Ranges...>>* DynamicOuterOp<T,Operation,Ranges...>::data() const
|
2020-08-27 17:46:30 +02:00
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
2020-08-27 17:46:30 +02:00
|
|
|
return &mProto;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T, class Operation, class... Ranges>
|
2020-08-27 23:48:04 +02:00
|
|
|
std::shared_ptr<DynamicOperationBase<OpH<OperationRoot<T,Ranges...>>>>
|
2020-08-27 17:46:30 +02:00
|
|
|
DynamicOuterOp<T,Operation,Ranges...>::deepCopy() const
|
|
|
|
{
|
2020-08-28 13:46:12 +02:00
|
|
|
CHECK;
|
2020-08-27 17:46:30 +02:00
|
|
|
return std::make_shared<DynamicOuterOp<T,Operation,Ranges...>>(*this);
|
|
|
|
}
|
2020-07-13 01:00:35 +02:00
|
|
|
|
2020-08-27 23:48:04 +02:00
|
|
|
template <class Operation, class... Indices>
|
|
|
|
DynamicOuterOp<typename Operation::value_type,Operation,typename Indices::RangeType...>
|
|
|
|
mkDynOutOp(const Operation& op, const std::shared_ptr<Indices>&... inds)
|
|
|
|
{
|
|
|
|
return DynamicOuterOp<typename Operation::value_type,Operation,
|
|
|
|
typename Indices::RangeType...>(op, inds...);
|
|
|
|
}
|
|
|
|
|
2020-07-10 00:17:38 +02:00
|
|
|
} // namespace MultiArrayTools
|