[PPL-devel] [GIT] ppl/ppl(master): Avoid pointer casts when allocating coefficients in Dense_Row::Impl.

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


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

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

Avoid pointer casts when allocating coefficients in Dense_Row::Impl.
Detected by ECLAIR service M++.5-2-8.

We now use a std::allocator object (similar to what done in CO_Tree).

---

 src/Dense_Row.cc         |   22 ++++++++--------------
 src/Dense_Row.defs.hh    |    4 ++++
 src/Dense_Row.inlines.hh |   23 +++++++++++------------
 3 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/src/Dense_Row.cc b/src/Dense_Row.cc
index 057e61b..031a57e 100644
--- a/src/Dense_Row.cc
+++ b/src/Dense_Row.cc
@@ -40,14 +40,12 @@ PPL::Dense_Row::resize(dimension_type new_size) {
       // Reallocation is required.
       // TODO: Consider using realloc() here.
       // TODO: Consider using a smarter allocation strategy.
-      dimension_type new_capacity = new_size;
-      Coefficient* new_vec = static_cast<Coefficient*>(
-          operator new(sizeof(Coefficient) * new_capacity));
+      const dimension_type new_capacity = new_size;
+      Coefficient* new_vec = impl.coeff_allocator.allocate(new_capacity);
 
       if (impl.vec != 0) {
         memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
-
-        operator delete(impl.vec);
+        impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
       }
 
       impl.vec = new_vec;
@@ -87,27 +85,24 @@ PPL::Dense_Row::resize(dimension_type new_size, dimension_type new_capacity) {
 
     PPL_ASSERT(impl.size == new_size);
 
-    Coefficient* new_vec = static_cast<Coefficient*>(
-        operator new(sizeof(Coefficient) * new_capacity));
+    Coefficient* new_vec = impl.coeff_allocator.allocate(new_capacity);
 
     PPL_ASSERT(impl.vec != 0);
 
     memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
 
-    operator delete(impl.vec);
+    impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
 
     impl.vec = new_vec;
     impl.capacity = new_capacity;
   } else {
     if (new_capacity > capacity()) {
 
-      Coefficient* new_vec = static_cast<Coefficient*>(
-          operator new(sizeof(Coefficient) * new_capacity));
+      Coefficient* new_vec = impl.coeff_allocator.allocate(new_capacity);
 
       if (impl.vec != 0) {
         memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
-
-        operator delete(impl.vec);
+        impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
       }
 
       impl.vec = new_vec;
@@ -163,8 +158,7 @@ void
 PPL::Dense_Row::init(const Sparse_Row& row) {
   impl.capacity = row.size();
   impl.flags = row.flags();
-  impl.vec = static_cast<Coefficient*>(
-      operator new(sizeof(Coefficient) * impl.capacity));
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
   Sparse_Row::const_iterator itr = row.begin();
   Sparse_Row::const_iterator itr_end = row.end();
   while (impl.size != impl.capacity) {
diff --git a/src/Dense_Row.defs.hh b/src/Dense_Row.defs.hh
index ea3d5ff..0bcbd50 100644
--- a/src/Dense_Row.defs.hh
+++ b/src/Dense_Row.defs.hh
@@ -31,6 +31,7 @@ site: http://bugseng.com/products/ppl/ . */
 #include "Sparse_Row.types.hh"
 #include "Row_Flags.defs.hh"
 #include "Coefficient.defs.hh"
+#include <memory>
 #include <vector>
 #include <limits>
 
@@ -393,6 +394,9 @@ private:
     //! The flags of this row.
     Row_Flags flags;
 
+    //! The allocator used to allocate/deallocate vec.
+    std::allocator<Coefficient> coeff_allocator;
+
     //! The vector of coefficients.
     //! An empty vector may be stored as NULL instead of using a valid pointer.
     Coefficient* vec;
diff --git a/src/Dense_Row.inlines.hh b/src/Dense_Row.inlines.hh
index ba5c037..00d78d2 100644
--- a/src/Dense_Row.inlines.hh
+++ b/src/Dense_Row.inlines.hh
@@ -37,7 +37,7 @@ namespace Parma_Polyhedra_Library {
 
 inline
 Dense_Row::Impl::Impl()
-  : size(0), capacity(0), flags(), vec(0) {
+  : size(0), capacity(0), flags(), coeff_allocator(), vec(0) {
 }
 
 inline
@@ -46,7 +46,7 @@ Dense_Row::Impl::~Impl() {
     --size;
     vec[size].~Coefficient();
   }
-  operator delete(vec);
+  coeff_allocator.deallocate(vec, capacity);
 }
 
 inline dimension_type
@@ -120,11 +120,11 @@ Dense_Row::Dense_Row(const Dense_Row& y)
   : impl() {
 
   impl.flags = y.flags();
+  impl.coeff_allocator = y.impl.coeff_allocator;
 
   if (y.impl.vec != 0) {
     impl.capacity = y.capacity();
-    impl.vec = static_cast<Coefficient*>(
-        operator new(sizeof(Coefficient) * impl.capacity));
+    impl.vec = impl.coeff_allocator.allocate(impl.capacity);
     while (impl.size != y.size()) {
       new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
       ++impl.size;
@@ -143,10 +143,9 @@ Dense_Row::Dense_Row(const Dense_Row& y,
   PPL_ASSERT(capacity <= max_size());
 
   impl.flags = y.flags();
-
-  impl.vec = static_cast<Coefficient*>(
-      operator new(sizeof(Coefficient) * capacity));
   impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
 
   if (y.impl.vec != 0) {
     while (impl.size != y.size()) {
@@ -171,12 +170,11 @@ Dense_Row::Dense_Row(const Dense_Row& y,
   PPL_ASSERT(capacity != 0);
 
   impl.flags = y.flags();
-
-  impl.vec = static_cast<Coefficient*>(
-      operator new(sizeof(Coefficient) * capacity));
   impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
 
-  dimension_type n = std::min(sz, y.size());
+  const dimension_type n = std::min(sz, y.size());
   while (impl.size != n) {
     new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
     ++impl.size;
@@ -199,7 +197,7 @@ Dense_Row::~Dense_Row() {
 inline void
 Dense_Row::destroy() {
   resize(0);
-  operator delete(impl.vec);
+  impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
 }
 
 inline void
@@ -208,6 +206,7 @@ Dense_Row::m_swap(Dense_Row& y) {
   swap(impl.size, y.impl.size);
   swap(impl.capacity, y.impl.capacity);
   swap(impl.flags, y.impl.flags);
+  swap(impl.coeff_allocator, y.impl.coeff_allocator);
   swap(impl.vec, y.impl.vec);
   PPL_ASSERT(OK());
   PPL_ASSERT(y.OK());




More information about the PPL-devel mailing list