[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