$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r82676 - in sandbox/static_vector: boost/container/detail test
From: adam.wulkiewicz_at_[hidden]
Date: 2013-02-06 20:23:54
Author: awulkiew
Date: 2013-01-31 23:38:05 EST (Thu, 31 Jan 2013)
New Revision: 82676
URL: http://svn.boost.org/trac/boost/changeset/82676
Log:
Fixed compilation error when calling emplace_back() with 0 parameters
Text files modified: 
   sandbox/static_vector/boost/container/detail/static_vector_util.hpp |    27 +++++++++++++++++++++++++++             
   sandbox/static_vector/test/static_vector_test.cpp                   |    19 +++++++++++++++++++                     
   2 files changed, 46 insertions(+), 0 deletions(-)
Modified: sandbox/static_vector/boost/container/detail/static_vector_util.hpp
==============================================================================
--- sandbox/static_vector/boost/container/detail/static_vector_util.hpp	(original)
+++ sandbox/static_vector/boost/container/detail/static_vector_util.hpp	2013-01-31 23:38:05 EST (Thu, 31 Jan 2013)
@@ -562,6 +562,33 @@
 
 #else // !BOOST_NO_VARIADIC_TEMPLATES
 
+// construct(I)
+
+template <typename I>
+inline
+void construct_dispatch(I pos,
+                        ::boost::mpl::bool_<true> const& /*empty_constr*/)
+{}
+
+template <typename I>
+inline
+void construct_dispatch(I pos,
+                        ::boost::mpl::bool_<false> const& /*empty_constr*/)
+{
+    typedef typename ::boost::iterator_value<I>::type V;
+    new (static_cast<void*>(::boost::addressof(*pos))) V();                      // may throw
+}
+
+template <typename I>
+inline
+void construct(I pos)
+{
+    typedef typename ::boost::iterator_value<I>::type V;
+    typedef typename ::boost::has_trivial_constructor<V>::type empty_constr;
+
+    construct_dispatch(pos, empty_constr());                                   // may throw
+}
+
 // BOOST_NO_RVALUE_REFERENCES -> P0 const& p0
 // !BOOST_NO_RVALUE_REFERENCES -> P0 && p0
 // which means that version with one parameter may take V const& v
Modified: sandbox/static_vector/test/static_vector_test.cpp
==============================================================================
--- sandbox/static_vector/test/static_vector_test.cpp	(original)
+++ sandbox/static_vector/test/static_vector_test.cpp	2013-01-31 23:38:05 EST (Thu, 31 Jan 2013)
@@ -583,6 +583,22 @@
 }
 
 template <typename T, size_t N>
+void test_emplace_0p()
+{
+    //emplace_back()
+    {
+        static_vector<T, N, bad_alloc_strategy<T> > v;
+
+        for (int i = 0 ; i < int(N) ; ++i )
+            v.emplace_back();
+        BOOST_CHECK(v.size() == N);
+#ifndef BOOST_NO_EXCEPTIONS
+        BOOST_CHECK_THROW(v.emplace_back(), std::bad_alloc);
+#endif
+    }
+}
+
+template <typename T, size_t N>
 void test_emplace_2p()
 {
     //emplace_back(pos, int, int)
@@ -746,6 +762,9 @@
     test_swap_and_move_nd<shptr_value, 10>();
     test_swap_and_move_nd<copy_movable, 10>();
 
+    test_emplace_0p<counting_value, 10>();
+    BOOST_CHECK(counting_value::count() == 0);
+
     test_emplace_2p<counting_value, 10>();
     BOOST_CHECK(counting_value::count() == 0);