8 #pragma clang diagnostic push
9 #pragma clang diagnostic ignored "-Wunused-variable"
10 #pragma clang diagnostic ignored "-Wunneeded-internal-declaration"
13 #include <boost/foreach.hpp>
14 #include <boost/scoped_ptr.hpp>
15 #include <boost/graph/breadth_first_search.hpp>
16 #include <boost/graph/filtered_graph.hpp>
19 #pragma clang diagnostic pop
28 using namespace boost;
37 remove_vertex(entry->
vertex(), graph_);
45 boost::tie(edge_id, added) = add_edge(lhs->
vertex(), rhs->
vertex(),
53 remove_edge(edge->
edge_id(), graph_);
56 template <
typename GraphType>
63 : vertex_visit_(vertex_visit), edge_visit_(edge_visit) {
69 : vertex_visit_(vertex_visit), edge_visit_(edge_visit),
70 vertex_finish_(vertex_finish) {
75 vertex_visit_(graph[u].entry);
81 vertex_finish_(graph[u].entry);
90 edge_visit_(properties.
edge);
100 typedef std::map<DBGraph::Vertex, default_color_type>
ColorMap;
107 breadth_first_search(graph_, start->
vertex(),
108 visitor(vis).color_map(make_assoc_property_map(color_map)));
115 breadth_first_search(graph_, start->
vertex(),
116 visitor(vis).color_map(make_assoc_property_map(color_map)));
122 : graph_(graph), filter_(&filter) {
130 return filter_->EdgeFilter(src, tgt, edge);
141 : graph_(graph), filter_(&filter) {
147 return filter_->VertexFilter(entry);
157 if (adjacent_vertex == current_vertex) {
158 adjacent_vertex = edge->
source(
this);
160 return adjacent_vertex;
168 ::uint64_t curr_walk,
170 bool match_name,
const std::string &allowed_edge) {
171 for (; iter_begin != iter_end; ++iter_begin) {
174 if (match_name && e_prop.
name() != allowed_edge)
break;
175 DBGraphVertex *adjacent_vertex = vertex_target(current_vertex, edge);
176 if (edge_visit_fn) edge_visit_fn(edge);
177 if (!edge_test(current_vertex, adjacent_vertex, edge))
continue;
178 if (adjacent_vertex->
visited(curr_walk))
continue;
179 if (vertex_test(adjacent_vertex)) {
180 vertex_visit_fn(adjacent_vertex);
181 visit_q.push(adjacent_vertex);
190 ::uint64_t curr_walk = get_graph_walk_num();
198 if (vertex_test(start)) {
199 vertex_visit_fn(start);
201 while (!visit_q.empty()) {
206 if (out_edge_set.empty())
continue;
208 OutEdgeListType::iterator it = out_edge_set.
begin();
209 OutEdgeListType::iterator it_end = out_edge_set.end();
215 if (!allowed_edge_ret.first) {
216 for (
auto allowed_edge : allowed_edge_ret.second) {
218 fake_container.push_back(
222 it = out_edge_set.lower_bound(es);
223 IterateEdges(vertex, it, it_end, vertex_visit_fn, edge_visit_fn,
224 edge_test, vertex_test, curr_walk, visit_q,
true, allowed_edge);
227 IterateEdges(vertex, it, it_end, vertex_visit_fn, edge_visit_fn,
228 edge_test, vertex_test, curr_walk, visit_q);
244 return boost::make_tuple(
graph_->vertex_data(src),
graph_->vertex_data(tgt),
245 graph_->edge_data(*iter_));
251 return (iter_ == end_);
253 return iter_ == rhs.
iter_;
280 return iter_ == rhs.
iter_;
282 return (iter_ == end_);
306 return num_vertices(
graph_);
313 template <
class StoredEdge>
bool equal(const edge_iterator &rhs) const
edge_iterator edge_list_begin()
boost::graph_traits< graph_t >::edge_iterator edge_iterator
graph_t::StoredEdge StoredEdge
const graph_t * graph() const
void IterateEdges(DBGraphVertex *start, OutEdgeIterator &iter_begin, OutEdgeIterator &iter_end, VertexVisitor vertex_visit_fn, EdgeVisitor edge_visit_fn, EdgePredicate &edge_test, VertexPredicate &vertex_test, uint64_t curr_walk, VisitQ &visit_queue, bool match_name=false, const std::string &allowed_edge="")
edge_iterator(DBGraph *graph)
void finish_vertex(DBGraph::Vertex u, const GraphType &graph) const
void Unlink(DBGraphEdge *link)
DBGraphBase::VertexProperties Properties
bool operator()(const DBGraphVertex *entry) const
std::queue< DBGraphVertex * > VisitQ
virtual AllowedEdgeRetVal AllowedEdges(const DBGraphVertex *vertex) const
const std::string & name() const
DBGraph::VertexVisitor vertex_visit_
boost::container_gen< graph_t::out_edge_list_selector, StoredEdge >::type OutEdgeListType
boost::function< void(DBGraphEdge *)> EdgeVisitor
DBGraphBase::edge_iterator iter_
size_t vertex_count() const
void discover_vertex(DBGraph::Vertex u, const GraphType &graph) const
vertex_iterator vertex_list_begin()
bool visited(uint64_t current_graph_walk_num)
DBGraphBase::vertex_descriptor Vertex
vertex_iterator vertex_list_end()
edge_iterator edge_list_end()
DBEdgeInfo dereference() const
const VisitorFilter * filter_
void examine_edge(DBGraph::Edge e, const GraphType &graph) const
void AddNode(DBGraphVertex *entry)
graph_t::EdgeContainer EdgeContainer
EdgePredicate(const DBGraph *graph, const VisitorFilter &filter)
DBGraphVertex * target(DBGraph *graph)
void Visit(DBGraphVertex *start, VertexVisitor vertex_visit_fn, EdgeVisitor edge_visit_fn)
graph_t::vertex_iterator iter_
bool operator()(const StoredEdge &e1, const StoredEdge &e2) const
void RemoveNode(DBGraphVertex *entry)
BFSVisitor(DBGraph::VertexVisitor vertex_visit, DBGraph::EdgeVisitor edge_visit, DBGraph::VertexFinish vertex_finish)
std::map< DBGraph::Vertex, default_color_type > ColorMap
DBGraph::VertexFinish vertex_finish_
graph_t::vertex_iterator end_
std::pair< bool, AllowedEdgeSet > AllowedEdgeRetVal
boost::function< void(DBGraphVertex *)> VertexFinish
void set_visited(uint64_t current_graph_walk_num)
const VisitorFilter * filter_
DBGraphBase::edge_descriptor Edge
Edge Link(DBGraphVertex *lhs, DBGraphVertex *rhs, DBGraphEdge *link)
virtual const std::string & name() const =0
vertex_iterator(DBGraph *graph)
VertexPredicate(const DBGraph *graph, const VisitorFilter &filter)
DBGraphVertex * vertex_target(DBGraphVertex *current_vertex, DBGraphEdge *edge)
bool equal(const vertex_iterator &rhs) const
size_t edge_count() const
void set_vertex(const Vertex &vertex_id)
DBGraphBase::edge_iterator end_
OutEdgeListType::iterator OutEdgeIterator
DBGraphVertex * source(DBGraph *graph)
boost::function< void(DBGraphVertex *)> VertexVisitor
boost::tuple< DBGraphVertex *, DBGraphVertex *, DBGraphEdge * > DBEdgeInfo
adjacency_iterator begin(DBGraph *graph)
BFSVisitor(DBGraph::VertexVisitor vertex_visit, DBGraph::EdgeVisitor edge_visit)
EdgeContainer::value_type EdgeType
bool operator()(const DBGraphVertex *src, const DBGraphVertex *tgt, const DBGraphEdge *edge) const
DBGraph::EdgeVisitor edge_visit_