diff --git a/include/boost/numeric/ublas/banded.hpp b/include/boost/numeric/ublas/banded.hpp index 33746294..8d26c3e6 100644 --- a/include/boost/numeric/ublas/banded.hpp +++ b/include/boost/numeric/ublas/banded.hpp @@ -122,12 +122,11 @@ namespace boost { namespace numeric { namespace ublas { if (preserve) { self_type temporary (size1, size2, lower, upper); // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_reserve (*this, temporary, size_, size_); + // detail::matrix_resize_preserve (*this, temporary, size_, size_); assign_temporary (temporary); } else - detail::resize (data (), (std::max) (size1, size2) * (lower + 1 + upper), preserve); - detail::resize (data (), (std::max) (size1, size2) * (lower + 1 + upper), preserve); + data ().resize ((std::max) (size1, size2) * (lower + 1 + upper)); } BOOST_UBLAS_INLINE @@ -136,7 +135,7 @@ namespace boost { namespace numeric { namespace ublas { size2_ = size2; lower_ = lower; upper_ = upper; - detail::resize (data (), (std::max) (size1, size2) * (lower + 1 + upper), true); + data ().resize ((std::max) (size1, size2) * (lower + 1 + upper), value_type (0)); } // Element access diff --git a/include/boost/numeric/ublas/concepts.hpp b/include/boost/numeric/ublas/concepts.hpp index 0d74a6bd..8e26d3df 100644 --- a/include/boost/numeric/ublas/concepts.hpp +++ b/include/boost/numeric/ublas/concepts.hpp @@ -486,7 +486,7 @@ namespace boost { namespace numeric { namespace ublas { // Resize c.resize (n, value_type (5)); // Resize - none preserving - detail::resize (c, n, false); + c.resize (n); } }; diff --git a/include/boost/numeric/ublas/hermitian.hpp b/include/boost/numeric/ublas/hermitian.hpp index bd43604a..c3c523e3 100644 --- a/include/boost/numeric/ublas/hermitian.hpp +++ b/include/boost/numeric/ublas/hermitian.hpp @@ -327,11 +327,11 @@ namespace boost { namespace numeric { namespace ublas { if (preserve) { self_type temporary (size_, size_); // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_reserve (*this, temporary, size_, size_); + // detail::matrix_resize_preserve (*this, temporary, size_, size_); assign_temporary (temporary); } else - detail::resize (data (), functor1_type::packed_size (size_, size_), preserve); + data ().resize (functor1_type::packed_size (size_, size_)); } BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, bool preserve = true) { @@ -340,7 +340,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void resize_packed_preserve (size_type size) { size_ = BOOST_UBLAS_SAME (size, size); - detail::resize (data (), functor1_type::packed_size (size_, size_), false); + data ().resize (functor1_type::packed_size (size_, size_), value_type (0)); } // Element access diff --git a/include/boost/numeric/ublas/symmetric.hpp b/include/boost/numeric/ublas/symmetric.hpp index f8ba6b67..351388e0 100644 --- a/include/boost/numeric/ublas/symmetric.hpp +++ b/include/boost/numeric/ublas/symmetric.hpp @@ -134,7 +134,7 @@ namespace boost { namespace numeric { namespace ublas { assign_temporary (temporary); } else - detail::resize (data (), functor1_type::packed_size (size_, size_), preserve); + data ().resize (functor1_type::packed_size (size_, size_)); } BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, bool preserve = true) { @@ -143,7 +143,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void resize_packed_preserve (size_type size) { size_ = BOOST_UBLAS_SAME (size, size); - detail::resize (data (), functor1_type::packed_size (size_, size_), false); + data ().resize (functor1_type::packed_size (size_, size_), value_type (0)); } // Element access diff --git a/include/boost/numeric/ublas/triangular.hpp b/include/boost/numeric/ublas/triangular.hpp index ddb0b9ff..52ad4317 100644 --- a/include/boost/numeric/ublas/triangular.hpp +++ b/include/boost/numeric/ublas/triangular.hpp @@ -106,7 +106,20 @@ namespace boost { namespace numeric { namespace ublas { void resize (size_type size1, size_type size2, bool preserve = true) { size1_ = size1; size2_ = size2; - detail::resize (data (), functor1_type::packed_size (size1, size2), preserve); + if (preserve) { + self_type temporary (size1_, size2_); + // FIXME use matrix_resize_preserve on conformant compilers + // detail::matrix_resize_preserve (*this, temporary, size1_, size2_); + assign_temporary (temporary); + } + else + data ().resize (functor1_type::packed_size (size1_, size2_)); + } + BOOST_UBLAS_INLINE + void resize_packed_preserve (size_type size) { + size1_ = size1; + size2_ = size2; + data ().resize (functor1_type::packed_size (size1_, size2_), value_type (0)); } // Element access diff --git a/include/boost/numeric/ublas/vector.hpp b/include/boost/numeric/ublas/vector.hpp index 41c5070c..b70d2447 100644 --- a/include/boost/numeric/ublas/vector.hpp +++ b/include/boost/numeric/ublas/vector.hpp @@ -29,58 +29,6 @@ namespace boost { namespace numeric { namespace ublas { - namespace detail { - using namespace boost::numeric::ublas; - - // Resizing helper. Allow 'preserve' parameter to be used where possible. - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - // ISSUE Overloaded free function templates fail on some compilers! - // Thanks to Karl Meerbergen for the functor workaround which we use by default - template - struct resize_functor { - void operator() (A& a, typename A::size_type size, bool ) const { - a.resize (size, typename A::value_type (0)); - } - }; - // Specialise for storage_array - template - struct resize_functor > { - void operator() (A& a, typename A::size_type size, bool preserve) const { - if (preserve) - a.resize (size, typename A::value_type (0)); - else - a.resize_new (size); - } - }; - - template - BOOST_UBLAS_INLINE - void resize (A& a, typename A::size_type size, bool preserve) { - resize_functor() (a, size, preserve); - } -#else - template - BOOST_UBLAS_INLINE - void resize (A& a, typename A::size_type size, bool preserve) { - if (preserve) - a.resize (size, BOOST_UBLAS_TYPENAME A::value_type (0)); - else - a.resize_new (size); - } - /* ISSUE Specialise for std::vector ONLY - * however some (MSVC-6/7) compilers without template partial specialization - * also think this is ambiguous when std::vector is used! - */ - template - BOOST_UBLAS_INLINE - void resize (std::vector &a, typename std::vector::size_type size, bool ) { - a.resize (size); - } -#endif - } - - // Array based vector class template class vector: @@ -152,7 +100,10 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { - detail::resize (data (), size, preserve); + if (preserve) + data ().resize (size, BOOST_UBLAS_TYPENAME A::value_type (0)); + else + data ().resize (size); } // Element access