+/**
+ * @brief Constructor for a Promise CycleNode
+ * @param promise The Promise which was generated
+ */
+CycleNode::CycleNode(const Promise *promise) :
+ action(NULL),
+ promise(promise),
+ hasRMW(NULL)
+{
+}
+
+/**
+ * @param i The index of the edge to return
+ * @returns The a CycleNode edge indexed by i
+ */
+CycleNode * CycleNode::getEdge(unsigned int i) const
+{
+ return edges[i];
+}
+
+/** @returns The number of edges leaving this CycleNode */
+unsigned int CycleNode::getNumEdges() const
+{
+ return edges.size();
+}
+
+CycleNode * CycleNode::getBackEdge(unsigned int i) const
+{
+ return back_edges[i];
+}
+
+unsigned int CycleNode::getNumBackEdges() const
+{
+ 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;