18 explicit Array(
const QList<int>& _dimensions) : m_dimensions(_dimensions)
20 m_data.resize(totalSize());
25 Array(
const QVector<_T_>& _data,
const QList<int>& _dimensions) : m_data(_data), m_dimensions(_dimensions)
27 Q_ASSERT(m_data.size() == totalSize());
29 template<
int _v_dimension_>
32 if(m_dimensions.size() == 1 and m_dimensions[0] == _v_dimension_)
36 return kCrvSuccess(v);
38 return kCrvError(
"Invalid conversion from array of dimensions {} to vector of dimension {}", m_dimensions, _v_dimension_);
41 template<
typename _RList_ = QList<_T_>>
44 if(m_dimensions.size() == 1)
46 return kCrvSuccess(m_data.toList());
48 return kCrvError(
"Invalid conversion from array of dimensions {} to list.", m_dimensions);
51 template<
int _v_dimension_>
54 if(m_dimensions.size() == 2)
56 if(m_dimensions[1] != _v_dimension_)
58 return kCrvError(
"Invalid conversion from array of dimensions {} to a list of vectors of dimension {}", m_dimensions, _v_dimension_);
61 for(
int i = 0; i < m_dimensions.size(); ++i)
64 for(
int k = 0; k < _v_dimension_; ++k)
66 v[k] = m_data[i * _v_dimension_ + k];
70 return kCrvSuccess(result);
72 return kCrvError(
"Invalid conversion from array of dimensions {} to a list of vectors of dimension {}", m_dimensions, _v_dimension_);
78 return m_dimensions == _rhs.m_dimensions and m_data == _rhs.m_data;
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)
90 KNOWCORE_ASSERT(
sizeof...(_Args_) == m_dimensions.size());
91 return m_data[make_index(0, _indices...)];
94 template<
typename _Arg1_,
typename _Arg2_,
typename... _Args_>
95 int make_index(
int _level, _Arg1_ _i, _Arg2_ j, _Args_... _indices)
97 return make_index(_level + 1, j, _indices...) * m_dimensions[_level] + _i;
99 int make_index(
int,
int _i)
103 int totalSize()
const
106 for(
int d : m_dimensions)