2018-01-05 13:56:16 +01:00
|
|
|
|
|
|
|
#ifndef __xfor_h__
|
|
|
|
#define __xfor_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <memory>
|
2018-01-08 18:38:13 +01:00
|
|
|
#include <tuple>
|
2018-01-15 14:56:22 +01:00
|
|
|
#include "xfor/for_type.h"
|
2018-09-12 17:05:27 +02:00
|
|
|
#include "xfor/for_utils.h"
|
2018-02-12 00:11:24 +01:00
|
|
|
#include "xfor/exttype.h"
|
2018-01-05 13:56:16 +01:00
|
|
|
|
2019-02-13 21:59:13 +01:00
|
|
|
#include "allocator.h"
|
2019-01-14 18:39:09 +01:00
|
|
|
#include <omp.h>
|
|
|
|
|
2018-11-01 22:11:08 +01:00
|
|
|
#define VCHECK(a) std::cout << __FILE__ << ": @" << __LINE__ \
|
|
|
|
<< " in " << __func__ << ": " << #a << " = " << a << std::endl;
|
|
|
|
|
2018-01-05 13:56:16 +01:00
|
|
|
namespace MultiArrayHelper
|
|
|
|
{
|
2019-02-13 21:59:13 +01:00
|
|
|
using namespace MultiArrayTools;
|
2018-01-14 22:41:35 +01:00
|
|
|
// 'HIDDEN FOR' CLASS for nested for loops in contractions a.s.o.
|
|
|
|
// (NO COUNTING OF MASTER POSITION !!!!!)
|
2018-01-15 14:56:22 +01:00
|
|
|
|
2020-07-07 16:42:41 +02:00
|
|
|
//typedef std::pair<size_t const*,size_t> DExt;
|
2018-12-21 23:02:35 +01:00
|
|
|
|
2020-07-07 16:42:41 +02:00
|
|
|
class ExtBase
|
|
|
|
{
|
|
|
|
public:
|
2020-07-13 01:00:35 +02:00
|
|
|
ExtBase() = default;
|
|
|
|
ExtBase(const ExtBase& in) = default;
|
|
|
|
ExtBase(ExtBase&& in) = default;
|
|
|
|
ExtBase& operator=(const ExtBase& in) = default;
|
|
|
|
ExtBase& operator=(ExtBase&& in) = default;
|
2020-07-07 16:42:41 +02:00
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
virtual size_t size() const = 0;
|
|
|
|
virtual const size_t& val() const = 0;
|
|
|
|
//virtual size_t rootSteps() const = 0;
|
|
|
|
virtual std::shared_ptr<ExtBase> operator+(const ExtBase& in) const = 0;
|
|
|
|
virtual std::shared_ptr<ExtBase> operator*(size_t in) const = 0;
|
2020-07-13 13:40:39 +02:00
|
|
|
virtual void zero() = 0;
|
|
|
|
|
|
|
|
virtual std::shared_ptr<ExtBase> deepCopy() const = 0;
|
2020-07-11 19:55:48 +02:00
|
|
|
|
2020-07-10 00:17:38 +02:00
|
|
|
template <class ExtType>
|
2020-07-11 19:55:48 +02:00
|
|
|
const ExtType& expl() const;
|
|
|
|
|
2020-07-07 16:42:41 +02:00
|
|
|
};
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
typedef std::shared_ptr<ExtBase> DExt;
|
|
|
|
|
2020-07-07 16:42:41 +02:00
|
|
|
template <class ExtType>
|
|
|
|
class ExtT : public ExtBase
|
|
|
|
{
|
|
|
|
private:
|
2020-07-13 01:00:35 +02:00
|
|
|
ExtType mExt;
|
2020-07-07 16:42:41 +02:00
|
|
|
public:
|
2020-07-13 01:00:35 +02:00
|
|
|
static constexpr size_t SIZE = ExtType::SIZE;
|
|
|
|
static constexpr size_t NUM = ExtType::NUM;
|
|
|
|
|
|
|
|
ExtT() = default;
|
|
|
|
ExtT(const ExtT& in) = default;
|
|
|
|
ExtT(ExtT&& in) = default;
|
|
|
|
ExtT& operator=(const ExtT& in) = default;
|
|
|
|
ExtT& operator=(ExtT&& in) = default;
|
2020-07-07 16:42:41 +02:00
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
ExtT(const ExtType& in) : mExt(in) {}
|
2020-07-13 13:40:39 +02:00
|
|
|
|
|
|
|
virtual std::shared_ptr<ExtBase> deepCopy() const override final { return std::make_shared<ExtT<ExtType>>(mExt); }
|
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
virtual size_t size() const override final { return sizeof(ExtType)/sizeof(size_t); }
|
|
|
|
//virtual size_t size() const override final { return ExtType::MExtSize(); }
|
|
|
|
//virtual size_t rootSteps() const override final;
|
|
|
|
const ExtType& ext() const { return mExt; }
|
|
|
|
virtual const size_t& val() const override final { return mExt.val(); }
|
2020-07-13 13:40:39 +02:00
|
|
|
virtual void zero() override final { mExt.zero(); }
|
2020-07-13 01:00:35 +02:00
|
|
|
|
|
|
|
virtual DExt operator+(const ExtBase& in) const override final
|
|
|
|
{ return std::make_shared<ExtT>( mExt + dynamic_cast<const ExtT&>(in).mExt ); }
|
|
|
|
virtual DExt operator*(size_t in) const override final
|
|
|
|
{ return std::make_shared<ExtT>( mExt * in ); }
|
2020-07-07 16:42:41 +02:00
|
|
|
};
|
2020-07-13 01:00:35 +02:00
|
|
|
//class DExtT;
|
2020-07-07 16:42:41 +02:00
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
template <class X>
|
|
|
|
class DExtTX
|
2020-07-08 17:55:51 +02:00
|
|
|
{
|
|
|
|
private:
|
2020-07-13 13:40:39 +02:00
|
|
|
mutable DExt mDExt = nullptr;
|
2020-07-13 01:00:35 +02:00
|
|
|
X mNext;
|
2020-07-08 17:55:51 +02:00
|
|
|
public:
|
2020-07-13 01:00:35 +02:00
|
|
|
static constexpr size_t NUM = X::SIZE;
|
|
|
|
static constexpr size_t SIZE = NUM + 1;
|
|
|
|
|
|
|
|
DExtTX() = default;
|
2020-07-13 13:40:39 +02:00
|
|
|
DExtTX(const DExtTX& in) : mDExt(in.mDExt->deepCopy()), mNext(in.mNext) {}
|
|
|
|
DExtTX(DExtTX&& in) : mDExt(in.mDExt->deepCopy()), mNext(in.mNext) {}
|
|
|
|
DExtTX& operator=(const DExtTX& in) { mNext = in.mNext; mDExt = in.mDExt->deepCopy(); }
|
|
|
|
DExtTX& operator=(DExtTX&& in) { mNext = in.mNext; mDExt = in.mDExt->deepCopy(); }
|
2020-07-13 01:00:35 +02:00
|
|
|
DExtTX(const DExt& in) : mDExt(in) {}
|
|
|
|
|
|
|
|
template <class Y>
|
|
|
|
DExtTX& operator=(const Y& y) { mDExt = std::make_shared<ExtT<Y>>(y); return *this; }
|
|
|
|
|
|
|
|
template <class Y>
|
|
|
|
DExtTX(const Y& y) : mDExt(std::make_shared<ExtT<Y>>(y)) {}
|
|
|
|
|
|
|
|
DExtTX(const DExt& y, const X& x) : mDExt(y),
|
|
|
|
mNext(x) {}
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
virtual size_t size() const { return mDExt->size(); }
|
|
|
|
inline const DExt& get() const { return mDExt; }
|
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
inline DExtTX operator+(const DExtTX& in) const
|
|
|
|
{ if (not mDExt) return in; else return DExtTX( (*mDExt) + (*in.mDExt) ) ; }
|
|
|
|
inline DExtTX operator*(size_t in) const
|
|
|
|
{ if (not mDExt) return *this; else return DExtTX( (*mDExt) * in ) ; }
|
|
|
|
|
|
|
|
template <class ExtType>
|
2020-07-13 13:40:39 +02:00
|
|
|
inline const ExtType& expl() const
|
|
|
|
{ if(mDExt == nullptr) mDExt = std::make_shared<ExtT<ExtType>>(); assert(mDExt != nullptr); return mDExt->expl<ExtType>(); }
|
2020-07-13 01:00:35 +02:00
|
|
|
|
|
|
|
template <class Y>
|
|
|
|
inline auto extend(const Y& y) const -> DExtTX<decltype(mNext.extend(y))>
|
|
|
|
{ return DExtTX<decltype(mNext.extend(y))>(mDExt, mNext.extend(y)); }
|
|
|
|
|
|
|
|
inline const size_t& val() const { return mDExt->val(); }
|
|
|
|
inline const X& next() const { return mNext; }
|
|
|
|
|
2020-07-13 13:40:39 +02:00
|
|
|
inline void zero() { mDExt->zero(); }
|
|
|
|
|
2020-07-13 01:00:35 +02:00
|
|
|
template <size_t N>
|
|
|
|
inline auto nn() const -> decltype(Getter<N>::getX(*this))
|
|
|
|
{ return Getter<N>::getX(*this); }
|
2020-07-08 17:55:51 +02:00
|
|
|
};
|
2020-07-13 01:00:35 +02:00
|
|
|
|
|
|
|
typedef DExtTX<None> DExtT;
|
2020-07-07 16:42:41 +02:00
|
|
|
|
2020-07-09 17:37:28 +02:00
|
|
|
inline MExt<None> mkExt(size_t s) { return MExt<None>(s); }
|
2018-10-23 20:02:01 +02:00
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
class ExpressionBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
ExpressionBase() = default;
|
|
|
|
ExpressionBase(const ExpressionBase& in) = default;
|
|
|
|
ExpressionBase(ExpressionBase&& in) = default;
|
|
|
|
ExpressionBase& operator=(const ExpressionBase& in) = default;
|
|
|
|
ExpressionBase& operator=(ExpressionBase&& in) = default;
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
virtual void operator()(size_t mlast, DExt last) = 0;
|
|
|
|
virtual void operator()(size_t mlast = 0) = 0;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
virtual DExt dRootSteps(std::intptr_t iPtrNum = 0) const = 0;
|
|
|
|
virtual DExt dExtension() const = 0;
|
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
template <ForType FT = ForType::DEFAULT>
|
|
|
|
struct PosForward
|
|
|
|
{
|
2018-09-17 16:21:23 +02:00
|
|
|
static inline size_t valuex(size_t last, size_t step, size_t pos)
|
|
|
|
{
|
|
|
|
return last + pos * step;
|
|
|
|
}
|
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
static inline size_t value(size_t last, size_t max, size_t pos)
|
|
|
|
{
|
|
|
|
return last * max + pos;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct PosForward<ForType::HIDDEN>
|
|
|
|
{
|
2018-09-17 16:21:23 +02:00
|
|
|
static inline size_t valuex(size_t last, size_t step, size_t pos)
|
|
|
|
{
|
|
|
|
return last;
|
|
|
|
}
|
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
static inline size_t value(size_t last, size_t max, size_t pos)
|
|
|
|
{
|
|
|
|
return last;
|
|
|
|
}
|
|
|
|
};
|
2018-02-13 16:54:13 +01:00
|
|
|
|
|
|
|
template <size_t ISSTATIC>
|
|
|
|
struct ForBound
|
|
|
|
{
|
|
|
|
template <size_t BOUND>
|
|
|
|
static inline size_t bound(size_t bound)
|
|
|
|
{
|
|
|
|
return bound;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
|
|
struct ForBound<1>
|
|
|
|
{
|
|
|
|
template <size_t BOUND>
|
|
|
|
static constexpr size_t bound(size_t bound)
|
|
|
|
{
|
|
|
|
return BOUND;
|
|
|
|
}
|
|
|
|
};
|
2018-08-07 23:15:31 +02:00
|
|
|
|
2018-10-27 14:58:34 +02:00
|
|
|
|
2018-08-07 23:15:31 +02:00
|
|
|
template <class IndexClass, class Expr>
|
2018-10-23 20:02:01 +02:00
|
|
|
class SingleExpression : public ExpressionBase
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
SingleExpression() = default;
|
|
|
|
|
|
|
|
const IndexClass* mIndPtr;
|
|
|
|
size_t mSPos;
|
|
|
|
size_t mMax;
|
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
Expr mExpr;
|
|
|
|
typedef decltype(mExpr.rootSteps()) ExtType;
|
|
|
|
ExtType mExt;
|
|
|
|
|
2018-10-27 14:58:34 +02:00
|
|
|
mutable ExtType mRootSteps;
|
|
|
|
|
2018-08-07 23:15:31 +02:00
|
|
|
public:
|
2018-10-23 20:02:01 +02:00
|
|
|
typedef ExpressionBase EB;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-08-07 23:15:31 +02:00
|
|
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
|
|
|
static constexpr size_t SIZE = Expr::SIZE;
|
|
|
|
|
|
|
|
SingleExpression(const SingleExpression& in) = default;
|
|
|
|
SingleExpression& operator=(const SingleExpression& in) = default;
|
|
|
|
SingleExpression(SingleExpression&& in) = default;
|
|
|
|
SingleExpression& operator=(SingleExpression&& in) = default;
|
|
|
|
|
|
|
|
SingleExpression(const std::shared_ptr<IndexClass>& indPtr,
|
2018-10-21 22:52:01 +02:00
|
|
|
Expr expr);
|
2018-08-07 23:15:31 +02:00
|
|
|
|
|
|
|
SingleExpression(const IndexClass* indPtr,
|
2018-10-21 22:52:01 +02:00
|
|
|
Expr expr);
|
2018-08-07 23:15:31 +02:00
|
|
|
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
|
|
|
inline void operator()(size_t mlast, ExtType last);
|
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2018-08-07 23:15:31 +02:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
DExt dExtension() const override final;
|
|
|
|
|
|
|
|
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
|
|
|
|
auto extension() const -> ExtType;
|
2018-08-07 23:15:31 +02:00
|
|
|
};
|
2018-12-21 18:25:45 +01:00
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
class SubExpr : public ExpressionBase
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
SubExpr() = default;
|
|
|
|
|
|
|
|
const IndexClass* mIndPtr;
|
2018-12-21 23:02:35 +01:00
|
|
|
std::intptr_t mSIPtr;
|
2018-12-21 18:25:45 +01:00
|
|
|
size_t mSPos;
|
|
|
|
size_t mMax;
|
|
|
|
|
|
|
|
Expr mExpr;
|
2018-12-21 23:02:35 +01:00
|
|
|
typedef decltype(mkExt(0).extend(mExpr.rootSteps())) ExtType;
|
2018-12-21 18:25:45 +01:00
|
|
|
ExtType mExt;
|
|
|
|
|
2019-02-13 21:59:13 +01:00
|
|
|
const vector<size_t>* mSubSet;
|
2018-12-21 18:25:45 +01:00
|
|
|
|
|
|
|
mutable ExtType mRootSteps;
|
|
|
|
|
|
|
|
public:
|
|
|
|
typedef ExpressionBase EB;
|
|
|
|
|
|
|
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
2019-07-10 18:14:50 +02:00
|
|
|
static constexpr size_t SIZE = Expr::SIZE + 1;
|
2018-12-21 18:25:45 +01:00
|
|
|
|
|
|
|
SubExpr(const SubExpr& in) = default;
|
|
|
|
SubExpr& operator=(const SubExpr& in) = default;
|
|
|
|
SubExpr(SubExpr&& in) = default;
|
|
|
|
SubExpr& operator=(SubExpr&& in) = default;
|
|
|
|
|
|
|
|
SubExpr(const std::shared_ptr<IndexClass>& indPtr,
|
2018-12-21 23:02:35 +01:00
|
|
|
std::intptr_t siptr,
|
2019-02-13 21:59:13 +01:00
|
|
|
const vector<size_t>* subset, Expr expr);
|
2018-12-21 18:25:45 +01:00
|
|
|
|
2018-12-21 23:41:14 +01:00
|
|
|
SubExpr(const IndexClass* indPtr, std::intptr_t siptr,
|
2019-02-13 21:59:13 +01:00
|
|
|
const vector<size_t>* subset, Expr expr);
|
2018-12-21 18:25:45 +01:00
|
|
|
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
|
|
|
inline void operator()(size_t mlast, ExtType last) ;
|
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2018-12-21 18:25:45 +01:00
|
|
|
|
|
|
|
DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
DExt dExtension() const override final;
|
|
|
|
|
|
|
|
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
|
|
|
|
auto extension() const -> ExtType;
|
|
|
|
};
|
|
|
|
|
2019-01-14 18:39:09 +01:00
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
class PFor;
|
|
|
|
|
2018-09-12 17:05:27 +02:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
2018-10-23 20:02:01 +02:00
|
|
|
class For : public ExpressionBase
|
2018-01-05 13:56:16 +01:00
|
|
|
{
|
2018-01-13 18:07:52 +01:00
|
|
|
private:
|
|
|
|
For() = default;
|
|
|
|
|
|
|
|
const IndexClass* mIndPtr;
|
2018-01-18 23:14:49 +01:00
|
|
|
size_t mSPos;
|
|
|
|
size_t mMax;
|
2018-09-17 16:21:23 +02:00
|
|
|
size_t mStep;
|
2018-01-13 18:07:52 +01:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
Expr mExpr;
|
|
|
|
typedef decltype(mExpr.rootSteps()) ExtType;
|
|
|
|
ExtType mExt;
|
|
|
|
|
|
|
|
mutable ExtType mRootSteps;
|
|
|
|
|
2018-01-05 13:56:16 +01:00
|
|
|
public:
|
2018-10-23 20:02:01 +02:00
|
|
|
typedef ExpressionBase EB;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-02-12 00:11:24 +01:00
|
|
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
|
|
|
static constexpr size_t SIZE = Expr::SIZE;
|
|
|
|
|
|
|
|
For(const For& in) = default;
|
|
|
|
For& operator=(const For& in) = default;
|
2018-01-05 13:56:16 +01:00
|
|
|
For(For&& in) = default;
|
|
|
|
For& operator=(For&& in) = default;
|
|
|
|
|
2018-01-08 18:38:13 +01:00
|
|
|
For(const std::shared_ptr<IndexClass>& indPtr,
|
2018-09-17 16:21:23 +02:00
|
|
|
size_t step, Expr expr);
|
2018-01-05 13:56:16 +01:00
|
|
|
|
2018-01-13 18:07:52 +01:00
|
|
|
For(const IndexClass* indPtr,
|
2018-09-17 16:21:23 +02:00
|
|
|
size_t step, Expr expr);
|
2018-01-09 17:24:10 +01:00
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
|
|
|
inline void operator()(size_t mlast, ExtType last) ;
|
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2018-10-23 20:02:01 +02:00
|
|
|
|
2019-01-14 18:39:09 +01:00
|
|
|
PFor<IndexClass,Expr> parallel() const;
|
|
|
|
|
|
|
|
DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
DExt dExtension() const override final;
|
|
|
|
|
|
|
|
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
|
|
|
|
auto extension() const -> ExtType;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
class PFor : public ExpressionBase
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
PFor() = default;
|
|
|
|
|
|
|
|
const IndexClass* mIndPtr;
|
|
|
|
size_t mSPos;
|
|
|
|
size_t mMax;
|
|
|
|
size_t mStep;
|
|
|
|
|
|
|
|
Expr mExpr;
|
|
|
|
typedef decltype(mExpr.rootSteps()) ExtType;
|
|
|
|
ExtType mExt;
|
|
|
|
|
|
|
|
mutable ExtType mRootSteps;
|
|
|
|
|
|
|
|
public:
|
|
|
|
typedef ExpressionBase EB;
|
|
|
|
|
|
|
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
|
|
|
static constexpr size_t SIZE = Expr::SIZE;
|
|
|
|
|
|
|
|
PFor(const PFor& in) = default;
|
|
|
|
PFor& operator=(const PFor& in) = default;
|
|
|
|
PFor(PFor&& in) = default;
|
|
|
|
PFor& operator=(PFor&& in) = default;
|
|
|
|
|
|
|
|
PFor(const std::shared_ptr<IndexClass>& indPtr,
|
|
|
|
size_t step, Expr expr);
|
|
|
|
|
|
|
|
PFor(const IndexClass* indPtr,
|
|
|
|
size_t step, Expr expr);
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
|
|
|
inline void operator()(size_t mlast, ExtType last) ;
|
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2019-01-14 18:39:09 +01:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
DExt dExtension() const override final;
|
|
|
|
|
|
|
|
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
|
|
|
|
auto extension() const -> ExtType;
|
|
|
|
|
2018-01-07 16:57:01 +01:00
|
|
|
};
|
2018-01-05 13:56:16 +01:00
|
|
|
|
2018-01-09 17:24:10 +01:00
|
|
|
template <size_t N>
|
2018-02-14 18:15:34 +01:00
|
|
|
inline size_t exceptMax(size_t max) { return max; }
|
2018-01-09 17:24:10 +01:00
|
|
|
|
|
|
|
template <>
|
2018-02-14 18:15:34 +01:00
|
|
|
inline size_t exceptMax<1>(size_t max) { return 1; }
|
2018-01-09 17:24:10 +01:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
class DynamicExpression : public ExpressionBase
|
2018-10-21 22:52:01 +02:00
|
|
|
{
|
|
|
|
private:
|
2018-10-30 15:06:29 +01:00
|
|
|
DynamicExpression() = default;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
std::shared_ptr<ExpressionBase> mNext;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
static constexpr size_t LAYER = 0;
|
|
|
|
static constexpr size_t SIZE = 0;
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
DynamicExpression(const DynamicExpression& in) = default;
|
|
|
|
DynamicExpression(DynamicExpression&& in) = default;
|
|
|
|
DynamicExpression& operator=(const DynamicExpression& in) = default;
|
|
|
|
DynamicExpression& operator=(DynamicExpression&& in) = default;
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
DynamicExpression(const std::shared_ptr<ExpressionBase>& next) :
|
2018-10-27 14:58:34 +02:00
|
|
|
mNext(next)
|
|
|
|
{}
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
template <class Expr>
|
|
|
|
DynamicExpression(const ExpressionBase& next) :
|
|
|
|
mNext(std::make_shared<Expr>(next))
|
|
|
|
{}
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
template <class Expr>
|
|
|
|
DynamicExpression(Expr ex) : mNext( std::make_shared<Expr>(ex) ) {}
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
2020-07-08 17:55:51 +02:00
|
|
|
inline void operator()(size_t mlast, DExtT last) { (*this)(mlast,last.get()); }
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2018-10-23 20:02:01 +02:00
|
|
|
|
2018-10-27 14:58:34 +02:00
|
|
|
inline DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
inline DExt dExtension() const override final;
|
2018-10-23 20:02:01 +02:00
|
|
|
|
2020-07-08 17:55:51 +02:00
|
|
|
inline DExtT rootSteps(std::intptr_t iPtrNum = 0) const { return dRootSteps(iPtrNum); }
|
|
|
|
inline DExtT extension() const { return dExtension(); }
|
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
};
|
2018-10-30 15:06:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
template <class Expr>
|
|
|
|
class ExpressionHolder : public ExpressionBase
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
ExpressionHolder() = default;
|
|
|
|
|
|
|
|
DynamicExpression mExpr;
|
|
|
|
typedef decltype(std::declval<Expr>().rootSteps()) ExtType;
|
|
|
|
ExtType mExt;
|
|
|
|
|
|
|
|
mutable ExtType mRootSteps;
|
|
|
|
|
|
|
|
public:
|
|
|
|
typedef ExpressionBase EB;
|
|
|
|
|
|
|
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
|
|
|
static constexpr size_t SIZE = Expr::SIZE;
|
|
|
|
|
|
|
|
ExpressionHolder(const ExpressionHolder& in) = default;
|
|
|
|
ExpressionHolder(ExpressionHolder&& in) = default;
|
|
|
|
ExpressionHolder& operator=(const ExpressionHolder& in) = default;
|
|
|
|
ExpressionHolder& operator=(ExpressionHolder&& in) = default;
|
|
|
|
|
|
|
|
ExpressionHolder(DynamicExpression expr);
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void operator()(size_t mlast, DExt last) override final;
|
|
|
|
inline void operator()(size_t mlast, ExtType last) ;
|
|
|
|
inline void operator()(size_t mlast = 0) override final;
|
2018-10-30 15:06:29 +01:00
|
|
|
|
|
|
|
DExt dRootSteps(std::intptr_t iPtrNum = 0) const override final;
|
|
|
|
DExt dExtension() const override final;
|
|
|
|
|
|
|
|
auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType;
|
|
|
|
auto extension() const -> ExtType;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2018-01-05 13:56:16 +01:00
|
|
|
} // namespace MultiArrayHelper
|
|
|
|
|
|
|
|
/* ========================= *
|
|
|
|
* --- TEMPLATE CODE --- *
|
|
|
|
* ========================= */
|
|
|
|
|
2018-01-14 22:41:35 +01:00
|
|
|
#include <iostream>
|
|
|
|
|
2018-01-05 13:56:16 +01:00
|
|
|
namespace MultiArrayHelper
|
|
|
|
{
|
2020-07-10 00:17:38 +02:00
|
|
|
template <class ExtType>
|
|
|
|
const ExtType& ExtBase::expl() const
|
|
|
|
{
|
|
|
|
return dynamic_cast<const ExtT<ExtType>*>(this)->ext();
|
|
|
|
}
|
2020-07-07 16:42:41 +02:00
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
/*****************
|
|
|
|
* F o r *
|
|
|
|
*****************/
|
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
For<IndexClass,Expr,FT>::For(const std::shared_ptr<IndexClass>& indPtr,
|
2018-09-17 16:21:23 +02:00
|
|
|
size_t step, Expr expr) :
|
2018-12-21 18:25:45 +01:00
|
|
|
mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step),
|
2018-10-23 20:02:01 +02:00
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
2018-01-15 14:56:22 +01:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
2018-01-13 18:07:52 +01:00
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
For<IndexClass,Expr,FT>::For(const IndexClass* indPtr,
|
2018-09-17 16:21:23 +02:00
|
|
|
size_t step, Expr expr) :
|
2018-10-27 14:58:34 +02:00
|
|
|
mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step),
|
2018-10-23 20:02:01 +02:00
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
2018-01-15 14:56:22 +01:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
2018-10-23 20:02:01 +02:00
|
|
|
|
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void For<IndexClass,Expr,FT>::operator()(size_t mlast, DExt last)
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
operator()(mlast, std::dynamic_pointer_cast<ExtT<ExtType>>(last)->ext());
|
|
|
|
//operator()(mlast, *reinterpret_cast<ExtType const*>(last.first));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
2018-01-07 22:33:34 +01:00
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
inline void For<IndexClass,Expr,FT>::operator()(size_t mlast,
|
2019-02-26 18:56:57 +01:00
|
|
|
ExtType last)
|
2018-01-05 13:56:16 +01:00
|
|
|
{
|
2018-02-13 16:54:13 +01:00
|
|
|
typedef typename IndexClass::RangeType RangeType;
|
|
|
|
for(size_t pos = 0u; pos != ForBound<RangeType::ISSTATIC>::template bound<RangeType::SIZE>(mMax); ++pos){
|
2018-09-17 16:34:47 +02:00
|
|
|
const size_t mnpos = PosForward<FT>::valuex(mlast, mStep, pos);
|
2018-10-27 14:58:34 +02:00
|
|
|
const ExtType npos = last + mExt*pos;
|
|
|
|
mExpr(mnpos, npos);
|
2018-01-09 17:24:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-15 14:56:22 +01:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void For<IndexClass,Expr,FT>::operator()(size_t mlast)
|
2018-01-09 17:24:10 +01:00
|
|
|
{
|
2018-02-13 16:54:13 +01:00
|
|
|
typedef typename IndexClass::RangeType RangeType;
|
2020-07-13 13:40:39 +02:00
|
|
|
ExtType last = rootSteps();
|
|
|
|
last.zero();
|
2018-02-13 16:54:13 +01:00
|
|
|
for(size_t pos = 0u; pos != ForBound<RangeType::ISSTATIC>::template bound<RangeType::SIZE>(mMax); ++pos){
|
2018-09-17 16:34:47 +02:00
|
|
|
const size_t mnpos = PosForward<FT>::valuex(mlast, mStep, pos);
|
2018-10-27 14:58:34 +02:00
|
|
|
const ExtType npos = last + mExt*pos;
|
|
|
|
mExpr(mnpos, npos);
|
2018-01-05 13:56:16 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
|
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
auto For<IndexClass,Expr,FT>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExpr.rootSteps(iPtrNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
auto For<IndexClass,Expr,FT>::extension() const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExt;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
2018-10-27 14:58:34 +02:00
|
|
|
DExt For<IndexClass,Expr,FT>::dRootSteps(std::intptr_t iPtrNum) const
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(rootSteps(iPtrNum));
|
|
|
|
//mRootSteps = rootSteps(iPtrNum);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mRootSteps),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
DExt For<IndexClass,Expr,FT>::dExtension() const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(mExt);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mExt),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
2018-08-07 23:15:31 +02:00
|
|
|
|
2019-01-14 18:39:09 +01:00
|
|
|
template <class IndexClass, class Expr, ForType FT>
|
|
|
|
PFor<IndexClass,Expr> For<IndexClass,Expr,FT>::parallel() const
|
|
|
|
{
|
|
|
|
static_assert(FT == ForType::DEFAULT, "hidden for not parallelizable");
|
|
|
|
return PFor<IndexClass,Expr>(mIndPtr, mStep, mExpr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/******************
|
|
|
|
* P F o r *
|
|
|
|
******************/
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
PFor<IndexClass,Expr>::PFor(const std::shared_ptr<IndexClass>& indPtr,
|
|
|
|
size_t step, Expr expr) :
|
|
|
|
mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step),
|
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
PFor<IndexClass,Expr>::PFor(const IndexClass* indPtr,
|
|
|
|
size_t step, Expr expr) :
|
|
|
|
mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mStep(step),
|
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void PFor<IndexClass,Expr>::operator()(size_t mlast, DExt last)
|
2019-01-14 18:39:09 +01:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
operator()(mlast, std::dynamic_pointer_cast<ExtT<ExtType>>(last)->ext());
|
|
|
|
//operator()(mlast, *reinterpret_cast<ExtType const*>(last.first));
|
2019-01-14 18:39:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
inline void PFor<IndexClass,Expr>::operator()(size_t mlast,
|
2019-02-26 18:56:57 +01:00
|
|
|
ExtType last)
|
2019-01-14 18:39:09 +01:00
|
|
|
{
|
2019-01-15 17:41:43 +01:00
|
|
|
CHECK;
|
2019-01-14 18:39:09 +01:00
|
|
|
typedef typename IndexClass::RangeType RangeType;
|
|
|
|
int pos = 0;
|
|
|
|
size_t mnpos = 0;
|
|
|
|
ExtType npos;
|
2019-03-06 13:08:33 +01:00
|
|
|
#pragma omp parallel shared(mExpr) private(pos,mnpos,npos)
|
2019-01-14 18:39:09 +01:00
|
|
|
{
|
2019-03-06 13:08:33 +01:00
|
|
|
auto expr = mExpr;
|
2019-01-14 18:39:09 +01:00
|
|
|
#pragma omp for nowait
|
|
|
|
for(pos = 0; pos < static_cast<int>(ForBound<RangeType::ISSTATIC>::template bound<RangeType::SIZE>(mMax)); pos++){
|
|
|
|
mnpos = PosForward<ForType::DEFAULT>::valuex(mlast, mStep, pos);
|
|
|
|
npos = last + mExt*static_cast<size_t>(pos);
|
|
|
|
expr(mnpos, npos);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void PFor<IndexClass,Expr>::operator()(size_t mlast)
|
2019-01-14 18:39:09 +01:00
|
|
|
{
|
2019-01-15 17:41:43 +01:00
|
|
|
CHECK;
|
2019-01-14 18:39:09 +01:00
|
|
|
typedef typename IndexClass::RangeType RangeType;
|
2020-07-13 13:40:39 +02:00
|
|
|
ExtType last = rootSteps();
|
|
|
|
last.zero();
|
2019-01-14 18:39:09 +01:00
|
|
|
int pos = 0;
|
|
|
|
size_t mnpos = 0;
|
2020-07-13 13:40:39 +02:00
|
|
|
ExtType npos = rootSteps();
|
|
|
|
npos.zero();
|
2019-03-06 13:08:33 +01:00
|
|
|
#pragma omp parallel shared(mExpr) private(pos,mnpos,npos)
|
2019-01-14 18:39:09 +01:00
|
|
|
{
|
2019-03-06 13:08:33 +01:00
|
|
|
auto expr = mExpr;
|
2019-01-14 18:39:09 +01:00
|
|
|
#pragma omp for nowait
|
|
|
|
for(pos = 0; pos < static_cast<int>(ForBound<RangeType::ISSTATIC>::template bound<RangeType::SIZE>(mMax)); pos++){
|
|
|
|
mnpos = PosForward<ForType::DEFAULT>::valuex(mlast, mStep, pos);
|
|
|
|
npos = last + mExt*static_cast<size_t>(pos);
|
|
|
|
expr(mnpos, npos);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto PFor<IndexClass,Expr>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExpr.rootSteps(iPtrNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto PFor<IndexClass,Expr>::extension() const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExt;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
DExt PFor<IndexClass,Expr>::dRootSteps(std::intptr_t iPtrNum) const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(rootSteps(iPtrNum));
|
|
|
|
//mRootSteps = rootSteps(iPtrNum);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mRootSteps),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2019-01-14 18:39:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
DExt PFor<IndexClass,Expr>::dExtension() const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(mExt);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mExt),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2019-01-14 18:39:09 +01:00
|
|
|
}
|
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
/************************
|
|
|
|
* SingleExpression *
|
|
|
|
************************/
|
2018-08-07 23:15:31 +02:00
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
SingleExpression<IndexClass,Expr>::SingleExpression(const std::shared_ptr<IndexClass>& indPtr,
|
2018-10-21 22:52:01 +02:00
|
|
|
Expr expr) :
|
2018-10-23 20:02:01 +02:00
|
|
|
mIndPtr(indPtr.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()),
|
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
//VCHECK(mIndPtr->id());
|
|
|
|
//VCHECK(mIndPtr->max());
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
SingleExpression<IndexClass,Expr>::SingleExpression(const IndexClass* indPtr,
|
|
|
|
Expr expr) :
|
2018-10-23 20:02:01 +02:00
|
|
|
mIndPtr(indPtr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()),
|
|
|
|
mExpr(expr), mExt(mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )))
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
//VCHECK(mIndPtr->id());
|
|
|
|
//VCHECK(mIndPtr->max());
|
|
|
|
}
|
2018-10-23 20:02:01 +02:00
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void SingleExpression<IndexClass,Expr>::operator()(size_t mlast, DExt last)
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
operator()(mlast, std::dynamic_pointer_cast<ExtT<ExtType>>(last)->ext());
|
|
|
|
//operator()(mlast, *reinterpret_cast<ExtType const*>(last.first));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
|
|
|
|
2018-08-07 23:15:31 +02:00
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
inline void SingleExpression<IndexClass,Expr>::operator()(size_t mlast,
|
2019-02-26 18:56:57 +01:00
|
|
|
ExtType last)
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
|
|
|
//typedef typename IndexClass::RangeType RangeType;
|
|
|
|
const size_t pos = mIndPtr->pos();
|
|
|
|
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
2018-10-27 14:58:34 +02:00
|
|
|
const ExtType npos = last + mExt*pos;
|
|
|
|
mExpr(mnpos, npos);
|
2018-08-07 23:15:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void SingleExpression<IndexClass,Expr>::operator()(size_t mlast)
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
|
|
|
//typedef typename IndexClass::RangeType RangeType;
|
2020-07-13 13:40:39 +02:00
|
|
|
ExtType last = rootSteps();
|
|
|
|
last.zero();
|
2018-08-07 23:15:31 +02:00
|
|
|
const size_t pos = mIndPtr->pos();
|
|
|
|
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
2018-10-27 14:58:34 +02:00
|
|
|
const ExtType npos = last + mExt*pos;
|
|
|
|
mExpr(mlast, last);
|
2018-08-07 23:15:31 +02:00
|
|
|
}
|
2018-10-21 22:52:01 +02:00
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto SingleExpression<IndexClass,Expr>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExpr.rootSteps(iPtrNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto SingleExpression<IndexClass,Expr>::extension() const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExt;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2018-10-27 14:58:34 +02:00
|
|
|
DExt SingleExpression<IndexClass,Expr>::dRootSteps(std::intptr_t iPtrNum) const
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(rootSteps(iPtrNum));
|
|
|
|
//mRootSteps = rootSteps(iPtrNum);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mRootSteps),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
DExt SingleExpression<IndexClass,Expr>::dExtension() const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(mExt);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mExt),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
2018-08-07 23:15:31 +02:00
|
|
|
|
2018-12-21 18:25:45 +01:00
|
|
|
/****************
|
|
|
|
* SubExpr *
|
|
|
|
****************/
|
2018-12-21 23:02:35 +01:00
|
|
|
|
2018-12-21 18:25:45 +01:00
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
SubExpr<IndexClass,Expr>::SubExpr(const std::shared_ptr<IndexClass>& indPtr,
|
2018-12-21 23:02:35 +01:00
|
|
|
std::intptr_t siptr,
|
2019-02-13 21:59:13 +01:00
|
|
|
const vector<size_t>* subset, Expr expr) :
|
2018-12-21 23:02:35 +01:00
|
|
|
mIndPtr(indPtr.get()), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()),
|
|
|
|
mExpr(expr),
|
|
|
|
mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )) ) ),
|
2018-12-21 23:41:14 +01:00
|
|
|
mSubSet(subset)
|
2018-12-21 18:25:45 +01:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2018-12-21 23:41:14 +01:00
|
|
|
SubExpr<IndexClass,Expr>::SubExpr(const IndexClass* indPtr, std::intptr_t siptr,
|
2019-02-13 21:59:13 +01:00
|
|
|
const vector<size_t>* subset, Expr expr) :
|
2018-12-21 23:02:35 +01:00
|
|
|
mIndPtr(indPtr), mSIPtr(siptr), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()),
|
|
|
|
mExpr(expr),
|
|
|
|
mExt( mkExt(0).extend( mExpr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr )) ) ),
|
2018-12-21 23:41:14 +01:00
|
|
|
mSubSet(subset)
|
2018-12-21 18:25:45 +01:00
|
|
|
{
|
|
|
|
assert(mIndPtr != nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void SubExpr<IndexClass,Expr>::operator()(size_t mlast, DExt last)
|
2018-12-21 18:25:45 +01:00
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
operator()(mlast, std::dynamic_pointer_cast<ExtT<ExtType>>(last)->ext());
|
|
|
|
//operator()(mlast, *reinterpret_cast<ExtType const*>(last.first));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
inline void SubExpr<IndexClass,Expr>::operator()(size_t mlast,
|
2019-02-26 18:56:57 +01:00
|
|
|
ExtType last)
|
2018-12-21 18:25:45 +01:00
|
|
|
{
|
2018-12-21 23:02:35 +01:00
|
|
|
const size_t pos = (*mSubSet)[last.val()];
|
2018-12-21 23:41:14 +01:00
|
|
|
const size_t mnpos = mlast;
|
2018-12-21 18:25:45 +01:00
|
|
|
const ExtType npos = last + mExt*pos;
|
2018-12-21 23:02:35 +01:00
|
|
|
mExpr(mnpos, Getter<1>::template getX<ExtType>( npos ));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void SubExpr<IndexClass,Expr>::operator()(size_t mlast)
|
2018-12-21 18:25:45 +01:00
|
|
|
{
|
2020-07-13 13:40:39 +02:00
|
|
|
ExtType last = rootSteps();
|
|
|
|
last.zero();
|
2018-12-21 23:02:35 +01:00
|
|
|
const size_t pos = (*mSubSet)[last.val()];
|
2018-12-21 23:41:14 +01:00
|
|
|
const size_t mnpos = mlast;
|
2018-12-21 18:25:45 +01:00
|
|
|
const ExtType npos = last + mExt*pos;
|
2018-12-21 23:02:35 +01:00
|
|
|
mExpr(mnpos, Getter<1>::template getX<ExtType>( npos ));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto SubExpr<IndexClass,Expr>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
-> ExtType
|
|
|
|
{
|
2018-12-21 23:02:35 +01:00
|
|
|
return mkExt(iPtrNum == mSIPtr ? 1 : 0).extend(mExpr.rootSteps(iPtrNum));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
auto SubExpr<IndexClass,Expr>::extension() const
|
|
|
|
-> ExtType
|
|
|
|
{
|
|
|
|
return mExt;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
DExt SubExpr<IndexClass,Expr>::dRootSteps(std::intptr_t iPtrNum) const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(rootSteps(iPtrNum));
|
|
|
|
//mRootSteps = rootSteps(iPtrNum);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mRootSteps),
|
|
|
|
//sizeof(ExtType)/sizeof(size_t));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class IndexClass, class Expr>
|
|
|
|
DExt SubExpr<IndexClass,Expr>::dExtension() const
|
|
|
|
{
|
2020-07-07 16:42:41 +02:00
|
|
|
return std::make_shared<ExtT<ExtType>>(mExt);
|
|
|
|
//return std::make_pair<size_t const*,size_t>(reinterpret_cast<size_t const*>(&mExt),
|
|
|
|
// sizeof(ExtType)/sizeof(size_t));
|
2018-12-21 18:25:45 +01:00
|
|
|
}
|
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
/***************************
|
2018-10-30 15:06:29 +01:00
|
|
|
* DynamicExpression *
|
2018-10-21 22:52:01 +02:00
|
|
|
***************************/
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void DynamicExpression::operator()(size_t mlast, DExt last)
|
2018-10-27 14:58:34 +02:00
|
|
|
{
|
|
|
|
(*mNext)(mlast,last);
|
|
|
|
}
|
|
|
|
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void DynamicExpression::operator()(size_t mlast)
|
2018-10-27 14:58:34 +02:00
|
|
|
{
|
|
|
|
(*mNext)(mlast);
|
|
|
|
}
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
inline DExt DynamicExpression::dRootSteps(std::intptr_t iPtrNum) const
|
2018-10-27 14:58:34 +02:00
|
|
|
{
|
|
|
|
return mNext->dRootSteps(iPtrNum);
|
|
|
|
}
|
|
|
|
|
2018-10-30 15:06:29 +01:00
|
|
|
inline DExt DynamicExpression::dExtension() const
|
2018-10-27 14:58:34 +02:00
|
|
|
{
|
|
|
|
return mNext->dExtension();
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************
|
|
|
|
* ExpressionHolder *
|
|
|
|
************************/
|
|
|
|
|
2018-10-21 22:52:01 +02:00
|
|
|
template <class Expr>
|
2018-10-30 15:06:29 +01:00
|
|
|
ExpressionHolder<Expr>::ExpressionHolder(DynamicExpression expr) : mExpr(expr) {}
|
2018-10-21 22:52:01 +02:00
|
|
|
|
|
|
|
template <class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void ExpressionHolder<Expr>::operator()(size_t mlast, DExt last)
|
2018-08-07 23:15:31 +02:00
|
|
|
{
|
2018-10-27 14:58:34 +02:00
|
|
|
mExpr(mlast,last);
|
2018-10-21 22:52:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void ExpressionHolder<Expr>::operator()(size_t mlast, ExtType last)
|
2018-10-21 22:52:01 +02:00
|
|
|
{
|
2018-10-30 15:06:29 +01:00
|
|
|
mExpr(mlast,
|
2020-07-07 16:42:41 +02:00
|
|
|
std::make_shared<ExtT<ExtType>>(last));
|
2018-08-07 23:15:31 +02:00
|
|
|
}
|
|
|
|
|
2018-10-23 20:02:01 +02:00
|
|
|
template <class Expr>
|
2019-02-26 18:56:57 +01:00
|
|
|
inline void ExpressionHolder<Expr>::operator()(size_t mlast)
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2018-10-27 14:58:34 +02:00
|
|
|
mExpr(mlast);
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Expr>
|
2018-10-27 14:58:34 +02:00
|
|
|
DExt ExpressionHolder<Expr>::dRootSteps(std::intptr_t iPtrNum) const
|
2018-10-23 20:02:01 +02:00
|
|
|
{
|
2018-10-27 14:58:34 +02:00
|
|
|
return mExpr.dRootSteps(iPtrNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class Expr>
|
|
|
|
DExt ExpressionHolder<Expr>::dExtension() const
|
|
|
|
{
|
|
|
|
return mExpr.dExtension();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class Expr>
|
|
|
|
auto ExpressionHolder<Expr>::rootSteps(std::intptr_t iPtrNum) const
|
|
|
|
-> ExtType
|
|
|
|
{
|
2020-07-08 11:13:19 +02:00
|
|
|
return std::dynamic_pointer_cast<ExtT<ExtType>>(mExpr.dRootSteps(iPtrNum))->ext();
|
2020-07-07 16:42:41 +02:00
|
|
|
//return *reinterpret_cast<ExtType const*>( mExpr.dRootSteps(iPtrNum).first );
|
2018-10-27 14:58:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class Expr>
|
|
|
|
auto ExpressionHolder<Expr>::extension() const
|
|
|
|
-> ExtType
|
|
|
|
{
|
2020-07-08 11:13:19 +02:00
|
|
|
return std::dynamic_pointer_cast<ExtT<ExtType>>(mExpr.dExtension())->ext();
|
2020-07-07 16:42:41 +02:00
|
|
|
//return *reinterpret_cast<ExtType const*>( mExpr.dExtension().first );
|
2018-10-23 20:02:01 +02:00
|
|
|
}
|
|
|
|
|
2018-10-27 14:58:34 +02:00
|
|
|
|
2018-01-13 18:07:52 +01:00
|
|
|
|
2018-01-05 13:56:16 +01:00
|
|
|
} // namespace MultiArrayHelper
|
|
|
|
|
|
|
|
#endif
|