From cfd4152291a6c32e3385fbcbe8100e0f3874d723 Mon Sep 17 00:00:00 2001 From: Glen Fernandes Date: Sat, 1 Dec 2012 22:43:57 +0000 Subject: [PATCH] Change make_shared and allocate_shared array form overload for size and inner array initialization list to use const T(&)[N] instead of std::initializer_list. [SVN r81658] --- .../boost/smart_ptr/allocate_shared_array.hpp | 48 +++++++++---------- .../boost/smart_ptr/detail/array_traits.hpp | 6 --- include/boost/smart_ptr/make_shared_array.hpp | 48 +++++++++---------- make_shared_array.html | 18 +++---- 4 files changed, 57 insertions(+), 63 deletions(-) diff --git a/include/boost/smart_ptr/allocate_shared_array.hpp b/include/boost/smart_ptr/allocate_shared_array.hpp index 0c0d353..94c417e 100644 --- a/include/boost/smart_ptr/allocate_shared_array.hpp +++ b/include/boost/smart_ptr/allocate_shared_array.hpp @@ -97,30 +97,6 @@ namespace boost { d2->construct_list(p2, n1, p3); return boost::shared_ptr(s1, p1); } - template - inline typename boost::detail::sp_if_array::type - allocate_shared(const A& allocator, std::size_t size, - std::initializer_list::type> list) { - typedef typename boost::detail::array_inner::type T1; - typedef typename boost::detail::array_base::type T2; - typedef const T2 T3; - enum { - M = boost::detail::array_total::size - }; - T1* p1 = 0; - T2* p2 = 0; - T3* p3 = 0; - std::size_t n1 = M * list.size(); - boost::detail::allocate_array_helper a1(allocator, n1, &p2); - boost::detail::array_deleter d1; - boost::shared_ptr s1(p1, d1, a1); - boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); - p1 = reinterpret_cast(p2); - d2 = get_deleter >(s1); - d2->construct_list(p2, n1, p3, M); - return boost::shared_ptr(s1, p1); - } #endif #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) template @@ -146,6 +122,30 @@ namespace boost { return boost::shared_ptr(s1, p1); } template + inline typename boost::detail::sp_if_array::type + allocate_shared(const A& allocator, std::size_t size, + const typename boost::detail::array_inner::type& list) { + typedef typename boost::detail::array_inner::type T1; + typedef typename boost::detail::array_base::type T2; + typedef const T2 T3; + enum { + M = boost::detail::array_total::size + }; + T1* p1 = 0; + T2* p2 = 0; + T3* p3 = 0; + std::size_t n1 = M * size; + boost::detail::allocate_array_helper a1(allocator, n1, &p2); + boost::detail::array_deleter d1; + boost::shared_ptr s1(p1, d1, a1); + boost::detail::array_deleter* d2; + p3 = reinterpret_cast(list); + p1 = reinterpret_cast(p2); + d2 = get_deleter >(s1); + d2->construct_list(p2, n1, p3, M); + return boost::shared_ptr(s1, p1); + } + template inline typename boost::detail::sp_if_size_array::type allocate_shared(const A& allocator, const typename boost::detail::array_inner::type& list) { diff --git a/include/boost/smart_ptr/detail/array_traits.hpp b/include/boost/smart_ptr/detail/array_traits.hpp index 83726b0..3ef482a 100644 --- a/include/boost/smart_ptr/detail/array_traits.hpp +++ b/include/boost/smart_ptr/detail/array_traits.hpp @@ -51,12 +51,6 @@ namespace boost { struct array_inner { typedef T type; }; - template - struct arrays_inner; - template - struct arrays_inner { - typedef T type; - }; } } diff --git a/include/boost/smart_ptr/make_shared_array.hpp b/include/boost/smart_ptr/make_shared_array.hpp index af59689..d268b71 100644 --- a/include/boost/smart_ptr/make_shared_array.hpp +++ b/include/boost/smart_ptr/make_shared_array.hpp @@ -96,30 +96,6 @@ namespace boost { d2->construct_list(p2, n1, p3); return boost::shared_ptr(s1, p1); } - template - inline typename boost::detail::sp_if_array::type - make_shared(std::size_t size, - std::initializer_list::type> list) { - typedef typename boost::detail::array_inner::type T1; - typedef typename boost::detail::array_base::type T2; - typedef const T2 T3; - enum { - M = boost::detail::array_total::size - }; - T1* p1 = 0; - T2* p2 = 0; - T3* p3 = 0; - std::size_t n1 = M * size; - boost::detail::make_array_helper a1(n1, &p2); - boost::detail::array_deleter d1; - boost::shared_ptr s1(p1, d1, a1); - boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); - p1 = reinterpret_cast(p2); - d2 = get_deleter >(s1); - d2->construct_list(p2, n1, p3, M); - return boost::shared_ptr(s1, p1); - } #endif #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) template @@ -145,6 +121,30 @@ namespace boost { return boost::shared_ptr(s1, p1); } template + inline typename boost::detail::sp_if_array::type + make_shared(std::size_t size, + const typename boost::detail::array_inner::type& list) { + typedef typename boost::detail::array_inner::type T1; + typedef typename boost::detail::array_base::type T2; + typedef const T2 T3; + enum { + M = boost::detail::array_total::size + }; + T1* p1 = 0; + T2* p2 = 0; + T3* p3 = 0; + std::size_t n1 = M * size; + boost::detail::make_array_helper a1(n1, &p2); + boost::detail::array_deleter d1; + boost::shared_ptr s1(p1, d1, a1); + boost::detail::array_deleter* d2; + p3 = reinterpret_cast(list); + p1 = reinterpret_cast(p2); + d2 = get_deleter >(s1); + d2->construct_list(p2, n1, p3, M); + return boost::shared_ptr(s1, p1); + } + template inline typename boost::detail::sp_if_size_array::type make_shared(const typename boost::detail::array_inner::type& list) { typedef typename boost::detail::array_inner::type T1; diff --git a/make_shared_array.html b/make_shared_array.html index c5a9797..b42d28a 100644 --- a/make_shared_array.html +++ b/make_shared_array.html @@ -12,7 +12,7 @@ Synopsis
Free Functions
Example
- History
+ History

