$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r81978 - in sandbox-branches/geometry/index: boost/geometry/extensions/index test
From: adam.wulkiewicz_at_[hidden]
Date: 2012-12-15 15:07:20
Author: awulkiew
Date: 2012-12-15 15:07:19 EST (Sat, 15 Dec 2012)
New Revision: 81978
URL: http://svn.boost.org/trac/boost/changeset/81978
Log:
Added static_vector::assign(count, value) + test.
Added static_vector iterators test.
Text files modified: 
   sandbox-branches/geometry/index/boost/geometry/extensions/index/static_vector.hpp |    67 ++++++++++++++++++++++++--------------- 
   sandbox-branches/geometry/index/test/static_vector.cpp                            |    66 +++++++++++++++++++++++++++++---------  
   2 files changed, 91 insertions(+), 42 deletions(-)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/static_vector.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/static_vector.hpp	(original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/static_vector.hpp	2012-12-15 15:07:19 EST (Sat, 15 Dec 2012)
@@ -58,18 +58,17 @@
     {}
 
     // strong
-    explicit static_vector(size_type s)
+    explicit static_vector(size_type count)
         : m_size(0)
     {
-        resize(s);                                                                  // may throw
+        resize(count);                                                              // may throw
     }
 
     // strong
-    //template <typename Value>
-    static_vector(size_type s, value_type const& value)
+    static_vector(size_type count, value_type const& value)
         : m_size(0)
     {
-        resize(s, value);                                                           // may throw
+        resize(count, value);                                                       // may throw
     }
 
     // strong
@@ -105,47 +104,45 @@
     }
 
     // strong
-    void resize(size_type s)
+    void resize(size_type count)
     {
-        if ( s < m_size )
+        if ( count < m_size )
         {
-            this->destroy(this->begin() + s, this->end());
+            this->destroy(this->begin() + count, this->end());
         }
         else
         {
-            BOOST_ASSERT_MSG(s <= Capacity, "size can't exceed the capacity");
-            //if ( Capacity <= s ) throw std::bad_alloc();
-            this->construct(this->ptr(m_size), this->ptr(s));                       // may throw
+            BOOST_ASSERT_MSG(count <= Capacity, "size can't exceed the capacity");
+            //if ( Capacity <= count ) throw std::bad_alloc();
+            this->construct(this->ptr(m_size), this->ptr(count));                    // may throw
         }
-        m_size = s; // update end
+        m_size = count; // update end
     }
 
     // strong
-    //template <typename Value>
-    void resize(size_type s, value_type const& value)
+    void resize(size_type count, value_type const& value)
     {
-        if ( s < m_size )
+        if ( count < m_size )
         {
-            this->destroy(this->begin() + s, this->end());
+            this->destroy(this->begin() + count, this->end());
         }
         else
         {
-            BOOST_ASSERT_MSG(s <= Capacity, "size can't exceed the capacity");
-            //if ( Capacity <= s ) throw std::bad_alloc();
-            std::uninitialized_fill(this->ptr(m_size), this->ptr(s), value);        // may throw
+            BOOST_ASSERT_MSG(count <= Capacity, "size can't exceed the capacity");
+            //if ( Capacity <= count ) throw std::bad_alloc();
+            std::uninitialized_fill(this->ptr(m_size), this->ptr(count), value);     // may throw
         }
-        m_size = s; // update end
+        m_size = count; // update end
     }
 
     // nothrow
-    void reserve(size_type BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(s))
+    void reserve(size_type BOOST_GEOMETRY_INDEX_ASSERT_UNUSED_PARAM(count))
     {
-        BOOST_ASSERT_MSG(s <= Capacity, "size can't exceed the capacity");
-        //if ( Capacity <= s ) throw std::bad_alloc();
+        BOOST_ASSERT_MSG(count <= Capacity, "size can't exceed the capacity");
+        //if ( Capacity <= count ) throw std::bad_alloc();
     }
 
     // strong
-    //template <typename Value>
     void push_back(value_type const& value)
     {
         BOOST_ASSERT_MSG(m_size < Capacity, "size can't exceed the capacity");
@@ -170,6 +167,24 @@
         assign_dispatch(first, last, traversal());                                  // may throw
     }
 
+    // basic
+    void assign(size_type count, value_type const& value)
+    {
+        if ( count < m_size )
+        {
+            std::fill_n(this->begin(), count, value);
+            this->destroy(this->begin() + count, this->end());
+        }
+        else
+        {
+            std::fill_n(this->begin(), m_size, value);
+            BOOST_ASSERT_MSG(count <= Capacity, "size can't exceed the capacity");
+            //if ( Capacity <= count ) throw std::bad_alloc();
+            std::uninitialized_fill(this->ptr(m_size), this->ptr(count), value);     // may throw
+        }
+        m_size = count; // update end
+    }
+
     // nothrow
     void clear()
     {
@@ -236,8 +251,8 @@
     }
 
     // nothrow
-    Value * data() { return this->ptr(0); }
-    const Value * data() const { return this->ptr(0); }
+    Value * data() { return this->ptr(); }
+    const Value * data() const { return this->ptr(); }
 
     // nothrow
     iterator begin() { return this->ptr(); }
