cnorxz/src/multi_array.h

276 lines
7.7 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>
#include <iterator>
#include <algorithm>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
2017-05-22 18:21:14 +02:00
#include "multi_range.h"
//#include "multi_array_operation.h"
//#include "manipulator.h"
//#include "name.h"
2017-02-16 11:20:40 +01:00
namespace MultiArrayTools
{
2017-05-22 18:21:14 +02:00
template <typename T, class CRange>
2017-02-26 18:14:58 +01:00
class MultiArrayBase
{
public:
typedef T value_type;
class const_iterator : public std::iterator<std::random_access_iterator_tag,T>
{
public:
DEFAULT_MEMBERS(const_iterator);
const_iterator(const MultiArrayBase& ma);
const_iterator(const MultiArrayBase& ma, const typename CRange::IndexType& index);
virtual ~const_iterator() = default;
// Requirements:
bool operator==(const const_iterator& it) const;
bool operator!=(const const_iterator& it) const;
const T& operator*() const;
T const* operator->() const;
const_iterator& operator++();
const_iterator operator++(int);
const_iterator& operator--();
const_iterator operator--(int);
const_iterator& operator+=(int diff);
const_iterator& operator-=(int diff);
const_iterator operator+(int num) const;
const_iterator operator-(int num) const;
int operator-(const const_iterator& it) const;
const T& operator[](int num) const;
bool operator<(const const_iterator& it) const;
bool operator>(const const_iterator& it) const;
bool operator<=(const const_iterator& it) const;
bool operator>=(const const_iterator& it) const;
// Multi Array specific:
typename CRange::IndexType index() const;
protected:
MultiArrayBase const* mMAPtr = nullptr;
size_t mPos;
};
2017-02-26 18:14:58 +01:00
DEFAULT_MEMBERS(MultiArrayBase);
MultiArrayBase(const std::shared_ptr<CRange>& range);
2017-03-14 23:00:41 +01:00
virtual ~MultiArrayBase() = default;
2017-02-26 18:14:58 +01:00
virtual const T& operator[](const typename CRange::IndexType& i) const = 0;
2017-08-09 16:58:38 +02:00
virtual const T& at(const typename CRange::IndexType::MetaType& meta) const = 0;
2017-02-26 18:14:58 +01:00
virtual const T* data() const = 0;
2017-02-26 18:14:58 +01:00
virtual size_t size() const;
virtual bool isSlice() const = 0;
virtual const_iterator begin() const;
virtual const_iterator end() const;
2017-02-26 18:14:58 +01:00
virtual typename CRange::IndexType beginIndex() const;
virtual typename CRange::IndexType endIndex() const;
2017-02-26 18:14:58 +01:00
virtual const CRange& range() const;
2017-02-27 11:23:40 +01:00
2017-03-20 11:21:33 +01:00
virtual bool isConst() const;
/*
template <class... NameTypes>
ConstMultiArrayOperationRoot<T,CRange> operator()(const NameTypes&... str) const;
template <class NameType>
ConstMultiArrayOperationRoot<T,CRange> operator()(const NameType& name, bool master) const;
*/
2017-03-09 19:59:11 +01:00
virtual bool isInit() const;
2017-02-26 18:14:58 +01:00
protected:
2017-03-09 19:59:11 +01:00
bool mInit = false;
std::shared_ptr<CRange> mRange;
2017-02-26 18:14:58 +01:00
};
2017-03-20 11:21:33 +01:00
template <typename T, class CRange>
class MutableMultiArrayBase : public MultiArrayBase<T,CRange>
2017-03-20 11:21:33 +01:00
{
public:
typedef typename MultiArrayBase<T,CRange>::const_iterator const_iterator;
typedef MultiArrayBase<T,CRange> MAB;
typedef typename CRange::IndexType IndexType;
class iterator : public std::iterator<std::random_access_iterator_tag,T>,
public std::iterator<std::output_iterator_tag,T>
{
public:
DEFAULT_MEMBERS(iterator);
iterator(MutableMultiArrayBase& ma);
2017-05-22 18:21:14 +02:00
iterator(MutableMultiArrayBase& ma, const IndexType& index);
virtual ~iterator() = default;
// Requirements:
bool operator==(const iterator& it) const;
bool operator!=(const iterator& it) const;
const T& operator*() const;
T const* operator->() const;
T& operator*();
T* operator->();
iterator& operator++();
iterator operator++(int);
iterator& operator--();
iterator operator--(int);
iterator& operator+=(int diff);
iterator& operator-=(int diff);
iterator operator+(int num) const;
iterator operator-(int num) const;
int operator-(const iterator& it) const;
const T& operator[](int num) const;
T& operator[](int num);
bool operator<(const iterator& it) const;
bool operator>(const iterator& it) const;
bool operator<=(const iterator& it) const;
bool operator>=(const iterator& it) const;
// Multi Array specific:
typename CRange::IndexType index() const;
protected:
MutableMultiArrayBase* mMAPtr = nullptr;
size_t mPos;
};
2017-03-20 11:21:33 +01:00
DEFAULT_MEMBERS(MutableMultiArrayBase);
MutableMultiArrayBase(const std::shared_ptr<CRange>& range);
2017-03-20 11:21:33 +01:00
2017-05-22 18:21:14 +02:00
virtual T& operator[](const IndexType& i) = 0;
2017-08-09 16:58:38 +02:00
virtual T& at(const typename CRange::IndexType::MetaType& meta) = 0;
virtual T* data() = 0;
virtual iterator begin();
virtual iterator end();
2017-03-20 11:21:33 +01:00
virtual bool isConst() const override;
/*
2017-03-22 11:44:33 +01:00
template <class... NameTypes>
ConstMultiArrayOperationRoot<T,CRange> operator()(bool x, const NameTypes&... str) const
2017-03-22 11:44:33 +01:00
{
return MAB::operator()(str...);
}
2017-03-22 21:51:54 +01:00
template <class... NameTypes>
ConstMultiArrayOperationRoot<T,CRange> operator()(const NameTypes&... str) const;
2017-03-22 21:51:54 +01:00
template <class NameType>
ConstMultiArrayOperationRoot<T,CRange> operator()(const NameType& name, bool master) const;
2017-03-22 11:44:33 +01:00
2017-03-20 11:21:33 +01:00
template <class... NameTypes>
MultiArrayOperationRoot<T,CRange> operator()(const NameTypes&... str);
2017-03-20 11:21:33 +01:00
template <class NameType>
MultiArrayOperationRoot<T,CRange> operator()(const NameType& name, bool master);
*/
2017-03-20 11:21:33 +01:00
};
2017-02-26 18:14:58 +01:00
template <typename T, class CRange>
class MultiArray : public MutableMultiArrayBase<T,CRange>
2017-02-16 11:20:40 +01:00
{
public:
typedef MultiArrayBase<T,CRange> MAB;
typedef typename MultiArrayBase<T,CRange>::const_iterator const_iterator;
typedef typename MutableMultiArrayBase<T,CRange>::iterator iterator;
typedef typename CRange::IndexType IndexType;
2017-02-16 11:20:40 +01:00
DEFAULT_MEMBERS(MultiArray);
MultiArray(const std::shared_ptr<CRange>& range);
MultiArray(const std::shared_ptr<CRange>& range, const std::vector<T>& vec);
MultiArray(const std::shared_ptr<CRange>& 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);
// implement contstructor using FunctionalMultiArray as Input !!!
//template <class Range2, class Range3>
//MultiArray& operator=(const MultiArray<MultiArray<T,Range2>,Range3> in);
2017-02-16 11:20:40 +01:00
2017-08-09 16:58:38 +02:00
virtual T& operator[](const IndexType& i) override;
virtual const T& operator[](const IndexType& i) const override;
virtual T& at(const typename CRange::IndexType::MetaType& meta) override;
virtual const T& at(const typename CRange::IndexType::MetaType& meta) const override;
virtual bool isConst() const override;
2017-02-26 18:14:58 +01:00
virtual bool isSlice() const override;
2017-03-07 23:14:57 +01:00
template <class Range2>
2017-08-09 11:29:41 +02:00
MultiArray<T,Range2> format(const std::shared_ptr<Range2>& nr); // reformat array using 'nr' which in
// total must have the same size as mRange
const T* data() const override;
T* data() override;
2017-03-29 17:05:50 +02:00
2017-03-08 20:10:11 +01:00
// virtual void manipulate(ManipulatorBase<T>& mb,
// const typename CRange::IndexType& manBegin,
// const typename CRange::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
};
template <typename T, class CRange, class Function>
class FunctionalMultiArray : public MultiArrayBase<T,CRange>
{
public:
typedef MultiArrayBase<T,CRange> MAB;
typedef typename MultiArrayBase<T,CRange>::const_iterator const_iterator;
typedef typename CRange::IndexType IndexType;
2017-05-22 18:21:14 +02:00
DEFAULT_MEMBERS(FunctionalMultiArray);
//FunctionalMultiArray(const CRange& range);
FunctionalMultiArray(const std::shared_ptr<CRange>& range, const Function& func);
2017-05-22 18:21:14 +02:00
virtual const T& operator[](const IndexType& i) const override;
virtual bool isConst() const override;
virtual bool isSlice() const override;
protected:
mutable T mVal;
Function mFunc;
};
2017-02-16 11:20:40 +01:00
}
#include "multi_array.cc"
#endif