#pragma once #include #include namespace wfr { namespace wep { class AbstractWepNode; } namespace utils { namespace wep { template void wepDepthFirstSearch(wfr::wep::AbstractWepNode* startNode, const VisitType& visitFunction, std::set* visitedNodes = nullptr) { bool deleteVisitedNodeSet = false; if (visitedNodes == nullptr) { visitedNodes = new std::set(); deleteVisitedNodeSet = true; } visitedNodes->insert(startNode); if (visitFunction(startNode)) { for (auto c : startNode->getSuccessors()) { if (visitedNodes->find(c) == visitedNodes->end()) { wepDepthFirstSearch(c, visitFunction, visitedNodes); } } } if (deleteVisitedNodeSet) { delete visitedNodes; } } template void wepBreadthFirstSearch(wfr::wep::AbstractWepNode* startNode, const VisitType& visitFunction) { std::vector nodeQueue; std::set visitedNodes; nodeQueue.push_back(startNode); while (!nodeQueue.empty()) { auto cn = nodeQueue.front(); visitedNodes.insert(cn); nodeQueue.erase(nodeQueue.begin()); if (visitFunction(cn)) { for (auto c : cn->getSuccessors()) { if (visitedNodes.find(c) == visitedNodes.end()) { bool isInQueue = false; for (auto e : nodeQueue) { if (c == e) { isInQueue = true; break; } } if (!isInQueue) { nodeQueue.push_back(c); } } } } } } template void wepBreadthFirstReverseSearch(wfr::wep::AbstractWepNode* startNode, const VisitType& visitFunction) { std::vector nodeQueue; std::set visitedNodes; nodeQueue.push_back(startNode); while (!nodeQueue.empty()) { auto cn = nodeQueue.front(); visitedNodes.insert(cn); nodeQueue.erase(nodeQueue.begin()); if (visitFunction(cn)) { for (auto c : cn->getPredecessors()) { if (visitedNodes.find(c) == visitedNodes.end()) { bool isInQueue = false; for (auto e : nodeQueue) { if (c == e) { isInQueue = true; break; } } if (!isInQueue) { nodeQueue.push_back(c); } } } } } } } } }