[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