From 6a054092b2c19254c24a93202008f55fccb14890 Mon Sep 17 00:00:00 2001 From: conrad Date: Thu, 14 Jan 2021 13:27:49 +1000 Subject: [PATCH] add .has_overlap() --- include/armadillo_bits/ProxyCube.hpp | 108 ++++++++++++++++++--------- 1 file changed, 72 insertions(+), 36 deletions(-) diff --git a/include/armadillo_bits/ProxyCube.hpp b/include/armadillo_bits/ProxyCube.hpp index 87151a50..8a442c77 100644 --- a/include/armadillo_bits/ProxyCube.hpp +++ b/include/armadillo_bits/ProxyCube.hpp @@ -63,9 +63,9 @@ class ProxyCube< Cube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -73,6 +73,9 @@ class ProxyCube< Cube > template arma_inline bool is_alias(const Cube& X) const { return (void_ptr(&Q) == void_ptr(&X)); } + template + arma_inline bool has_overlap(const subview_cube& X) const { return is_alias(X.m); } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -107,9 +110,9 @@ class ProxyCube< GenCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_rows*Q.n_cols*Q.n_slices; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q[i]; } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -117,6 +120,9 @@ class ProxyCube< GenCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return GenCube::is_simple; } }; @@ -151,9 +157,9 @@ class ProxyCube< GenCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -161,6 +167,9 @@ class ProxyCube< GenCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -195,9 +204,9 @@ class ProxyCube< GenCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -205,6 +214,9 @@ class ProxyCube< GenCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -239,9 +251,9 @@ class ProxyCube< OpCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -249,6 +261,9 @@ class ProxyCube< OpCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -283,9 +298,9 @@ class ProxyCube< GlueCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -293,6 +308,9 @@ class ProxyCube< GlueCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -327,9 +345,9 @@ class ProxyCube< subview_cube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -337,6 +355,9 @@ class ProxyCube< subview_cube > template arma_inline bool is_alias(const Cube& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); } + template + arma_inline bool has_overlap(const subview_cube& X) const { return Q.check_overlap(X); } + constexpr bool is_aligned() const { return false; } }; @@ -371,9 +392,9 @@ class ProxyCube< subview_cube_slices > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -381,6 +402,9 @@ class ProxyCube< subview_cube_slices > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -415,9 +439,9 @@ class ProxyCube< eOpCube > arma_inline uword get_n_slices() const { return Q.get_n_slices(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -425,6 +449,9 @@ class ProxyCube< eOpCube > template arma_inline bool is_alias(const Cube& X) const { return Q.P.is_alias(X); } + template + arma_inline bool has_overlap(const subview_cube& X) const { return Q.P.has_overlap(X); } + arma_inline bool is_aligned() const { return Q.P.is_aligned(); } }; @@ -459,9 +486,9 @@ class ProxyCube< eGlueCube > arma_inline uword get_n_slices() const { return Q.get_n_slices(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -469,6 +496,9 @@ class ProxyCube< eGlueCube > template arma_inline bool is_alias(const Cube& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); } + template + arma_inline bool has_overlap(const subview_cube& X) const { return (Q.P1.has_overlap(X) || Q.P2.has_overlap(X)); } + arma_inline bool is_aligned() const { return Q.P1.is_aligned() && Q.P2.is_aligned(); } }; @@ -503,9 +533,9 @@ class ProxyCube< mtOpCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -513,6 +543,9 @@ class ProxyCube< mtOpCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; @@ -547,9 +580,9 @@ class ProxyCube< mtGlueCube > arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword row, const uword col, const uword slice) const { return Q.at(row, col, slice); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } + arma_inline elem_type operator[] (const uword i) const { return Q[i]; } + arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } + arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } @@ -557,6 +590,9 @@ class ProxyCube< mtGlueCube > template constexpr bool is_alias(const Cube&) const { return false; } + template + constexpr bool has_overlap(const subview_cube&) const { return false; } + arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } };