$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r82064 - sandbox/static_vector/boost/container
From: adam.wulkiewicz_at_[hidden]
Date: 2012-12-17 23:01:56
Author: awulkiew
Date: 2012-12-17 23:01:56 EST (Mon, 17 Dec 2012)
New Revision: 82064
URL: http://svn.boost.org/trac/boost/changeset/82064
Log:
implemented nonthrowing version of static_vector::swap()
Text files modified: 
   sandbox/static_vector/boost/container/static_vector.hpp |    55 +++++++++++++++++++++++---------------- 
   1 files changed, 32 insertions(+), 23 deletions(-)
Modified: sandbox/static_vector/boost/container/static_vector.hpp
==============================================================================
--- sandbox/static_vector/boost/container/static_vector.hpp	(original)
+++ sandbox/static_vector/boost/container/static_vector.hpp	2012-12-17 23:01:56 EST (Mon, 17 Dec 2012)
@@ -122,6 +122,10 @@
 template <typename Value, std::size_t Capacity, typename StoredSizeType = std::size_t>
 class static_vector
 {
+    typedef boost::aligned_storage<
+        sizeof(Value[Capacity]),
+        boost::alignment_of<Value[Capacity]>::value
+    > aligned_storage_type;
     typedef detail::static_vector::error_handling errh;
 
 public:
@@ -205,28 +209,36 @@
         this->destroy(this->begin(), this->end());
     }
 
-    // basic
+    // nothrow
     void swap(static_vector & other)
     {
-        iterator it = this->begin();
-        iterator other_it = other.begin();
+//        iterator it = this->begin();
+//        iterator other_it = other.begin();
 
-        if ( this->size() < other.size() )
-        {
-            for (; it != this->end() ; ++it, ++other_it)
-                boost::swap(*it, *other_it);                                         // may throw
-            this->uninitialized_copy(other_it, other.end(), it);                     // may throw
-            this->destroy(other_it, other.end());
-            boost::swap(m_size, other.m_size);
-        }
-        else
-        {
-            for (; other_it != other.end() ; ++it, ++other_it)
-                boost::swap(*it, *other_it);                                         // may throw
-            this->uninitialized_copy(it, this->end(), other_it);                     // may throw
-            this->destroy(it, this->end());
-            boost::swap(m_size, other.m_size);
-        };
+//        if ( this->size() < other.size() )
+//        {
+//            for (; it != this->end() ; ++it, ++other_it)
+//                boost::swap(*it, *other_it);                                         // may throw
+//            this->uninitialized_copy(other_it, other.end(), it);                     // may throw
+//            this->destroy(other_it, other.end());
+//            boost::swap(m_size, other.m_size);
+//        }
+//        else
+//        {
+//            for (; other_it != other.end() ; ++it, ++other_it)
+//                boost::swap(*it, *other_it);                                         // may throw
+//            this->uninitialized_copy(it, this->end(), other_it);                     // may throw
+//            this->destroy(it, this->end());
+//            boost::swap(m_size, other.m_size);
+//        };
+
+        // TODO - this may be too big for stack
+        aligned_storage_type temp;
+        Value * temp_ptr = reinterpret_cast<Value*>(temp.address());
+        ::memcpy(temp_ptr, this->data(), sizeof(Value) * this->size());
+        ::memcpy(this->data(), other.data(), sizeof(Value) * other.size());
+        ::memcpy(other.data(), temp_ptr, sizeof(Value) * this->size());
+        boost::swap(m_size, other.m_size);
     }
 
     // basic
@@ -906,10 +918,7 @@
         return (reinterpret_cast<const Value*>(m_storage.address()));
     }
 
-    boost::aligned_storage<
-        sizeof(Value[Capacity]),
-        boost::alignment_of<Value[Capacity]>::value
-    > m_storage;
+    aligned_storage_type m_storage;
     StoredSizeType m_size;
 };