[Lemon-commits] [lemon_svn] deba: r2916 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 21:51:14 CET 2006
Author: deba
Date: Mon Sep 4 13:09:59 2006
New Revision: 2916
Modified:
hugo/trunk/lemon/edge_set.h
Log:
Proper exception handling in the SmartEdgeSet
Modified: hugo/trunk/lemon/edge_set.h
==============================================================================
--- hugo/trunk/lemon/edge_set.h (original)
+++ hugo/trunk/lemon/edge_set.h Mon Sep 4 13:09:59 2006
@@ -602,7 +602,7 @@
Parent::OutEdgeIt(*this, node) == INVALID) {
return;
}
- throw UnsupportedOperation();
+ throw typename NodesImplBase::Notifier::ImmediateDetach();
}
void clearNodes() {
@@ -621,14 +621,22 @@
protected:
virtual void erase(const Node& node) {
- _edgeset.eraseNode(node);
- Parent::erase(node);
+ try {
+ _edgeset.eraseNode(node);
+ Parent::erase(node);
+ } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
+ Parent::clear();
+ }
}
virtual void erase(const std::vector<Node>& nodes) {
- for (int i = 0; i < (int)nodes.size(); ++i) {
- _edgeset.eraseNode(nodes[i]);
+ try {
+ for (int i = 0; i < (int)nodes.size(); ++i) {
+ _edgeset.eraseNode(nodes[i]);
+ }
+ Parent::erase(nodes);
+ } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
+ Parent::clear();
}
- Parent::erase(nodes);
}
virtual void clear() {
_edgeset.clearNodes();
@@ -681,13 +689,6 @@
typedef _Graph Graph;
- class UnsupportedOperation : public LogicError {
- public:
- virtual const char* what() const throw() {
- return "lemon::SmartUEdgeSet::UnsupportedOperation";
- }
- };
-
protected:
typedef typename Parent::NodesImplBase NodesImplBase;
@@ -696,7 +697,7 @@
if (typename Parent::IncEdgeIt(*this, node) == INVALID) {
return;
}
- throw UnsupportedOperation();
+ throw typename NodesImplBase::Notifier::ImmediateDetach();
}
void clearNodes() {
@@ -715,14 +716,22 @@
protected:
virtual void erase(const Node& node) {
- _edgeset.eraseNode(node);
- Parent::erase(node);
+ try {
+ _edgeset.eraseNode(node);
+ Parent::erase(node);
+ } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
+ Parent::clear();
+ }
}
virtual void erase(const std::vector<Node>& nodes) {
- for (int i = 0; i < (int)nodes.size(); ++i) {
- _edgeset.eraseNode(nodes[i]);
- }
- Parent::erase(nodes);
+ try {
+ for (int i = 0; i < (int)nodes.size(); ++i) {
+ _edgeset.eraseNode(nodes[i]);
+ }
+ Parent::erase(nodes);
+ } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
+ Parent::clear();
+ }
}
virtual void clear() {
_edgeset.clearNodes();
More information about the Lemon-commits
mailing list