2017-02-16 11:20:40 +01:00
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
#ifndef __multi_array_operation_h__
|
|
|
|
#define __multi_array_operation_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <tuple>
|
|
|
|
|
|
|
|
#include "base_def.h"
|
|
|
|
#include "index_base.h"
|
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
|
|
|
|
template <typename T, class Range>
|
|
|
|
class MultiArrayOperationBase
|
|
|
|
{
|
|
|
|
public:
|
2017-02-21 21:47:40 +01:00
|
|
|
|
|
|
|
typedef decltype(MultiArray<T,Range>().begin()) IndexType;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
2017-02-21 21:47:40 +01:00
|
|
|
MultiArrayOperationBase(MultiArray<T,Range>& ma, const Name& nm);
|
|
|
|
MultiArrayOperationBase& operator=(const MultiArrayOperationBase& in);
|
2017-02-22 00:43:38 +01:00
|
|
|
//MultiArrayOperationBase(const MultiArrayOperationBase& in) = default;
|
|
|
|
|
2017-02-21 21:47:40 +01:00
|
|
|
virtual ~MultiArrayOperationBase();
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
// execute AnyOperation
|
|
|
|
// exception if range types are inconsitent with names
|
|
|
|
template <class Range2>
|
|
|
|
MultiArrayOperationBase& operator=(const MultiArrayOperationBase<T, Range2>& in);
|
|
|
|
|
|
|
|
|
|
|
|
template <class Operation, class... Ranges>
|
2017-02-17 18:10:03 +01:00
|
|
|
MultiArrayOperation<T,Range,Operation,Ranges...>
|
2017-02-22 19:06:23 +01:00
|
|
|
operator()(Operation& op, const MultiArrayOperationBase<T,Ranges>&... secs);
|
|
|
|
|
|
|
|
template <class Operation, class... Ranges>
|
|
|
|
MultiArrayOperation<T,Range,Operation,Ranges...>
|
|
|
|
operator()(const Operation& op, const MultiArrayOperationBase<T,Ranges>&... secs);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
template <class Range2>
|
2017-02-22 19:06:23 +01:00
|
|
|
MultiArrayOperation<T,Range,std::plus<T>,Range2> operator+(const MultiArrayOperationBase<T,Range2>& sec);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
template <class Range2>
|
2017-02-22 19:06:23 +01:00
|
|
|
MultiArrayOperation<T,Range,std::minus<T>,Range2> operator-(const MultiArrayOperationBase<T,Range2>& sec);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
template <class Range2>
|
2017-02-22 19:06:23 +01:00
|
|
|
MultiArrayOperation<T,Range,std::multiplies<T>,Range2> operator*(const MultiArrayOperationBase<T,Range2>& sec);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
template <class Range2>
|
2017-02-22 19:06:23 +01:00
|
|
|
MultiArrayOperation<T,Range,std::divides<T>,Range2> operator/(const MultiArrayOperationBase<T,Range2>& sec);
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
virtual size_t argNum() const;
|
|
|
|
|
2017-02-23 19:33:46 +01:00
|
|
|
//IndexType& index() ;
|
2017-02-16 11:20:40 +01:00
|
|
|
IndefinitIndexBase* index();
|
|
|
|
|
2017-02-22 00:43:38 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
virtual T& get();
|
|
|
|
virtual const T& get() const;
|
2017-02-22 00:43:38 +01:00
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
protected:
|
2017-02-23 19:33:46 +01:00
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
MultiArray<T,Range>& mArrayRef;
|
2017-02-23 20:19:05 +01:00
|
|
|
mutable IndexType mIndex;
|
2017-02-23 19:33:46 +01:00
|
|
|
IndefinitIndexBase* mIibPtr = nullptr;
|
2017-02-22 19:06:23 +01:00
|
|
|
Name mNm;
|
2017-02-16 11:20:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T, class Range, class Operation, class... Ranges>
|
|
|
|
class MultiArrayOperation : public MultiArrayOperationBase<T,Range>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2017-02-17 18:10:03 +01:00
|
|
|
typedef MultiArrayOperationBase<T,Range> OB;
|
2017-02-22 19:06:23 +01:00
|
|
|
typedef std::tuple<MultiArrayOperationBase<T,Ranges>... > OBT;
|
2017-02-17 18:10:03 +01:00
|
|
|
|
2017-02-22 19:06:23 +01:00
|
|
|
MultiArrayOperation(MultiArray<T,Range>& ma, const Name& nm,
|
|
|
|
Operation& op, const MultiArrayOperationBase<T,Ranges>&... secs);
|
|
|
|
|
|
|
|
MultiArrayOperation(MultiArray<T,Range>& ma, const Name& nm,
|
|
|
|
const Operation& op, const MultiArrayOperationBase<T,Ranges>&... secs);
|
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
virtual size_t argNum() const override;
|
|
|
|
|
2017-02-22 00:43:38 +01:00
|
|
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
virtual T& get() override;
|
|
|
|
virtual const T& get() const override;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
2017-02-22 00:43:38 +01:00
|
|
|
mutable T mVal;
|
2017-02-16 11:20:40 +01:00
|
|
|
Operation mOp;
|
2017-02-22 19:06:23 +01:00
|
|
|
OBT mSecs;
|
2017-02-16 11:20:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-02-17 18:10:03 +01:00
|
|
|
#include "multi_array_operation.cc"
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
#endif
|