[PPL-devel] [GIT] ppl/ppl(master): For naming consistency, `coefficient_allocator' renamed as `data_allocator'.

Enea Zaffanella zaffanella at cs.unipr.it
Mon Feb 13 16:09:43 CET 2012


Module: ppl/ppl
Branch: master
Commit: b6bcf0a3f859871de9fb397308bb705a11440e38
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=b6bcf0a3f859871de9fb397308bb705a11440e38

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Mon Feb 13 14:49:04 2012 +0100

For naming consistency, `coefficient_allocator' renamed as `data_allocator'.
Explicitly include <memory> for std::allocator.
Fixed deallocation bugs in CO_Tree::rebuild_bigger_tree():
  - use delete[] for `indexes';
  - use data_allocator.deallocayte for `data'.
On copy construction, assignment and swap, do also copy/assign/swap
the allocator.

---

 src/CO_Tree.cc         |   17 ++++++++---------
 src/CO_Tree.defs.hh    |   10 ++++++----
 src/CO_Tree.inlines.hh |   16 +++++-----------
 3 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/src/CO_Tree.cc b/src/CO_Tree.cc
index 68f9fe0..fc79a0b 100644
--- a/src/CO_Tree.cc
+++ b/src/CO_Tree.cc
@@ -521,9 +521,9 @@ PPL::CO_Tree::init(dimension_type reserved_size1) {
     reserved_size = ((dimension_type)1 << max_depth) - 1;
     indexes = new dimension_type[reserved_size + 2];
     try {
-      data = coefficient_allocator.allocate(reserved_size + 1);
+      data = data_allocator.allocate(reserved_size + 1);
     } catch (...) {
-      delete [] indexes;
+      delete[] indexes;
       throw;
     }
     // Mark all pairs as unused.
@@ -549,8 +549,8 @@ PPL::CO_Tree::destroy() {
         data[i].~data_type();
     }
 
-    delete [] indexes;
-    coefficient_allocator.deallocate(data, reserved_size + 1);
+    delete[] indexes;
+    data_allocator.deallocate(data, reserved_size + 1);
   }
 }
 
@@ -704,9 +704,9 @@ PPL::CO_Tree::rebuild_bigger_tree() {
   data_type* new_data;
 
   try {
-    new_data = coefficient_allocator.allocate(new_reserved_size + 1);
+    new_data = data_allocator.allocate(new_reserved_size + 1);
   } catch (...) {
-    delete new_indexes;
+    delete[] new_indexes;
     throw;
   }
 
@@ -724,8 +724,8 @@ PPL::CO_Tree::rebuild_bigger_tree() {
   new_indexes[0] = 0;
   new_indexes[new_reserved_size + 1] = 0;
 
-  delete [] indexes;
-  operator delete(data);
+  delete[] indexes;
+  data_allocator.deallocate(data, reserved_size + 1);
 
   indexes = new_indexes;
   data = new_data;
@@ -1089,7 +1089,6 @@ PPL::CO_Tree::move_data_from(CO_Tree& tree) {
 
 void
 PPL::CO_Tree::copy_data_from(const CO_Tree& x) {
-
   PPL_ASSERT(size_ == 0);
   PPL_ASSERT(reserved_size == x.reserved_size);
   PPL_ASSERT(structure_OK());
diff --git a/src/CO_Tree.defs.hh b/src/CO_Tree.defs.hh
index 2c8a5ca..4254796 100644
--- a/src/CO_Tree.defs.hh
+++ b/src/CO_Tree.defs.hh
@@ -27,6 +27,7 @@ site: http://bugseng.com/products/ppl/ . */
 #include "CO_Tree.types.hh"
 
 #include "Coefficient.defs.hh"
+#include <memory>
 
 #ifndef PPL_CO_TREE_EXTRA_DEBUG
 #ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
@@ -1012,8 +1013,8 @@ private:
 
   //! Compares the fractions numer/denom with ratio/100.
   /*!
-    \returns
-    Returns true if the fraction numer/denom is less than the fraction ratio/100.
+    \returns Returns true if the fraction numer/denom is less
+    than the fraction ratio/100.
 
     \param ratio
     It must be less than or equal to 100.
@@ -1279,6 +1280,9 @@ private:
   */
   dimension_type* indexes;
 
+  //! The allocator used to allocate/deallocate data.
+  std::allocator<data_type> data_allocator;
+
   //! The vector that contains the data of the keys in the tree.
   /*!
     If index[i] is \p unused_index, data[i] is unused.
@@ -1299,8 +1303,6 @@ private:
 
   //! The number of values stored in the tree.
   dimension_type size_;
-
-  std::allocator<Coefficient> coefficient_allocator;
 };
 
 class CO_Tree::tree_iterator {
diff --git a/src/CO_Tree.inlines.hh b/src/CO_Tree.inlines.hh
index 546817b..50a03e7 100644
--- a/src/CO_Tree.inlines.hh
+++ b/src/CO_Tree.inlines.hh
@@ -46,33 +46,26 @@ CO_Tree::dfs_index(iterator itr) const {
 
 inline
 CO_Tree::CO_Tree() {
-
   init(0);
-
   PPL_ASSERT(OK());
 }
 
 inline
 CO_Tree::CO_Tree(const CO_Tree& x) {
-
   PPL_ASSERT(x.OK());
-
+  data_allocator = x.data_allocator;
   init(x.reserved_size);
-
   copy_data_from(x);
 }
 
 inline CO_Tree&
 CO_Tree::operator=(const CO_Tree& x) {
-
   if (this != &x) {
-
     destroy();
+    data_allocator = x.data_allocator;
     init(x.reserved_size);
-
     copy_data_from(x);
   }
-
   return *this;
 }
 
@@ -178,11 +171,12 @@ CO_Tree::m_swap(CO_Tree& x) {
   using std::swap;
   swap(max_depth, x.max_depth);
   swap(indexes, x.indexes);
+  swap(data_allocator, x.data_allocator);
   swap(data, x.data);
   swap(reserved_size, x.reserved_size);
   swap(size_, x.size_);
-  // Cached iterators have been invalidated by the swap, they must be
-  // refreshed here.
+  // Cached iterators have been invalidated by the swap,
+  // they must be refreshed here.
   refresh_cached_iterators();
   x.refresh_cached_iterators();
   PPL_ASSERT(structure_OK());




More information about the PPL-devel mailing list