diff --git a/include/boost/numeric/ublas/banded.hpp b/include/boost/numeric/ublas/banded.hpp index 39d0aa38..e8fe0d33 100644 --- a/include/boost/numeric/ublas/banded.hpp +++ b/include/boost/numeric/ublas/banded.hpp @@ -115,8 +115,7 @@ namespace boost { namespace numeric { namespace ublas { upper_ = upper; if (preserve) { self_type temporary (size1, size2, lower, upper); - // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_preserve (*this, temporary, size_, size_); + detail::matrix_resize_preserve (*this, temporary, size_, size_); assign_temporary (temporary); } else @@ -129,7 +128,7 @@ namespace boost { namespace numeric { namespace ublas { size2_ = size2; lower_ = lower; upper_ = upper; - data ().resize ((std::max) (size1, size2) * (lower + 1 + upper), value_type (0)); + data ().resize ((std::max) (size1, size2) * (lower + 1 + upper), value_type ()); } // Element access diff --git a/include/boost/numeric/ublas/hermitian.hpp b/include/boost/numeric/ublas/hermitian.hpp index 631b67d7..ad913d52 100644 --- a/include/boost/numeric/ublas/hermitian.hpp +++ b/include/boost/numeric/ublas/hermitian.hpp @@ -319,8 +319,7 @@ namespace boost { namespace numeric { namespace ublas { size_ = size; if (preserve) { self_type temporary (size_, size_); - // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_preserve (*this, temporary, size_, size_); + detail::matrix_resize_preserve (*this, temporary, size_, size_); assign_temporary (temporary); } else @@ -333,7 +332,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void resize_packed_preserve (size_type size) { size_ = BOOST_UBLAS_SAME (size, size); - data ().resize (triangular_type::packed_size (layout_type (), size_, size_), value_type (0)); + data ().resize (triangular_type::packed_size (layout_type (), size_, size_), value_type ()); } // Element access diff --git a/include/boost/numeric/ublas/matrix.hpp b/include/boost/numeric/ublas/matrix.hpp index fe0f7f30..ddc4fe50 100644 --- a/include/boost/numeric/ublas/matrix.hpp +++ b/include/boost/numeric/ublas/matrix.hpp @@ -3096,16 +3096,12 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE c_matrix (): size1_ (N), size2_ (M) /* , data_ () */ { - for (size_type i = 0; i < size1_; ++ i) - std::fill (data_ [i], data_ [i] + size2_, value_type (0)); } BOOST_UBLAS_INLINE c_matrix (size_type size1, size_type size2): size1_ (size1), size2_ (size2) /* , data_ () */ { if (size1_ > N || size2_ > M) bad_size ().raise (); - for (size_type i = 0; i < size1_; ++ i) - std::fill (data_ [i], data_ [i] + size2_, value_type (0)); } BOOST_UBLAS_INLINE c_matrix (const c_matrix &m): @@ -3159,9 +3155,11 @@ namespace boost { namespace numeric { namespace ublas { assign_temporary (temporary); } else { + // only necessary for non POD to maintain default initialised invariant + std::fill (data_ + size1_*size2_, data_ + size1+size2, value_type ()); size1_ = size1; size2_ = size2; - } + } } // Element access diff --git a/include/boost/numeric/ublas/symmetric.hpp b/include/boost/numeric/ublas/symmetric.hpp index e7fbb7a7..e7d1d1ff 100644 --- a/include/boost/numeric/ublas/symmetric.hpp +++ b/include/boost/numeric/ublas/symmetric.hpp @@ -124,8 +124,7 @@ namespace boost { namespace numeric { namespace ublas { size_ = size; if (preserve) { self_type temporary (size_, size_); - // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_preserve (*this, temporary, size_, size_); + detail::matrix_resize_preserve (*this, temporary, size_, size_); assign_temporary (temporary); } else @@ -138,7 +137,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void resize_packed_preserve (size_type size) { size_ = BOOST_UBLAS_SAME (size, size); - data ().resize (triangular_type::packed_size (layout_type (), size_, size_), value_type (0)); + data ().resize (triangular_type::packed_size (layout_type (), size_, size_), value_type ()); } // Element access diff --git a/include/boost/numeric/ublas/triangular.hpp b/include/boost/numeric/ublas/triangular.hpp index 482be64a..5b4507fd 100644 --- a/include/boost/numeric/ublas/triangular.hpp +++ b/include/boost/numeric/ublas/triangular.hpp @@ -102,8 +102,7 @@ namespace boost { namespace numeric { namespace ublas { size2_ = size2; if (preserve) { self_type temporary (size1_, size2_); - // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_preserve (*this, temporary, size1_, size2_); + detail::matrix_resize_preserve (*this, temporary, size1_, size2_); assign_temporary (temporary); } else @@ -113,7 +112,7 @@ namespace boost { namespace numeric { namespace ublas { void resize_packed_preserve (size_type size1, size_type size2) { size1_ = size1; size2_ = size2; - data ().resize (triangular_type::packed_size (layout_type (), size1_, size2_), value_type (0)); + data ().resize (triangular_type::packed_size (layout_type (), size1_, size2_), value_type ()); } // Element access diff --git a/include/boost/numeric/ublas/vector.hpp b/include/boost/numeric/ublas/vector.hpp index 5d10671c..c5a45458 100644 --- a/include/boost/numeric/ublas/vector.hpp +++ b/include/boost/numeric/ublas/vector.hpp @@ -93,7 +93,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { if (preserve) - data ().resize (size, typename A::value_type()); + data ().resize (size, typename A::value_type ()); else data ().resize (size); } @@ -148,7 +148,7 @@ namespace boost { namespace numeric { namespace ublas { template // Generic vector assignment without temporary BOOST_UBLAS_INLINE vector &operator = (const vector &v) { - resize (v.size ()); + resize (v.size (), false); assign (v); return *this; } @@ -1182,7 +1182,6 @@ namespace boost { namespace numeric { namespace ublas { size_ (size) /* , data_ () */ { if (size_ > N) bad_size ().raise (); - std::fill (data_, data_ + size_, value_type (0)); } BOOST_UBLAS_INLINE c_vector (const c_vector &v): @@ -1219,7 +1218,8 @@ namespace boost { namespace numeric { namespace ublas { void resize (size_type size, bool preserve = true) { if (size > N) bad_size ().raise (); - std::fill (data_ + (std::min) (size, size_), data_ + size, value_type (0)); + // only necessary for non POD to maintain default initialised invariant + std::fill (data_ + size_, data_ + size, value_type ()); size_ = size; }