From 4da0e2b7fc942b11c256f00c1908e8feb5d81027 Mon Sep 17 00:00:00 2001 From: Glen Fernandes Date: Sat, 1 Dec 2012 04:36:41 +0000 Subject: [PATCH] Use const T (&)[N] for fixed size arrays instead of std::initializer in overloads of make_shared and allocate_shared for arrays. [SVN r81641] --- .../boost/smart_ptr/allocate_shared_array.hpp | 31 ++++++++++------- .../boost/smart_ptr/detail/array_traits.hpp | 13 ++----- include/boost/smart_ptr/make_shared_array.hpp | 34 ++++++++++++------- make_shared_array.html | 16 ++++----- test/allocate_shared_arrays_create_test.cpp | 14 ++++++++ test/make_shared_arrays_create_test.cpp | 14 ++++++++ 6 files changed, 78 insertions(+), 44 deletions(-) diff --git a/include/boost/smart_ptr/allocate_shared_array.hpp b/include/boost/smart_ptr/allocate_shared_array.hpp index 4a7de24..e6f47d3 100644 --- a/include/boost/smart_ptr/allocate_shared_array.hpp +++ b/include/boost/smart_ptr/allocate_shared_array.hpp @@ -60,9 +60,11 @@ namespace boost { allocate_shared(const A& allocator, Args&&... args) { typedef typename boost::detail::array_inner::type T1; typedef typename boost::detail::array_base::type T2; + enum { + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; - enum { N = boost::detail::array_total::size }; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); @@ -97,21 +99,21 @@ namespace boost { } template inline typename boost::detail::sp_if_size_array::type - allocate_shared(const A& allocator, - std::initializer_list::type> list) { + allocate_shared(const A& allocator, const T& list) { typedef typename boost::detail::array_inner::type T1; typedef typename boost::detail::array_base::type T2; typedef const T2 T3; - BOOST_ASSERT(list.size() == boost::detail::array_size::size); + enum { + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; T3* p3 = 0; - enum { N = boost::detail::array_total::size }; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); + p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); d2 = get_deleter >(s1); d2->construct_list(p2, p3); @@ -124,10 +126,12 @@ namespace boost { 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; - enum { M = boost::detail::array_total::size }; std::size_t n1 = M * list.size(); boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1; @@ -142,21 +146,22 @@ namespace boost { template inline typename boost::detail::sp_if_size_array::type allocate_shared(const A& allocator, - std::initializer_list::type> list) { + 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; - BOOST_ASSERT(list.size() == boost::detail::array_size::size); + enum { + M = boost::detail::array_total::size, + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; - T3* p3 = 0; - enum { M = boost::detail::array_total::size }; - enum { N = boost::detail::array_total::size }; + T3* p3 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); + p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); d2 = get_deleter >(s1); d2->construct_list(p2, p3, M); diff --git a/include/boost/smart_ptr/detail/array_traits.hpp b/include/boost/smart_ptr/detail/array_traits.hpp index 3b80f46..83726b0 100644 --- a/include/boost/smart_ptr/detail/array_traits.hpp +++ b/include/boost/smart_ptr/detail/array_traits.hpp @@ -22,8 +22,7 @@ namespace boost { typedef typename array_base::type type; }; template - struct array_size { - }; + struct array_size; template struct array_size { enum { @@ -43,8 +42,7 @@ namespace boost { }; }; template - struct array_inner { - }; + struct array_inner; template struct array_inner { typedef T type; @@ -54,16 +52,11 @@ namespace boost { typedef T type; }; template - struct arrays_inner { - }; + struct arrays_inner; template struct arrays_inner { typedef T type; }; - 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 d1eeac7..52adf38 100644 --- a/include/boost/smart_ptr/make_shared_array.hpp +++ b/include/boost/smart_ptr/make_shared_array.hpp @@ -60,9 +60,11 @@ namespace boost { make_shared(Args&&... args) { typedef typename boost::detail::array_inner::type T1; typedef typename boost::detail::array_base::type T2; + enum { + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; - enum { N = boost::detail::array_total::size }; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); @@ -93,23 +95,24 @@ namespace boost { d2 = get_deleter >(s1); d2->construct_list(p2, n1, p3); return boost::shared_ptr(s1, p1); - } + } template inline typename boost::detail::sp_if_size_array::type - make_shared(std::initializer_list::type> list) { + make_shared(const T& list) { typedef typename boost::detail::array_inner::type T1; typedef typename boost::detail::array_base::type T2; typedef const T2 T3; - BOOST_ASSERT(list.size() == boost::detail::array_size::size); + enum { + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; T3* p3 = 0; - enum { N = boost::detail::array_total::size }; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); + p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); d2 = get_deleter >(s1); d2->construct_list(p2, p3); @@ -122,10 +125,12 @@ namespace boost { 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; - enum { M = boost::detail::array_total::size }; std::size_t n1 = M * size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1; @@ -139,21 +144,22 @@ namespace boost { } template inline typename boost::detail::sp_if_size_array::type - make_shared(std::initializer_list::type> list) { + make_shared(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; - BOOST_ASSERT(list.size() == boost::detail::array_size::size); + enum { + M = boost::detail::array_total::size, + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; T3* p3 = 0; - enum { M = boost::detail::array_total::size }; - enum { N = boost::detail::array_total::size }; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); boost::detail::array_deleter* d2; - p3 = reinterpret_cast(list.begin()); + p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); d2 = get_deleter >(s1); d2->construct_list(p2, p3, M); @@ -182,9 +188,11 @@ namespace boost { make_shared_noinit() { typedef typename boost::detail::array_inner::type T1; typedef typename boost::detail::array_base::type T2; + enum { + N = boost::detail::array_total::size + }; T1* p1 = 0; T2* p2 = 0; - enum { N = boost::detail::array_total::size }; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; boost::shared_ptr s1(p1, d1, a1); diff --git a/make_shared_array.html b/make_shared_array.html index 2c0d5fc..3da2caa 100644 --- a/make_shared_array.html +++ b/make_shared_array.html @@ -54,25 +54,25 @@ shared_ptr<T[]> make_shared(initializer_list<T> list); template<typename T, typename... Args> - shared_ptr<T[N]> make_shared(initializer_list<T> list); + shared_ptr<T[N]> make_shared(const T (&list)[N]); template<typename T, typename... Args> shared_ptr<T[][N]> make_shared(size_t size, initializer_list<T> list); template<typename T, typename... Args> - shared_ptr<T[M][N]> make_shared(initializer_list<T> list); + shared_ptr<T[M][N]> make_shared(const T (&list)[N]); 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, initializer_list<T> list); + 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, initializer_list<T> list); template<typename T, typename A, typename... Args> - shared_ptr<T[M][N]> allocate_shared(const A& allocator, initializer_list<T> list); + shared_ptr<T[M][N]> allocate_shared(const A& allocator, const T (&list)[N]); #endif template<typename T> @@ -141,9 +141,9 @@ template<typename T, typename A, typename... Args> from the initializer list.

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

Description: These overloads of the utilities above are for a fixed size array.

@@ -157,9 +157,9 @@ template<typename T, typename A, typename... Args> from the initializer list.

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

Description: These overloads of the utilities above are for a fixed size array.

diff --git a/test/allocate_shared_arrays_create_test.cpp b/test/allocate_shared_arrays_create_test.cpp index 03a2d7e..7764edf 100644 --- a/test/allocate_shared_arrays_create_test.cpp +++ b/test/allocate_shared_arrays_create_test.cpp @@ -11,6 +11,20 @@ int main() { #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) + { + boost::shared_ptr a1 = boost::allocate_shared(std::allocator(), {0, 1, 2, 3}); + BOOST_TEST(a1[0] == 0); + BOOST_TEST(a1[1] == 1); + BOOST_TEST(a1[2] == 2); + BOOST_TEST(a1[3] == 3); + } + { + boost::shared_ptr a1 = boost::allocate_shared(std::allocator(), {0, 1, 2, 3}); + BOOST_TEST(a1[0] == 0); + BOOST_TEST(a1[1] == 1); + BOOST_TEST(a1[2] == 2); + BOOST_TEST(a1[3] == 3); + } { boost::shared_ptr a1 = boost::allocate_shared(std::allocator(), { {0, 1}, {2, 3} }); BOOST_TEST(a1[0][0] == 0); diff --git a/test/make_shared_arrays_create_test.cpp b/test/make_shared_arrays_create_test.cpp index e468378..e999182 100644 --- a/test/make_shared_arrays_create_test.cpp +++ b/test/make_shared_arrays_create_test.cpp @@ -12,6 +12,20 @@ int main() { #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) + { + boost::shared_ptr a1 = boost::make_shared({0, 1, 2, 3}); + BOOST_TEST(a1[0] == 0); + BOOST_TEST(a1[1] == 1); + BOOST_TEST(a1[2] == 2); + BOOST_TEST(a1[3] == 3); + } + { + boost::shared_ptr a1 = boost::make_shared({0, 1, 2, 3}); + BOOST_TEST(a1[0] == 0); + BOOST_TEST(a1[1] == 1); + BOOST_TEST(a1[2] == 2); + BOOST_TEST(a1[3] == 3); + } { boost::shared_ptr a1 = boost::make_shared({ {0, 1}, {2, 3} }); BOOST_TEST(a1[0][0] == 0);