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