From: Brian Norris Date: Wed, 6 Feb 2013 01:36:05 +0000 (-0800) Subject: cyclegraph: move function definitions out of header X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=fbacb5f41ada96e7b539ccc41deccb1a7e1a1ba8 cyclegraph: move function definitions out of header I found out how to instantiate these functions from within the implementation file (rather than the header). I can specifically list those implementations that I want available. --- diff --git a/cyclegraph.cc b/cyclegraph.cc index 1ff9d70b..8f095dc5 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -251,6 +251,35 @@ void CycleGraph::addRMWEdge(const T *from, const ModelAction *rmw) template void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw); template void CycleGraph::addRMWEdge(const Promise *from, const ModelAction *rmw); +/** + * @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 + * @return True, if new edge(s) are added; otherwise false + */ +template +bool CycleGraph::addEdge(const T *from, const U *to) +{ + ASSERT(from); + ASSERT(to); + + CycleNode *fromnode = getNode(from); + CycleNode *tonode = getNode(to); + + return addNodeEdge(fromnode, tonode); +} +/* Instantiate three forms of CycleGraph::addEdge */ +template bool CycleGraph::addEdge(const ModelAction *from, const ModelAction *to); +template bool CycleGraph::addEdge(const ModelAction *from, const Promise *to); +template bool CycleGraph::addEdge(const Promise *from, const ModelAction *to); + #if SUPPORT_MOD_ORDER_DUMP void CycleGraph::dumpNodes(FILE *file) const { @@ -311,6 +340,29 @@ bool CycleGraph::checkReachable(const CycleNode *from, const CycleNode *to) cons return false; } +/** + * 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); +} +/* Instantiate two forms of CycleGraph::checkReachable */ +template bool CycleGraph::checkReachable(const ModelAction *from, + const ModelAction *to) const; +template bool CycleGraph::checkReachable(const ModelAction *from, + const Promise *to) const; + /** @return True, if the promise has failed; false otherwise */ bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const { diff --git a/cyclegraph.h b/cyclegraph.h index a9e46120..fcaa2136 100644 --- a/cyclegraph.h +++ b/cyclegraph.h @@ -28,7 +28,7 @@ class CycleGraph { ~CycleGraph(); template - bool addEdge(const T from, const U to); + bool addEdge(const T *from, const U *to); template void addRMWEdge(const T *from, const ModelAction *rmw); @@ -127,47 +127,4 @@ 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 - * @return True, if new edge(s) are added; otherwise false - */ -template -bool CycleGraph::addEdge(const T from, const U to) -{ - ASSERT(from); - ASSERT(to); - - CycleNode *fromnode = getNode(from); - CycleNode *tonode = getNode(to); - - return 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__ */