cnorxz/src/multi_array.h

86 lines
1.9 KiB
C
Raw Normal View History

2017-02-16 11:20:40 +01:00
// -*- C++ -*-
#ifndef __multi_array_h__
#define __multi_array_h__
#include <cstdlib>
2017-02-16 16:06:23 +01:00
#include <vector>
#include <memory>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
#include "multi_array_operation.h"
2017-03-07 23:14:57 +01:00
#include "manipulator.h"
2017-02-16 16:06:23 +01:00
#include "name.h"
2017-02-16 11:20:40 +01:00
namespace MultiArrayTools
{
2017-02-26 18:14:58 +01:00
template <typename T, class Range>
class MultiArrayBase
{
public:
2017-03-08 20:10:11 +01:00
// iterator ( containing idx of Range )
2017-02-26 18:14:58 +01:00
DEFAULT_MEMBERS(MultiArrayBase);
MultiArrayBase(const Range& range);
virtual T& operator[](const typename Range::IndexType& i) = 0;
virtual const T& operator[](const typename Range::IndexType& i) const = 0;
virtual size_t size() const;
virtual bool isSlice() const = 0;
virtual auto begin() -> decltype(Range().begin());
virtual auto end() -> decltype(Range().end());
virtual const Range& range() const;
2017-02-27 11:23:40 +01:00
template <class... NameTypes>
MultiArrayOperationRoot<T,Range> operator()(const NameTypes&... str);
2017-03-07 23:14:57 +01:00
2017-02-26 18:14:58 +01:00
protected:
std::shared_ptr<Range> mRange;
};
2017-02-16 11:20:40 +01:00
template <typename T, class Range>
2017-02-26 18:14:58 +01:00
class MultiArray : public MultiArrayBase<T,Range>
2017-02-16 11:20:40 +01:00
{
public:
2017-02-26 18:14:58 +01:00
typedef MultiArrayBase<T,Range> MAB;
2017-02-16 11:20:40 +01:00
DEFAULT_MEMBERS(MultiArray);
2017-02-16 16:06:23 +01:00
MultiArray(const Range& range);
MultiArray(const Range& range, const std::vector<T>& vec);
MultiArray(const Range& range, std::vector<T>&& vec);
2017-03-08 20:10:11 +01:00
template <class Range2, class Range3>
MultiArray(const MultiArray<MultiArray<T,Range2>,Range3> in);
template <class Range2, class Range3>
MultiArray& operator=(const MultiArray<MultiArray<T,Range2>,Range3> in);
2017-02-16 11:20:40 +01:00
2017-02-26 18:14:58 +01:00
T& operator[](const typename Range::IndexType& i) override;
const T& operator[](const typename Range::IndexType& i) const override;
2017-02-23 19:33:46 +01:00
2017-02-26 18:14:58 +01:00
virtual bool isSlice() const override;
2017-03-07 23:14:57 +01:00
2017-03-08 20:10:11 +01:00
// virtual void manipulate(ManipulatorBase<T>& mb,
// const typename Range::IndexType& manBegin,
// const typename Range::IndexType& manEnd);
2017-03-07 23:14:57 +01:00
template <typename U, class RangeX>
friend class MultiArray;
2017-02-16 11:20:40 +01:00
private:
2017-02-16 16:06:23 +01:00
std::vector<T> mCont;
2017-02-16 11:20:40 +01:00
};
}
#include "multi_array.cc"
#endif