X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.h;h=83d3db21d77cdfc192f0bd286d21fee188de7fac;hb=4da2859902f1096053a2d9857df502d3bb94e6e4;hp=c9c575ab36cdce5c8e9bc8445b0bce21837d8f99;hpb=776fc7207dec4959b4fa3e4bd7cb71cc38a19353;p=model-checker.git diff --git a/cyclegraph.h b/cyclegraph.h index c9c575a..83d3db2 100644 --- a/cyclegraph.h +++ b/cyclegraph.h @@ -52,8 +52,10 @@ class CycleGraph { private: void addNodeEdge(CycleNode *fromnode, CycleNode *tonode); void putNode(const ModelAction *act, CycleNode *node); - CycleNode * getNode(const ModelAction *); + CycleNode * getNode(const ModelAction *act); CycleNode * getNode(const Promise *promise); + CycleNode * getNode_noCreate(const ModelAction *act) const; + CycleNode * getNode_noCreate(const Promise *promise) const; bool mergeNodes(CycleNode *node1, CycleNode *node2, promise_list_t *mustMerge); @@ -128,4 +130,46 @@ class CycleNode { CycleNode *hasRMW; }; +/* + * @brief Adds an edge between objects + * + * This function will add an edge between any two objects which can be + * associated with a CycleNode. That is, if they have a CycleGraph::getNode + * implementation. + * + * The object to is ordered after the object from. + * + * @param to The edge points to this object, of type T + * @param from The edge comes from this object, of type U + */ +template +void CycleGraph::addEdge(const T from, const U to) +{ + ASSERT(from); + ASSERT(to); + + CycleNode *fromnode = getNode(from); + CycleNode *tonode = getNode(to); + + addNodeEdge(fromnode, tonode); +} + +/** + * Checks whether one ModelAction can reach another ModelAction/Promise + * @param from The ModelAction from which to begin exploration + * @param to The ModelAction or Promise to reach + * @return True, @a from can reach @a to; otherwise, false + */ +template +bool CycleGraph::checkReachable(const ModelAction *from, const T *to) const +{ + CycleNode *fromnode = getNode_noCreate(from); + CycleNode *tonode = getNode_noCreate(to); + + if (!fromnode || !tonode) + return false; + + return checkReachable(fromnode, tonode); +} + #endif /* __CYCLEGRAPH_H__ */