cyclegraph: add removeEdge(), removeBackEdge()
authorBrian Norris <banorris@uci.edu>
Sat, 26 Jan 2013 00:41:27 +0000 (16:41 -0800)
committerBrian Norris <banorris@uci.edu>
Wed, 6 Feb 2013 21:44:38 +0000 (13:44 -0800)
For popping edges of a node that's about to be merged with another one.

Note that if using these functions, a user has to manage the
'CycleGraph::hasCycles' state. This only handles the inter-Node edge
lists.

cyclegraph.cc
cyclegraph.h

index 7a3532830598684a7719f6f3329fcda746aa5ccc..57f8fc8c42fe0033abbe83d14caa674feeedb1e7 100644 (file)
@@ -320,6 +320,54 @@ unsigned int CycleNode::getNumBackEdges() const
        return back_edges.size();
 }
 
        return back_edges.size();
 }
 
+/**
+ * @brief Remove an element from a vector
+ * @param v The vector
+ * @param n The element to remove
+ * @return True if the element was found; false otherwise
+ */
+template <typename T>
+static bool vector_remove_node(std::vector<T, SnapshotAlloc<T> >& v, const T n)
+{
+       for (unsigned int i = 0; i < v.size(); i++) {
+               if (v[i] == n) {
+                       v.erase(v.begin() + i);
+                       return true;
+               }
+       }
+       return false;
+}
+
+/**
+ * @brief Remove a (forward) edge from this CycleNode
+ * @return The CycleNode which was popped, if one exists; otherwise NULL
+ */
+CycleNode * CycleNode::removeEdge()
+{
+       if (edges.empty())
+               return NULL;
+
+       CycleNode *ret = edges.back();
+       edges.pop_back();
+       vector_remove_node(ret->back_edges, this);
+       return ret;
+}
+
+/**
+ * @brief Remove a (back) edge from this CycleNode
+ * @return The CycleNode which was popped, if one exists; otherwise NULL
+ */
+CycleNode * CycleNode::removeBackEdge()
+{
+       if (back_edges.empty())
+               return NULL;
+
+       CycleNode *ret = back_edges.back();
+       back_edges.pop_back();
+       vector_remove_node(ret->edges, this);
+       return ret;
+}
+
 /**
  * Adds an edge from this CycleNode to another CycleNode.
  * @param node The node to which we add a directed edge
 /**
  * Adds an edge from this CycleNode to another CycleNode.
  * @param node The node to which we add a directed edge
index f7b346c1f062c6b8932908b552144829f070b2d8..a909c10b50a49f97453bf1f6114223400b11c4ac 100644 (file)
@@ -73,6 +73,9 @@ class CycleNode {
        unsigned int getNumEdges() const;
        CycleNode * getBackEdge(unsigned int i) const;
        unsigned int getNumBackEdges() const;
        unsigned int getNumEdges() const;
        CycleNode * getBackEdge(unsigned int i) const;
        unsigned int getNumBackEdges() const;
+       CycleNode * removeEdge();
+       CycleNode * removeBackEdge();
+
        bool setRMW(CycleNode *);
        CycleNode * getRMW() const;
        void clearRMW() { hasRMW = NULL; }
        bool setRMW(CycleNode *);
        CycleNode * getRMW() const;
        void clearRMW() { hasRMW = NULL; }