more code to support __cpp_multidimensional_subscript

This commit is contained in:
conrad
2022-03-14 15:22:18 +10:00
parent afe349fdd9
commit 1c477a3e83
6 changed files with 171 additions and 1 deletions
+10
View File
@@ -271,6 +271,11 @@ class Cube : public BaseCube< eT, Cube<eT> >
arma_inline arma_warn_unused eT& operator() (const uword i);
arma_inline arma_warn_unused const eT& operator() (const uword i) const;
#if defined(__cpp_multidimensional_subscript)
arma_inline arma_warn_unused eT& operator[] (const uword in_row, const uword in_col, const uword in_slice);
arma_inline arma_warn_unused const eT& operator[] (const uword in_row, const uword in_col, const uword in_slice) const;
#endif
arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col, const uword in_slice);
arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col, const uword in_slice) const;
@@ -490,6 +495,11 @@ class Cube<eT>::fixed : public Cube<eT>
arma_inline arma_warn_unused eT& operator() (const uword i);
arma_inline arma_warn_unused const eT& operator() (const uword i) const;
#if defined(__cpp_multidimensional_subscript)
arma_inline arma_warn_unused eT& operator[] (const uword in_row, const uword in_col, const uword in_slice);
arma_inline arma_warn_unused const eT& operator[] (const uword in_row, const uword in_col, const uword in_slice) const;
#endif
arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col, const uword in_slice);
arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col, const uword in_slice) const;
+60
View File
@@ -3456,6 +3456,34 @@ Cube<eT>::operator() (const uword in_row, const uword in_col, const uword in_sli
#if defined(__cpp_multidimensional_subscript)
//! element accessor; no bounds check
template<typename eT>
arma_inline
arma_warn_unused
eT&
Cube<eT>::operator[] (const uword in_row, const uword in_col, const uword in_slice)
{
return access::rw( mem[in_slice*n_elem_slice + in_col*n_rows + in_row] );
}
//! element accessor; no bounds check
template<typename eT>
arma_inline
arma_warn_unused
const eT&
Cube<eT>::operator[] (const uword in_row, const uword in_col, const uword in_slice) const
{
return mem[in_slice*n_elem_slice + in_col*n_rows + in_row];
}
#endif
//! element accessor; no bounds check
template<typename eT>
arma_inline
@@ -5409,6 +5437,38 @@ Cube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator() (const u
#if defined(__cpp_multidimensional_subscript)
template<typename eT>
template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>
arma_inline
arma_warn_unused
eT&
Cube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator[] (const uword in_row, const uword in_col, const uword in_slice)
{
const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;
return (use_extra) ? mem_local_extra[i] : mem_local[i];
}
template<typename eT>
template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>
arma_inline
arma_warn_unused
const eT&
Cube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::operator[] (const uword in_row, const uword in_col, const uword in_slice) const
{
const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row;
return (use_extra) ? mem_local_extra[i] : mem_local[i];
}
#endif
template<typename eT>
template<uword fixed_n_rows, uword fixed_n_cols, uword fixed_n_slices>
arma_inline
+8
View File
@@ -276,14 +276,22 @@ class SpMat : public SpBase< eT, SpMat<eT> >
// access the i-th element; if there is nothing at element i, 0 is returned
arma_inline arma_warn_unused SpMat_MapMat_val<eT> operator[] (const uword i);
arma_inline arma_warn_unused eT operator[] (const uword i) const;
arma_inline arma_warn_unused SpMat_MapMat_val<eT> at (const uword i);
arma_inline arma_warn_unused eT at (const uword i) const;
arma_inline arma_warn_unused SpMat_MapMat_val<eT> operator() (const uword i);
arma_inline arma_warn_unused eT operator() (const uword i) const;
// access the element at the given row and column; if there is nothing at that position, 0 is returned
#if defined(__cpp_multidimensional_subscript)
arma_inline arma_warn_unused SpMat_MapMat_val<eT> operator[] (const uword in_row, const uword in_col);
arma_inline arma_warn_unused eT operator[] (const uword in_row, const uword in_col) const;
#endif
arma_inline arma_warn_unused SpMat_MapMat_val<eT> at (const uword in_row, const uword in_col);
arma_inline arma_warn_unused eT at (const uword in_row, const uword in_col) const;
arma_inline arma_warn_unused SpMat_MapMat_val<eT> operator() (const uword in_row, const uword in_col);
arma_inline arma_warn_unused eT operator() (const uword in_row, const uword in_col) const;
+26
View File
@@ -3326,6 +3326,32 @@ SpMat<eT>::operator()(const uword i) const
* If there is nothing at that position, 0 is returned.
*/
#if defined(__cpp_multidimensional_subscript)
template<typename eT>
arma_inline
arma_warn_unused
SpMat_MapMat_val<eT>
SpMat<eT>::operator[] (const uword in_row, const uword in_col)
{
return SpMat_MapMat_val<eT>((*this), cache, in_row, in_col);
}
template<typename eT>
arma_inline
arma_warn_unused
eT
SpMat<eT>::operator[] (const uword in_row, const uword in_col) const
{
return get_value(in_row, in_col);
}
#endif
template<typename eT>
arma_inline
arma_warn_unused
+11 -1
View File
@@ -97,9 +97,19 @@ class field
arma_inline arma_warn_unused oT& operator()(const uword i);
arma_inline arma_warn_unused const oT& operator()(const uword i) const;
#if defined(__cpp_multidimensional_subscript)
arma_inline arma_warn_unused oT& operator[](const uword row, const uword col);
arma_inline arma_warn_unused const oT& operator[](const uword row, const uword col) const;
#endif
arma_inline arma_warn_unused oT& at(const uword row, const uword col);
arma_inline arma_warn_unused const oT& at(const uword row, const uword col) const;
#if defined(__cpp_multidimensional_subscript)
arma_inline arma_warn_unused oT& operator[](const uword row, const uword col, const uword slice);
arma_inline arma_warn_unused const oT& operator[](const uword row, const uword col, const uword slice) const;
#endif
arma_inline arma_warn_unused oT& at(const uword row, const uword col, const uword slice);
arma_inline arma_warn_unused const oT& at(const uword row, const uword col, const uword slice) const;
+56
View File
@@ -601,6 +601,34 @@ field<oT>::operator() (const uword in_row, const uword in_col, const uword in_sl
#if defined(__cpp_multidimensional_subscript)
//! element accessor; no bounds check
template<typename oT>
arma_inline
arma_warn_unused
oT&
field<oT>::operator[] (const uword in_row, const uword in_col)
{
return (*mem[in_row + in_col*n_rows]);
}
//! element accessor; no bounds check
template<typename oT>
arma_inline
arma_warn_unused
const oT&
field<oT>::operator[] (const uword in_row, const uword in_col) const
{
return (*mem[in_row + in_col*n_rows]);
}
#endif
//! element accessor; no bounds check
template<typename oT>
arma_inline
@@ -625,6 +653,34 @@ field<oT>::at(const uword in_row, const uword in_col) const
#if defined(__cpp_multidimensional_subscript)
//! element accessor; no bounds check
template<typename oT>
arma_inline
arma_warn_unused
oT&
field<oT>::operator[] (const uword in_row, const uword in_col, const uword in_slice)
{
return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);
}
//! element accessor; no bounds check
template<typename oT>
arma_inline
arma_warn_unused
const oT&
field<oT>::operator[] (const uword in_row, const uword in_col, const uword in_slice) const
{
return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]);
}
#endif
//! element accessor; no bounds check
template<typename oT>
arma_inline