diff --git a/include/armadillo_bits/field_bones.hpp b/include/armadillo_bits/field_bones.hpp index d3d2b053..634e6059 100644 --- a/include/armadillo_bits/field_bones.hpp +++ b/include/armadillo_bits/field_bones.hpp @@ -21,13 +21,6 @@ -struct field_prealloc_n_elem - { - static constexpr uword val = 16; - }; - - - //! A lightweight 1D/2D/3D container for arbitrary objects //! (the objects must have a copy constructor) @@ -46,8 +39,7 @@ class field private: - arma_aligned oT** mem; //!< pointers to stored objects - arma_aligned oT* mem_local[ field_prealloc_n_elem::val ]; //!< local storage, for small fields + arma_aligned oT** mem; //!< pointers to stored objects public: diff --git a/include/armadillo_bits/field_meat.hpp b/include/armadillo_bits/field_meat.hpp index 1ae7cce1..fcc9ac30 100644 --- a/include/armadillo_bits/field_meat.hpp +++ b/include/armadillo_bits/field_meat.hpp @@ -28,7 +28,7 @@ field::~field() delete_objects(); - if(n_elem > field_prealloc_n_elem::val) { delete [] mem; } + if(n_elem > 0) { delete [] mem; } // try to expose buggy user code that accesses deleted objects mem = nullptr; @@ -279,6 +279,7 @@ field::field(const std::vector& x) , n_cols (0) , n_slices(0) , n_elem (0) + , mem (nullptr) { arma_debug_sigprint_this(this); @@ -312,6 +313,7 @@ field::field(const std::initializer_list& list) , n_cols (0) , n_slices(0) , n_elem (0) + , mem (nullptr) { arma_debug_sigprint_this(this); @@ -347,6 +349,7 @@ field::field(const std::initializer_list< std::initializer_list >& list) , n_cols (0) , n_slices(0) , n_elem (0) + , mem (nullptr) { arma_debug_sigprint_this(this); @@ -412,19 +415,10 @@ field::field(field&& X) , n_cols (X.n_cols ) , n_slices(X.n_slices) , n_elem (X.n_elem ) + , mem (X.mem ) { arma_debug_sigprint(arma_str::format("this: %x; X: %x") % this % &X); - if(n_elem > field_prealloc_n_elem::val) - { - mem = X.mem; - } - else - { - arrayops::copy(&mem_local[0], &X.mem_local[0], n_elem); - mem = mem_local; - } - access::rw(X.n_rows ) = 0; access::rw(X.n_cols ) = 0; access::rw(X.n_slices) = 0; @@ -450,15 +444,7 @@ field::operator=(field&& X) access::rw(n_slices) = X.n_slices; access::rw(n_elem ) = X.n_elem; - if(n_elem > field_prealloc_n_elem::val) - { - mem = X.mem; - } - else - { - arrayops::copy(&mem_local[0], &X.mem_local[0], n_elem); - mem = mem_local; - } + mem = X.mem; access::rw(X.n_rows ) = 0; access::rw(X.n_cols ) = 0; @@ -531,7 +517,7 @@ field::at(const uword i) const -//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined +//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline oT& @@ -544,7 +530,7 @@ field::operator() (const uword i) -//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined +//! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline const oT& @@ -557,7 +543,7 @@ field::operator() (const uword i) const -//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined +//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline oT& @@ -570,7 +556,7 @@ field::operator() (const uword in_row, const uword in_col) -//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined +//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline const oT& @@ -583,7 +569,7 @@ field::operator() (const uword in_row, const uword in_col) const -//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined +//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline oT& @@ -596,7 +582,7 @@ field::operator() (const uword in_row, const uword in_col, const uword in_sl -//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined +//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined template arma_inline const oT& @@ -1967,32 +1953,31 @@ field::init(const field& x) { arma_debug_sigprint(); - if(this != &x) + if(this == &x) { return; } + + const uword x_n_rows = x.n_rows; + const uword x_n_cols = x.n_cols; + const uword x_n_slices = x.n_slices; + + init(x_n_rows, x_n_cols, x_n_slices); + + field& t = *this; + + if(x_n_slices == 1) { - const uword x_n_rows = x.n_rows; - const uword x_n_cols = x.n_cols; - const uword x_n_slices = x.n_slices; - - init(x_n_rows, x_n_cols, x_n_slices); - - field& t = *this; - - if(x_n_slices == 1) + for(uword ucol=0; ucol < x_n_cols; ++ucol) + for(uword urow=0; urow < x_n_rows; ++urow) { - for(uword ucol=0; ucol < x_n_cols; ++ucol) - for(uword urow=0; urow < x_n_rows; ++urow) - { - t.at(urow,ucol) = x.at(urow,ucol); - } + t.at(urow,ucol) = x.at(urow,ucol); } - else + } + else + { + for(uword uslice=0; uslice < x_n_slices; ++uslice) + for(uword ucol=0; ucol < x_n_cols; ++ucol ) + for(uword urow=0; urow < x_n_rows; ++urow ) { - for(uword uslice=0; uslice < x_n_slices; ++uslice) - for(uword ucol=0; ucol < x_n_cols; ++ucol ) - for(uword urow=0; urow < x_n_rows; ++urow ) - { - t.at(urow,ucol,uslice) = x.at(urow,ucol,uslice); - } + t.at(urow,ucol,uslice) = x.at(urow,ucol,uslice); } } } @@ -2046,13 +2031,11 @@ field::init(const uword n_rows_in, const uword n_cols_in, const uword n_slic { delete_objects(); - if(n_elem > field_prealloc_n_elem::val) { delete [] mem; } + if(n_elem > 0) { delete [] mem; } - if(n_elem_new <= field_prealloc_n_elem::val) - { - mem = (n_elem_new == 0) ? nullptr : mem_local; - } - else + mem = nullptr; + + if(n_elem_new > 0) { mem = new(std::nothrow) oT* [n_elem_new]; @@ -2079,11 +2062,7 @@ field::delete_objects() for(uword i=0; i