knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Array.h
1#ifndef _KNOW_CORE_ARRAY_H_
2#define _KNOW_CORE_ARRAY_H_
3
4#include <clog_qt>
5#include <cres_qt>
6
7#include <QVector>
8
9#include "Global.h"
10#include "Vector.h"
11
12namespace knowCore
13{
14 template<typename _T_>
15 class Array
16 {
17 public:
18 Array() {}
19 explicit Array(const QList<qsizetype>& _dimensions) : m_dimensions(_dimensions)
20 {
21 m_data.resize(totalSize());
22 }
23 Array(const std::initializer_list<qsizetype>& _il) : Array(QList<qsizetype>(_il)) {}
24 Array(const QVector<_T_>& _data, const QList<qsizetype>& _dimensions)
25 : m_data(_data), m_dimensions(_dimensions)
26 {
27 clog_assert(m_data.size() == totalSize());
28 }
29 template<int _v_dimension_>
30 cres_qresult<Vector<_T_, _v_dimension_>> toVector() const
31 {
32 if(m_dimensions.size() == 1 and m_dimensions[0] == _v_dimension_)
33 {
35 v.copyFrom(m_data);
36 return cres_success(v);
37 }
38 else
39 {
40 return cres_failure(
41 "Invalid conversion from array of dimensions {} to vector of dimension {}", m_dimensions,
42 _v_dimension_);
43 }
44 }
45 template<typename _RList_ = QList<_T_>>
46 cres_qresult<_RList_> toList() const
47 {
48 switch(m_dimensions.size())
49 {
50 case 0:
51 return cres_success(QList<_T_>());
52 case 1:
53 return cres_success(m_data.toList());
54 default:
55 return cres_failure("Invalid conversion from array of dimensions {} to list.",
56 m_dimensions);
57 }
58 }
59 template<int _v_dimension_>
60 cres_qresult<QList<Vector<_T_, _v_dimension_>>> toVectorList() const
61 {
62 if(m_dimensions.size() == 2)
63 {
64 if(m_dimensions[1] != _v_dimension_)
65 {
66 return cres_failure(
67 "Invalid conversion from array of dimensions {} to a list of vectors of dimension {}",
68 m_dimensions, _v_dimension_);
69 }
71 for(int i = 0; i < m_dimensions.size(); ++i)
72 {
74 for(int k = 0; k < _v_dimension_; ++k)
75 {
76 v[k] = m_data[i * _v_dimension_ + k];
77 }
78 result.append(v);
79 }
80 return cres_success(result);
81 }
82 else
83 {
84 return cres_failure(
85 "Invalid conversion from array of dimensions {} to a list of vectors of dimension {}",
86 m_dimensions, _v_dimension_);
87 }
88 }
89 bool operator==(const Array<_T_>& _rhs) const
90 {
91 return m_dimensions == _rhs.m_dimensions and m_data == _rhs.m_data;
92 }
93 void fill(const _T_& _v) { m_data.fill(_v); }
94 typename QVector<_T_>::iterator begin() { return m_data.begin(); }
95 typename QVector<_T_>::iterator end() { return m_data.end(); }
96 typename QVector<_T_>::const_iterator begin() const { return m_data.begin(); }
97 typename QVector<_T_>::const_iterator end() const { return m_data.end(); }
98 QVector<_T_> data() const { return m_data; }
99 QList<qsizetype> dimensions() const { return m_dimensions; }
100 template<std::convertible_to<int>... _Args_>
101 _T_& operator()(_Args_... _indices)
102 {
103 clog_assert(sizeof...(_Args_) == m_dimensions.size());
104 return m_data[make_index(0, _indices...)];
105 }
106 private:
107 template<typename _Arg1_, typename _Arg2_, typename... _Args_>
108 int make_index(int _level, _Arg1_ _i, _Arg2_ j, _Args_... _indices)
109 {
110 return make_index(_level + 1, j, _indices...) * m_dimensions[_level] + _i;
111 }
112 int make_index(int, int _i) { return _i; }
113 qsizetype totalSize() const
114 {
115 int ts = 1;
116 for(int d : m_dimensions)
117 {
118 ts *= d;
119 }
120 return ts;
121 }
122 public:
123 QVector<_T_> m_data;
124 QList<qsizetype> m_dimensions;
125 };
126} // namespace knowCore
127
128#endif
Definition Forward.h:14
Definition Array.h:16
Definition Vector.h:13