From 1c477a3e83660bfd9ade8e6fa0971d4ff7f7dc19 Mon Sep 17 00:00:00 2001 From: conrad Date: Mon, 14 Mar 2022 15:22:18 +1000 Subject: [PATCH] more code to support __cpp_multidimensional_subscript --- include/armadillo_bits/Cube_bones.hpp | 10 +++++ include/armadillo_bits/Cube_meat.hpp | 60 ++++++++++++++++++++++++++ include/armadillo_bits/SpMat_bones.hpp | 8 ++++ include/armadillo_bits/SpMat_meat.hpp | 26 +++++++++++ include/armadillo_bits/field_bones.hpp | 12 +++++- include/armadillo_bits/field_meat.hpp | 56 ++++++++++++++++++++++++ 6 files changed, 171 insertions(+), 1 deletion(-) diff --git a/include/armadillo_bits/Cube_bones.hpp b/include/armadillo_bits/Cube_bones.hpp index bd4518a8..4e4a6926 100644 --- a/include/armadillo_bits/Cube_bones.hpp +++ b/include/armadillo_bits/Cube_bones.hpp @@ -271,6 +271,11 @@ class Cube : public BaseCube< eT, Cube > 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::fixed : public Cube 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; diff --git a/include/armadillo_bits/Cube_meat.hpp b/include/armadillo_bits/Cube_meat.hpp index ba85818c..252fc933 100644 --- a/include/armadillo_bits/Cube_meat.hpp +++ b/include/armadillo_bits/Cube_meat.hpp @@ -3456,6 +3456,34 @@ Cube::operator() (const uword in_row, const uword in_col, const uword in_sli +#if defined(__cpp_multidimensional_subscript) + + //! element accessor; no bounds check + template + arma_inline + arma_warn_unused + eT& + Cube::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 + arma_inline + arma_warn_unused + const eT& + Cube::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 arma_inline @@ -5409,6 +5437,38 @@ Cube::fixed::operator() (const u +#if defined(__cpp_multidimensional_subscript) + + template + template + arma_inline + arma_warn_unused + eT& + Cube::fixed::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 + template + arma_inline + arma_warn_unused + const eT& + Cube::fixed::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 template arma_inline diff --git a/include/armadillo_bits/SpMat_bones.hpp b/include/armadillo_bits/SpMat_bones.hpp index 051b8a1a..c26a9818 100644 --- a/include/armadillo_bits/SpMat_bones.hpp +++ b/include/armadillo_bits/SpMat_bones.hpp @@ -276,14 +276,22 @@ class SpMat : public SpBase< eT, SpMat > // access the i-th element; if there is nothing at element i, 0 is returned arma_inline arma_warn_unused SpMat_MapMat_val operator[] (const uword i); arma_inline arma_warn_unused eT operator[] (const uword i) const; + arma_inline arma_warn_unused SpMat_MapMat_val at (const uword i); arma_inline arma_warn_unused eT at (const uword i) const; + arma_inline arma_warn_unused SpMat_MapMat_val 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 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 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 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; diff --git a/include/armadillo_bits/SpMat_meat.hpp b/include/armadillo_bits/SpMat_meat.hpp index 8c63f741..73a562c5 100644 --- a/include/armadillo_bits/SpMat_meat.hpp +++ b/include/armadillo_bits/SpMat_meat.hpp @@ -3326,6 +3326,32 @@ SpMat::operator()(const uword i) const * If there is nothing at that position, 0 is returned. */ +#if defined(__cpp_multidimensional_subscript) + + template + arma_inline + arma_warn_unused + SpMat_MapMat_val + SpMat::operator[] (const uword in_row, const uword in_col) + { + return SpMat_MapMat_val((*this), cache, in_row, in_col); + } + + + + template + arma_inline + arma_warn_unused + eT + SpMat::operator[] (const uword in_row, const uword in_col) const + { + return get_value(in_row, in_col); + } + +#endif + + + template arma_inline arma_warn_unused diff --git a/include/armadillo_bits/field_bones.hpp b/include/armadillo_bits/field_bones.hpp index 19cfb259..27c2d29d 100644 --- a/include/armadillo_bits/field_bones.hpp +++ b/include/armadillo_bits/field_bones.hpp @@ -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; diff --git a/include/armadillo_bits/field_meat.hpp b/include/armadillo_bits/field_meat.hpp index 247c6dcc..d7afee37 100644 --- a/include/armadillo_bits/field_meat.hpp +++ b/include/armadillo_bits/field_meat.hpp @@ -601,6 +601,34 @@ field::operator() (const uword in_row, const uword in_col, const uword in_sl +#if defined(__cpp_multidimensional_subscript) + + //! element accessor; no bounds check + template + arma_inline + arma_warn_unused + oT& + field::operator[] (const uword in_row, const uword in_col) + { + return (*mem[in_row + in_col*n_rows]); + } + + + + //! element accessor; no bounds check + template + arma_inline + arma_warn_unused + const oT& + field::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 arma_inline @@ -625,6 +653,34 @@ field::at(const uword in_row, const uword in_col) const +#if defined(__cpp_multidimensional_subscript) + + //! element accessor; no bounds check + template + arma_inline + arma_warn_unused + oT& + field::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 + arma_inline + arma_warn_unused + const oT& + field::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 arma_inline