WIP: dynamic_operation
This commit is contained in:
parent
a64291484c
commit
b2f542027f
4 changed files with 151 additions and 0 deletions
37
src/include/dynamic_operation.cc.h
Normal file
37
src/include/dynamic_operation.cc.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
#include "dynamic_operation.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
template <typename T, class Operation>
|
||||||
|
const T& DynamicOperation<T,Operation>::get(const DExt& pos) const
|
||||||
|
{
|
||||||
|
return mOp.get(pos.expl<ET>());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class Operation>
|
||||||
|
DynamicOperationBase& DynamicOperation<T,Operation>::set(const DExt& pos)
|
||||||
|
{
|
||||||
|
mOp.set(pos.expl<ET>());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class Operation>
|
||||||
|
DExt DynamicOperation<T,Operation>::rootSteps(std::intptr_t iPtrNum = 0) const
|
||||||
|
{
|
||||||
|
return mOp.rootSteps(iPtrNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace MultiArrayTools
|
60
src/include/dynamic_operation.h
Normal file
60
src/include/dynamic_operation.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
#ifndef __dynamic_operation_h__
|
||||||
|
#define __dynamic_operation_h__
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "multi_array_operation.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class DynamicOperationBase : public OperationTemplate<T,DynamicOperationBase<T>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef T value_type;
|
||||||
|
typedef OperationBase<T,DynamicOperationBase<T>> OT;
|
||||||
|
|
||||||
|
static constexpr size_t SIZE = 1;
|
||||||
|
static constexpr bool CONT = true;
|
||||||
|
|
||||||
|
DynamicOperationBase() = default;
|
||||||
|
DynamicOperationBase(const DynamicOperationBase& in) = default;
|
||||||
|
DynamicOperationBase(DynamicOperationBase&& in) = default;
|
||||||
|
DynamicOperationBase& operator=(const DynamicOperationBase& in) = default;
|
||||||
|
DynamicOperationBase& operator=(DynamicOperationBase&& in) = default;
|
||||||
|
|
||||||
|
virtual const T& get(const DExt& pos) const = 0;
|
||||||
|
virtual DynamicOperationBase& set(const DExt& pos) = 0;
|
||||||
|
virtual DExt rootSteps(std::intptr_t iPtrNum = 0) const = 0;
|
||||||
|
virtual DynamicExpression loop(const DynamicExpression& exp) const = 0;
|
||||||
|
virtual const T* data() const = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, class Operation>
|
||||||
|
class DynamicOperation : public DynamicOperationBase<T>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Operation mOp;
|
||||||
|
public:
|
||||||
|
typedef decltype(std::declval<Operation>().rootSteps()) ET;
|
||||||
|
|
||||||
|
DynamicOperation() = default;
|
||||||
|
DynamicOperation(const DynamicOperation& in) = default;
|
||||||
|
DynamicOperation(DynamicOperation&& in) = default;
|
||||||
|
DynamicOperation& operator=(const DynamicOperation& in) = default;
|
||||||
|
DynamicOperation& operator=(DynamicOperation&& in) = default;
|
||||||
|
|
||||||
|
DynamicOperation(const Operation& op) : mOp(op) {}
|
||||||
|
|
||||||
|
virtual const T& get(const DExt& pos) const override final;
|
||||||
|
virtual DynamicOperationBase& set(const DExt& pos) override final;
|
||||||
|
virtual DExt rootSteps(std::intptr_t iPtrNum = 0) const override final;
|
||||||
|
virtual DynamicExpression loop(const DynamicExpression& exp) const override final;
|
||||||
|
virtual const T* data() const override final;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace MultiArrayTools
|
||||||
|
|
||||||
|
#endif
|
46
src/include/operation_helper.h
Normal file
46
src/include/operation_helper.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
#ifndef __operation_helper_h__
|
||||||
|
#define __operation_helper_h__
|
||||||
|
|
||||||
|
#include "multi_array_operation.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <class BaseArray, class... Ranges>
|
||||||
|
class PseudoArray
|
||||||
|
{
|
||||||
|
size_t mThreadNum;
|
||||||
|
Slice<> mSl;
|
||||||
|
mutable ConstOperationRoot<T,Range> mOp;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
template <class ET>
|
||||||
|
const SrcHolder<ConstOperationRoot<T,Range>> operator[](ET pos) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
class SrcHolder
|
||||||
|
{
|
||||||
|
|
||||||
|
TempHolder operator+(SrcHolder in) const;
|
||||||
|
// aso
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
class TempHolder
|
||||||
|
{
|
||||||
|
TempHolder operator+(SrcHolder in) const;
|
||||||
|
TempHolder operator+(TempHolder in) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Operation>
|
||||||
|
class TarHolder
|
||||||
|
{
|
||||||
|
TarHolder& operator=(TempHolder in);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace MultiArrayTools
|
||||||
|
|
||||||
|
#endif
|
|
@ -36,6 +36,9 @@ namespace MultiArrayHelper
|
||||||
//virtual size_t rootSteps() 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+(const ExtBase& in) const = 0;
|
||||||
virtual std::shared_ptr<ExtBase> operator*(size_t in) const = 0;
|
virtual std::shared_ptr<ExtBase> operator*(size_t in) const = 0;
|
||||||
|
|
||||||
|
template <class ExtType>
|
||||||
|
const ExtType& expl() const { return dynamic_cast<const ExtT<ExtType>*>(this)->ext(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<ExtBase> DExt;
|
typedef std::shared_ptr<ExtBase> DExt;
|
||||||
|
@ -444,6 +447,11 @@ namespace MultiArrayHelper
|
||||||
|
|
||||||
namespace MultiArrayHelper
|
namespace MultiArrayHelper
|
||||||
{
|
{
|
||||||
|
template <class ExtType>
|
||||||
|
const ExtType& ExtBase::expl() const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const ExtT<ExtType>*>(this)->ext();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************
|
/*****************
|
||||||
* F o r *
|
* F o r *
|
||||||
|
|
Loading…
Reference in a new issue