diff --git a/alib2algo/src/graph/traverse/Bfs.cpp b/alib2algo/src/graph/traverse/Bfs.cpp index 5fdba120792983e895e9902ce99bfb83877d4232..e951bd4d76474b575a845e1a7b5de646735125ff 100644 --- a/alib2algo/src/graph/traverse/Bfs.cpp +++ b/alib2algo/src/graph/traverse/Bfs.cpp @@ -12,12 +12,12 @@ namespace traverse struct Data { Node start; - std::function<bool(const Node&)> func; - std::function<bool(const Node&, const Node&, int)> func2; + Bfs::Function func; + Bfs::FunctionExt func2; }; template <typename T> -static void bfs_impl(const T &graph, const Node &start, std::function<bool(const Node&)> func) +static void bfs_impl(const T &graph, const Node &start, Bfs::Function func) { std::unordered_map<Node, bool> visited; std::queue<Node> q; @@ -42,7 +42,7 @@ static void bfs_impl(const T &graph, const Node &start, std::function<bool(const } template <typename T> -static void bfs2_impl(const T &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func) +static void bfs2_impl(const T &graph, const Node &start, Bfs::FunctionExt func) { std::unordered_map<Node, int> distances; std::unordered_map<Node, Node> predecessors; @@ -68,34 +68,34 @@ static void bfs2_impl(const T &graph, const Node &start, std::function<bool(cons } } -void Bfs::bfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func) +void Bfs::bfs(const Graph &graph, const Node &start, Bfs::Function func) { Data data = { start, func, nullptr }; graph.getData().Accept(static_cast<void*>(&data), BFS); } -void Bfs::bfs(const Graph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func) +void Bfs::bfs(const Graph &graph, const Node &start, Bfs::FunctionExt func) { Data data = { start, nullptr, func }; graph.getData().Accept(static_cast<void*>(&data), BFS); } -void Bfs::bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func) +void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::Function func) { bfs_impl(graph, start, func); } -void Bfs::bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func) +void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::FunctionExt func) { bfs2_impl(graph, start, func); } -void Bfs::bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func) +void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::Function func) { bfs_impl(graph, start, func); } -void Bfs::bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func) +void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::FunctionExt func) { bfs2_impl(graph, start, func); } diff --git a/alib2algo/src/graph/traverse/Bfs.h b/alib2algo/src/graph/traverse/Bfs.h index c7c4b40b0bcbd22256894e812a2695ec68e578b1..f4a468bfe911e33812902e0b34096c27155c798a 100644 --- a/alib2algo/src/graph/traverse/Bfs.h +++ b/alib2algo/src/graph/traverse/Bfs.h @@ -13,19 +13,22 @@ namespace traverse // func is called for each visited node, traversal stops when returning false // -// bool func(const Node &visitedNode); -// bool func(const Node &visitedNode, const Node &predecessor, int distanceFromStart); +// bool Function(const Node &visitedNode); +// bool FunctionExt(const Node &visitedNode, const Node &predecessor, int distanceFromStart); class Bfs : public graph::VisitableGraphBase::const_visitor_type { public: - static void bfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func); - static void bfs(const Graph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func); + typedef std::function<bool(const Node&)> Function; + typedef std::function<bool(const Node&, const Node&, int)> FunctionExt; - static void bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func); - static void bfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func); - static void bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func); - static void bfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&, const Node&, int)> func); + static void bfs(const Graph &graph, const Node &start, Function func); + static void bfs(const Graph &graph, const Node &start, FunctionExt func); + + static void bfs(const DirectedGraph &graph, const Node &start, Function func); + static void bfs(const DirectedGraph &graph, const Node &start, FunctionExt func); + static void bfs(const UndirectedGraph &graph, const Node &start, Function func); + static void bfs(const UndirectedGraph &graph, const Node &start, FunctionExt func); private: void Visit(void *data, const DirectedGraph &graph) const; diff --git a/alib2algo/src/graph/traverse/Dfs.cpp b/alib2algo/src/graph/traverse/Dfs.cpp index dda9f51b1f18110a6162bb9ac3bab85e8b87794b..10094da1557242c126e9a2af5e1d05c341715efa 100644 --- a/alib2algo/src/graph/traverse/Dfs.cpp +++ b/alib2algo/src/graph/traverse/Dfs.cpp @@ -12,12 +12,12 @@ namespace traverse struct Data { Node start; - std::function<bool(const Node&)> func; - std::function<void(const Node&, const Node&, int, int)> func2; + Dfs::Function func; + Dfs::FunctionExt func2; }; template <typename T> -static void dfs_impl(const T &graph, const Node &start, std::function<bool(const Node&)> func) +static void dfs_impl(const T &graph, const Node &start, Dfs::Function func) { std::unordered_map<Node, bool> visited; std::stack<Node> s; @@ -42,7 +42,7 @@ static void dfs_impl(const T &graph, const Node &start, std::function<bool(const } template <typename T> -static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unordered_map<Node, bool> &visited, int &time, std::function<void(const Node&, const Node&, int, int)> func) +static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unordered_map<Node, bool> &visited, int &time, Dfs::FunctionExt func) { int opened = ++time; visited[n] = true; @@ -56,36 +56,36 @@ static void dfs2_impl(const T &graph, const Node &n, const Node &p, std::unorder func(n, p, opened, ++time); } -void Dfs::dfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func) +void Dfs::dfs(const Graph &graph, const Node &start, Dfs::Function func) { Data data = { start, func, nullptr }; graph.getData().Accept(static_cast<void*>(&data), DFS); } -void Dfs::dfs(const Graph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func) +void Dfs::dfs(const Graph &graph, const Node &start, Dfs::FunctionExt func) { Data data = { start, nullptr, func }; graph.getData().Accept(static_cast<void*>(&data), DFS); } -void Dfs::dfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func) +void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::Function func) { dfs_impl(graph, start, func); } -void Dfs::dfs(const DirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func) +void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt func) { int time = 0; std::unordered_map<Node, bool> visited; dfs2_impl(graph, start, Node(), visited, time, func); } -void Dfs::dfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func) +void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::Function func) { dfs_impl(graph, start, func); } -void Dfs::dfs(const UndirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func) +void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt func) { int time = 0; std::unordered_map<Node, bool> visited; diff --git a/alib2algo/src/graph/traverse/Dfs.h b/alib2algo/src/graph/traverse/Dfs.h index bc45c5de49db59168532fdccc756abe10ea4e84a..f77ac7ac7313e343af1dc99d3ac4cfdb2ff6c0cd 100644 --- a/alib2algo/src/graph/traverse/Dfs.h +++ b/alib2algo/src/graph/traverse/Dfs.h @@ -12,16 +12,23 @@ namespace traverse { // func is called for each visited node, traversal stops when returning false +// +// bool Function(const Node &node); +// void FunctionExt(const Node &node, const Node &predecessor, int openTime, int closeTime); + class Dfs : public graph::VisitableGraphBase::const_visitor_type { public: - static void dfs(const Graph &graph, const Node &start, std::function<bool(const Node&)> func); - static void dfs(const Graph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func); + typedef std::function<bool(const Node&)> Function; + typedef std::function<void(const Node&, const Node&, int, int)> FunctionExt; + + static void dfs(const Graph &graph, const Node &start, Function func); + static void dfs(const Graph &graph, const Node &start, FunctionExt func); - static void dfs(const DirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func); - static void dfs(const DirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func); - static void dfs(const UndirectedGraph &graph, const Node &start, std::function<bool(const Node&)> func); - static void dfs(const UndirectedGraph &graph, const Node &start, std::function<void(const Node&, const Node&, int, int)> func); + static void dfs(const DirectedGraph &graph, const Node &start, Function func); + static void dfs(const DirectedGraph &graph, const Node &start, FunctionExt func); + static void dfs(const UndirectedGraph &graph, const Node &start, Function func); + static void dfs(const UndirectedGraph &graph, const Node &start, FunctionExt func); private: void Visit(void *data, const DirectedGraph &graph) const;