[PPL-devel] [GIT] ppl/ppl(master): Dense_Row: improve exception safety in constructors.

Marco Poletti poletti.marco at gmail.com
Mon Dec 27 17:05:13 CET 2010


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

Author: Marco Poletti <poletti.marco at gmail.com>
Date:   Mon Dec 27 17:05:58 2010 +0100

Dense_Row: improve exception safety in constructors.

---

 src/Dense_Row.cc         |   12 +++++--
 src/Dense_Row.inlines.hh |   88 ++++++++++++++++++++++++++++++++-------------
 2 files changed, 71 insertions(+), 29 deletions(-)

diff --git a/src/Dense_Row.cc b/src/Dense_Row.cc
index 40dcdcb..826d176 100644
--- a/src/Dense_Row.cc
+++ b/src/Dense_Row.cc
@@ -151,15 +151,21 @@ PPL::Dense_Row::shrink(dimension_type new_size) {
   PPL_ASSERT(OK());
 }
 
-PPL::Dense_Row::Dense_Row(const Sparse_Row& row) {
-  init(row);
+PPL::Dense_Row::Dense_Row(const Sparse_Row& row)
+  : size_(0), capacity_(0), flags_(), vec_(0) {
+  try {
+    init(row);
+  } catch (...) {
+    PPL_ASSERT(OK());
+    destroy();
+    throw;
+  }
   PPL_ASSERT(size() == row.size());
   PPL_ASSERT(OK());
 }
 
 void
 PPL::Dense_Row::init(const Sparse_Row& row) {
-  size_ = 0;
   capacity_ = row.size();
   flags_ = row.flags();
   vec_ = static_cast<Coefficient*>(
diff --git a/src/Dense_Row.inlines.hh b/src/Dense_Row.inlines.hh
index 284e9ae..859ec84 100644
--- a/src/Dense_Row.inlines.hh
+++ b/src/Dense_Row.inlines.hh
@@ -78,7 +78,13 @@ Dense_Row::Dense_Row(const dimension_type sz,
                      const dimension_type capacity,
                      const Flags f)
   : size_(0), capacity_(0), flags_(f), vec_(0) {
-  resize(sz, capacity);
+  try {
+    resize(sz, capacity);
+  } catch (...) {
+    PPL_ASSERT(OK());
+    destroy();
+    throw;
+  }
   PPL_ASSERT(size() == sz);
   PPL_ASSERT(capacity_ = capacity);
   PPL_ASSERT(OK());
@@ -87,7 +93,13 @@ Dense_Row::Dense_Row(const dimension_type sz,
 inline
 Dense_Row::Dense_Row(const dimension_type sz, const Flags f)
   : size_(0), capacity_(0), flags_(f), vec_(0) {
-  resize(sz);
+  try {
+    resize(sz);
+  } catch (...) {
+    PPL_ASSERT(OK());
+    destroy();
+    throw;
+  }
   PPL_ASSERT(size() == sz);
   PPL_ASSERT(OK());
 }
@@ -96,12 +108,18 @@ inline
 Dense_Row::Dense_Row(const Dense_Row& y)
   : size_(0), capacity_(0), flags_(y.flags()), vec_(0) {
   if (y.vec_ != 0) {
-    capacity_ = y.capacity();
-    vec_ = static_cast<Coefficient*>(
-        operator new(sizeof(Coefficient) * capacity_));
-    while (size_ != y.size()) {
-      new (&vec_[size_]) Coefficient(y[size_]);
-      ++size_;
+    try {
+      capacity_ = y.capacity();
+      vec_ = static_cast<Coefficient*>(
+          operator new(sizeof(Coefficient) * capacity_));
+      while (size_ != y.size()) {
+        new (&vec_[size_]) Coefficient(y[size_]);
+        ++size_;
+      }
+    } catch (...) {
+      PPL_ASSERT(OK());
+      destroy();
+      throw;
     }
   }
   PPL_ASSERT(size() == y.size());
@@ -115,17 +133,26 @@ Dense_Row::Dense_Row(const Dense_Row& y,
   : size_(0), capacity_(0), flags_(y.flags()), vec_(0) {
   PPL_ASSERT(y.size() <= capacity);
   PPL_ASSERT(capacity <= max_size());
+  
+  try {
 
-  vec_ = static_cast<Coefficient*>(
-      operator new(sizeof(Coefficient) * capacity));
-  capacity_ = capacity;
-
-  if (y.vec_ != 0) {
-    while (size_ != y.size()) {
-      new (&vec_[size_]) Coefficient(y[size_]);
-      ++size_;
+    vec_ = static_cast<Coefficient*>(
+        operator new(sizeof(Coefficient) * capacity));
+    capacity_ = capacity;
+
+    if (y.vec_ != 0) {
+      while (size_ != y.size()) {
+        new (&vec_[size_]) Coefficient(y[size_]);
+        ++size_;
+      }
     }
+    
+  } catch (...) {
+    PPL_ASSERT(OK());
+    destroy();
+    throw;
   }
+  
   PPL_ASSERT(size() == y.size());
   PPL_ASSERT(capacity_ = capacity);
   PPL_ASSERT(OK());
@@ -141,18 +168,27 @@ Dense_Row::Dense_Row(const Dense_Row& y,
   PPL_ASSERT(capacity <= max_size());
   PPL_ASSERT(capacity != 0);
   
-  vec_ = static_cast<Coefficient*>(operator new(sizeof(Coefficient) * capacity));
-  capacity_ = capacity;
+  try {
   
-  dimension_type n = std::min(sz, y.size());
-  while (size_ != n) {
-    new (&vec_[size_]) Coefficient(y[size_]);
-    ++size_;
-  }
-  while (size_ != sz) {
-    new (&vec_[size_]) Coefficient();
-    ++size_;
+    vec_ = static_cast<Coefficient*>(operator new(sizeof(Coefficient) * capacity));
+    capacity_ = capacity;
+    
+    dimension_type n = std::min(sz, y.size());
+    while (size_ != n) {
+      new (&vec_[size_]) Coefficient(y[size_]);
+      ++size_;
+    }
+    while (size_ != sz) {
+      new (&vec_[size_]) Coefficient();
+      ++size_;
+    }
+    
+  } catch (...) {
+    PPL_ASSERT(OK());
+    destroy();
+    throw;
   }
+  
   PPL_ASSERT(size() == sz);
   PPL_ASSERT(capacity_ = capacity);
   PPL_ASSERT(OK());




More information about the PPL-devel mailing list