2022-08-31 14:58:39 +02:00
|
|
|
|
2022-12-06 14:48:44 +01:00
|
|
|
#ifndef __cxz_array_base_h__
|
|
|
|
#define __cxz_array_base_h__
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <vector>
|
|
|
|
#include <memory>
|
|
|
|
#include <algorithm>
|
|
|
|
|
2022-09-15 16:45:45 +02:00
|
|
|
#include "base/base.h"
|
2022-09-17 22:08:01 +02:00
|
|
|
#include "aindex.h"
|
2022-09-15 16:45:45 +02:00
|
|
|
//#include "operation/"
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
namespace CNORXZ
|
|
|
|
{
|
|
|
|
template <typename T>
|
2022-12-06 14:48:44 +01:00
|
|
|
class CArrayBase
|
2022-08-31 14:58:39 +02:00
|
|
|
{
|
|
|
|
public:
|
2022-09-17 22:08:01 +02:00
|
|
|
typedef AIndex<T> const_iterator;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
RangePtr mRange;
|
2022-12-20 00:07:59 +01:00
|
|
|
|
|
|
|
template <class Index>
|
|
|
|
YIndex mkSliceIndex(const YIndex& yi, const Index& i) const;
|
|
|
|
|
|
|
|
template <class Index>
|
|
|
|
XIndexPtr mkSliceIndex(const XIndexPtr& xi, const Sptr<Index>& i) const;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2022-12-06 14:48:44 +01:00
|
|
|
CArrayBase(const RangePtr& range);
|
|
|
|
DEFAULT_MEMBERS(CArrayBase);
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-12-06 14:48:44 +01:00
|
|
|
virtual ~CArrayBase() = default;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
|
|
|
const T& operator[](const IndexInterface<I,M>& i) const;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
|
|
|
const T& at(const IndexInterface<I,M>& i) const;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
2022-12-06 14:48:44 +01:00
|
|
|
Sptr<CArrayBase<T>> sl(const IndexInterface<I,M>& i) const;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
virtual const T* data() const = 0;
|
2022-09-17 22:08:01 +02:00
|
|
|
virtual SizeT size() const;
|
2022-08-31 14:58:39 +02:00
|
|
|
virtual RangePtr range() const;
|
|
|
|
|
|
|
|
virtual const_iterator begin() const;
|
|
|
|
virtual const_iterator end() const;
|
|
|
|
virtual const_iterator cbegin() const = 0;
|
|
|
|
virtual const_iterator cend() const = 0;
|
|
|
|
|
|
|
|
virtual bool isView() const = 0;
|
|
|
|
|
2022-09-15 16:45:45 +02:00
|
|
|
//template <typename I, typename M>
|
|
|
|
//ConstOperationRoot<T,I> operator()(const IndexPtr<I,M>& i) const;
|
2022-08-31 14:58:39 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
2022-12-06 14:48:44 +01:00
|
|
|
class ArrayBase : public CArrayBase<T>
|
2022-08-31 14:58:39 +02:00
|
|
|
{
|
|
|
|
public:
|
2022-12-06 14:48:44 +01:00
|
|
|
typedef CArrayBase<T> CAB;
|
|
|
|
typedef typename CAB::const_iterator const_iterator;
|
2022-09-17 22:08:01 +02:00
|
|
|
typedef BIndex<T> iterator;
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-12-06 14:48:44 +01:00
|
|
|
using CAB::operator[];
|
|
|
|
using CAB::at;
|
|
|
|
using CAB::data;
|
|
|
|
using CAB::begin;
|
|
|
|
using CAB::end;
|
|
|
|
using CAB::cbegin;
|
|
|
|
using CAB::cend;
|
|
|
|
//using CAB::operator();
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-12-06 14:48:44 +01:00
|
|
|
ArrayBase(const RangePtr& range);
|
|
|
|
DEFAULT_MEMBERS(ArrayBase);
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
|
|
|
T& operator[](const IndexInterface<I,M>& i);
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
|
|
|
T& at(const IndexInterface<I,M>& i);
|
2022-08-31 14:58:39 +02:00
|
|
|
|
2022-09-09 19:41:43 +02:00
|
|
|
template <typename I, typename M>
|
2022-12-06 14:48:44 +01:00
|
|
|
Sptr<ArrayBase<T>> sl(const IndexInterface<I,M>& i);
|
2022-08-31 14:58:39 +02:00
|
|
|
|
|
|
|
virtual T* data() = 0;
|
|
|
|
|
|
|
|
virtual iterator begin();
|
|
|
|
virtual iterator end();
|
2022-09-15 16:45:45 +02:00
|
|
|
|
|
|
|
//template <typename I, typename M>
|
|
|
|
//OperationRoot<T,I> operator()(const IndexPtr<I,M>& i);
|
2022-12-12 02:15:42 +01:00
|
|
|
|
2022-08-31 14:58:39 +02:00
|
|
|
};
|
2022-12-12 02:15:42 +01:00
|
|
|
|
2022-08-31 14:58:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|