From a5b0300c346b8298ce501df84e985f630e1ee846 Mon Sep 17 00:00:00 2001
From: David Rosca <roscadav@fit.cvut.cz>
Date: Sun, 8 Mar 2015 09:51:03 +0100
Subject: [PATCH] BFS, DFS: Use typedefs for std::function signatures

---
 alib2algo/src/graph/traverse/Bfs.cpp | 20 ++++++++++----------
 alib2algo/src/graph/traverse/Bfs.h   | 19 +++++++++++--------
 alib2algo/src/graph/traverse/Dfs.cpp | 20 ++++++++++----------
 alib2algo/src/graph/traverse/Dfs.h   | 19 +++++++++++++------
 4 files changed, 44 insertions(+), 34 deletions(-)

diff --git a/alib2algo/src/graph/traverse/Bfs.cpp b/alib2algo/src/graph/traverse/Bfs.cpp
index 5fdba12079..e951bd4d76 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 c7c4b40b0b..f4a468bfe9 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 dda9f51b1f..10094da155 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 bc45c5de49..f77ac7ac73 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;
-- 
GitLab