cnorxz/src/multi_array_operation.h

107 lines
2.8 KiB
C
Raw Normal View History

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:
typedef decltype(MultiArray<T,Range>().begin()) IndexType;
2017-02-16 11:20: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;
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>
MultiArrayOperation<T,Range,Operation,Ranges...>
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>
MultiArrayOperation<T,Range,std::plus<T>,Range2> operator+(const MultiArrayOperationBase<T,Range2>& sec);
2017-02-16 11:20:40 +01:00
template <class Range2>
MultiArrayOperation<T,Range,std::minus<T>,Range2> operator-(const MultiArrayOperationBase<T,Range2>& sec);
2017-02-16 11:20:40 +01:00
template <class Range2>
MultiArrayOperation<T,Range,std::multiplies<T>,Range2> operator*(const MultiArrayOperationBase<T,Range2>& sec);
2017-02-16 11:20:40 +01:00
template <class Range2>
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 19:33:46 +01:00
//mutable IndexType mIndex;
IndefinitIndexBase* mIibPtr = nullptr;
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:
typedef MultiArrayOperationBase<T,Range> OB;
typedef std::tuple<MultiArrayOperationBase<T,Ranges>... > OBT;
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;
OBT mSecs;
2017-02-16 11:20:40 +01:00
};
}
#include "multi_array_operation.cc"
2017-02-16 11:20:40 +01:00
#endif