Introduction

Originally the Boost function templates make_shared and allocate_shared were for efficient allocation of single @@ -53,26 +53,26 @@ template<typename T, typename... Args> shared_ptr<T[]> make_shared(initializer_list<T> list); - template<typename T, typename... Args> - shared_ptr<T[][N]> make_shared(size_t size, initializer_list<T> list); - template<typename T, typename A, typename... Args> shared_ptr<T[]> allocate_shared(const A& allocator, initializer_list<T> list); - - template<typename T, typename A, typename... Args> - shared_ptr<T[][N]> allocate_shared(const A& allocator, size_t size, initializer_list<T> list); #endif #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) template<typename T, typename... Args> shared_ptr<T[N]> make_shared(const T (&list)[N]); + template<typename T, typename... Args> + shared_ptr<T[][N]> make_shared(size_t size, const T (&list)[N]); + template<typename T, typename... Args> shared_ptr<T[M][N]> make_shared(const T (&list)[N]); template<typename T, typename A, typename... Args> shared_ptr<T[N]> allocate_shared(const A& allocator, const T (&list)[N]); + template<typename T, typename A, typename... Args> + shared_ptr<T[][N]> allocate_shared(const A& allocator, size_t size, const T (&list)[N]); + template<typename T, typename A, typename... Args> shared_ptr<T[M][N]> allocate_shared(const A& allocator, const T (&list)[N]); #endif @@ -151,9 +151,9 @@ template<typename T, typename A, typename... Args> fixed size array.

template<typename T, typename... Args>
-    shared_ptr<T[][N]> make_shared(size_t size, initializer_list<T> list);
+    shared_ptr<T[][N]> make_shared(size_t size, const T (&list)[N]);
 template<typename T, typename A, typename... Args>
-    shared_ptr<T[][N]> allocate_shared(const A& allocator, size_t size, initializer_list<T> list);
+ shared_ptr<T[][N]> allocate_shared(const A& allocator, size_t size, const T (&list)[N]);

Description: These overloads initialize inner array elements from the initializer list.