Modified: sandbox-branches/geometry/index/test/static_vector.cpp
==============================================================================
--- sandbox-branches/geometry/index/test/static_vector.cpp	(original)
+++ sandbox-branches/geometry/index/test/static_vector.cpp	2012-12-15 15:07:19 EST (Sat, 15 Dec 2012)
@@ -17,7 +17,7 @@
 class value_ndc
 {
 public:
-    value_ndc(int a) : aa(a) {}
+    explicit value_ndc(int a) : aa(a) {}
     ~value_ndc() {}
     bool operator==(value_ndc const& v) const { return aa == v.aa; }
 private:
@@ -29,7 +29,7 @@
 class value_nd
 {
 public:
-    value_nd(int a) : aa(a) {}
+    explicit value_nd(int a) : aa(a) {}
     ~value_nd() {}
     bool operator==(value_nd const& v) const { return aa == v.aa; }
 private:
@@ -39,7 +39,7 @@
 class value_nc
 {
 public:
-    value_nc(int a = 0) : aa(a) {}
+    explicit value_nc(int a = 0) : aa(a) {}
     ~value_nc() {}
     bool operator==(value_nc const& v) const { return aa == v.aa; }
 private:
@@ -51,7 +51,7 @@
 class counting_value
 {
 public:
-    counting_value(int a = 0) : aa(a) { ++c(); }
+    explicit counting_value(int a = 0) : aa(a) { ++c(); }
     counting_value(counting_value const& v) : aa(v.aa) { ++c(); }
     counting_value & operator=(counting_value const& v) { aa = v.aa; return *this; }
     ~counting_value() { --c(); }
@@ -181,7 +181,7 @@
     static_vector<T, N> s;
 
     for ( size_t i = 0 ; i < N ; ++i )
-        s.push_back(i);    
+        s.push_back(T(i));    
 
     for ( size_t i = N ; i > 1 ; --i )
     {
@@ -204,7 +204,7 @@
 }
 
 template <typename T, size_t N>
-void test_copy_and_assign_nd()
+void test_copy_and_assign_nd(T const& val)
 {
     static_vector<T, N> s;
     std::vector<T> v;
@@ -212,9 +212,9 @@
 
     for ( size_t i = 0 ; i < N ; ++i )
     {
-        s.push_back(i);
-        v.push_back(i);
-        l.push_back(i);
+        s.push_back(T(i));
+        v.push_back(T(i));
+        l.push_back(T(i));
     }
     // copy ctor
     {
@@ -268,6 +268,35 @@
         BOOST_CHECK(l.size() == s1.size());
         test_compare_ranges(l.begin(), l.end(), s1.begin(), s1.end());
     }
+    // assign(N, V)
+    {
+        static_vector<T, N> s1(s);
+        test_compare_ranges(s.begin(), s.end(), s1.begin(), s1.end());
+        std::vector<T> a(N, val);
+        s1.assign(N, val);
+        test_compare_ranges(a.begin(), a.end(), s1.begin(), s1.end());
+    }
+}
+
+template <typename T, size_t N>
+void test_iterators_nd()
+{
+    static_vector<T, N> s;
+    std::vector<T> v;
+
+    for ( size_t i = 0 ; i < N ; ++i )
+    {
+        s.push_back(T(i));
+        v.push_back(T(i));
+    }
+
+    test_compare_ranges(s.begin(), s.end(), v.begin(), v.end());
+    test_compare_ranges(s.rbegin(), s.rend(), v.rbegin(), v.rend());
+
+    s.assign(v.rbegin(), v.rend());
+
+    test_compare_ranges(s.begin(), s.end(), v.rbegin(), v.rend());
+    test_compare_ranges(s.rbegin(), s.rend(), v.begin(), v.end());
 }
 
 int test_main(int, char* [])
@@ -285,8 +314,8 @@
     BOOST_CHECK(counting_value::count() == 0);
 
     test_ctor_nd<int, 10>(5, 1);
-    test_ctor_nd<value_nd, 10>(5, 1);
-    test_ctor_nd<counting_value, 10>(5, 1);
+    test_ctor_nd<value_nd, 10>(5, value_nd(1));
+    test_ctor_nd<counting_value, 10>(5, counting_value(1));
     BOOST_CHECK(counting_value::count() == 0);
 
     test_resize_nc<int, 10>(5);
@@ -295,8 +324,8 @@
     BOOST_CHECK(counting_value::count() == 0);
 
     test_resize_nd<int, 10>(5, 1);
-    test_resize_nd<value_nd, 10>(5, 1);
-    test_resize_nd<counting_value, 10>(5, 1);
+    test_resize_nd<value_nd, 10>(5, value_nd(1));
+    test_resize_nd<counting_value, 10>(5, counting_value(1));
     BOOST_CHECK(counting_value::count() == 0);
 
     test_push_back_nd<int, 10>();
@@ -309,9 +338,14 @@
     test_pop_back_nd<counting_value, 10>();
     BOOST_CHECK(counting_value::count() == 0);
 
-    test_copy_and_assign_nd<int, 10>();
-    test_copy_and_assign_nd<value_nd, 10>();
-    test_copy_and_assign_nd<counting_value, 10>();
+    test_copy_and_assign_nd<int, 10>(1);
+    test_copy_and_assign_nd<value_nd, 10>(value_nd(1));
+    test_copy_and_assign_nd<counting_value, 10>(counting_value(1));
+    BOOST_CHECK(counting_value::count() == 0);
+
+    test_iterators_nd<int, 10>();
+    test_iterators_nd<value_nd, 10>();
+    test_iterators_nd<counting_value, 10>();
     BOOST_CHECK(counting_value::count() == 0);
 
     return 0;