with continuation to my previous question HERE, is it possible to define/initialize a filtered_graph over existing filtered graph. for example,
class A{
FilteredGraphType_t fg // it is a typedef
// constructor
template < typename ... , typename fil_graph >
A ( ..init parameters.. , fil_graph& FG) // note this.
{
predicate filter3 ( ... ); // defined predicate
// define new filtered_graph here in constructor
FilteredGraphType_t newFG ( boost::make_filtered_graph( FG, filter3) .. // error
write_graphviz(std::cout, newFG ); /// error
}
};
Can i do something like this?
FilteredGraphType fg3( fg3, filter3) ; // call filter and predicate on itself
OR
FilteredGraphType fg4( fg3, filter3) ; ( new filtered graph fg4 filtering over fg3
I get compiler errors when I try to create a new filter3 over existing filtered graph....However, I can define a new filter over original graph..
Also how do I call a predicate --> filter3 on FG obtained as a constructor parameter (by reference)
Yes, it is completely possible to use a filtered graph on top of filtered graph. It should probably have the same efficiency as combining the filters on top of the original graph.
Remember, filtered_graph<G,EFG>
is a different type than the type of filtered_graph<F,EFF>
. Your compiler errors likely happen because you use the same FilteredGraphType_t
in both locations of your code.
The correct code could look like:
Graph g;
typedef filtered_graph<G,EPred> FilteredGraphType_t;
FilteredGraphType_t fg(g, pred);
typedef filtered_graph<FilteredGraphType,SomePred> DeepFilteredGraphType_t;
DeepFilteredGraphType_t dfg(fg, somePred);
AFAIK, there is no documented way to access the "original" predicates used to form a filtered graph. Undocumented way is to use the internals of the Boost code as follows:
FilteredGraphType_t fg = ...
EPred edgeFilter = fg.m_edge_pred;
FilteredGraphType_t::edge_descriptor ed = ... bool edge_ok = edgeFilter(ed); //same as edgeFilter.operator()(ed);
It seems the recommended way would be to have your filter3
predicate as a member of your class A.