Go to the documentation of this file.
12 #ifndef __IMPL_GRAPH_ALGORITHM_HELPERS_H__
13 #define __IMPL_GRAPH_ALGORITHM_HELPERS_H__
21 template<
typename VertexID>
26 template<
typename VertexSet,
typename VertexID>
28 return [&](
const auto& v) {
29 if (v_set.find(v) != v_set.end()) {
48 template<
typename VertexID>
109 template<
typename Visitor>
122 template<
typename VertexID>
125 template<
typename VertexID1,
typename VertexID2>
126 void onExamineEdge(
const VertexID1& v1,
const VertexID2& v2) {
ref->onExamineEdge(v1, v2); }
128 template<
typename VertexID>
131 template<
typename VertexID1,
typename VertexID2>
134 template<
typename VertexID>
137 template<
typename VertexID1,
typename VertexID2>
138 void onSkippedEdge(
const VertexID1& v1,
const VertexID2& v2) {
ref->onSkippedEdge(v1, v2); }
144 typename NodeSet = std::set<VertexID>
149 template<
typename ARG1 = NodeSet,
typename... Args>
151 :
nodes_to_ignore(std::forward<ARG1>(arg1), std::forward<Args>(args)...)
162 typename EdgeSet = std::set<std::pair<VertexID, VertexID>>
167 template<
typename ARG1 = EdgeSet,
typename... Args>
169 :
edges_to_ignore(std::forward<ARG1>(arg1), std::forward<Args>(args)...)
180 template<
typename VertexID,
typename Base = DoNothingGraphVisitor<VertexID>,
typename OStream = std::ostream>
196 Base::onExamineEdge(source, target);
201 Base::onSkippedEdge(source, target);
214 template<
typename VertexID,
typename Base = DoNothingGraphVisitor<VertexID>>
229 case onExamine:
return os <<
"onExamine";
230 case onSkipped:
return os <<
"onSkipped";
233 case onWaveEnd:
return os <<
"onWaveEnd";
234 default:
return os <<
"Unimplemented Event::Type";
239 os <<
"{ " << e.
type;
246 default:
return os <<
" }";
267 Base::onExamineEdge(source, target);
272 Base::onSkippedEdge(source, target);
300 template<
typename VertexIDList = std::initializer_list<VertexID>>
303 for (
const auto& fanin : fanins) {
326 template<
typename VertexID,
typename Data>
330 using VertexList = std::decay_t<decltype(std::declval<Data>().at(std::declval<VertexID>()).fanin)>;
339 const auto search_result =
data->find(v);
341 else return search_result->second.fanin;
345 template<
typename VertexID,
typename Data>
void onExamineEdge(const VertexID &source, const VertexID &target)
auto & fanout(const VertexID &ndesc) const
friend std::ostream & operator<<(std::ostream &os, const Event &e)
bool shouldIgnore(const VertexID &v)
bool shouldIgnore(const VertexID &v)
void link(const VertexID &source, const VertexID &target)
DebugVisitor(OStream *debug_stream=nullptr)
bool shouldIgnoreEdge(const VertexID1 &v1, const VertexID2 &v2)
auto returnsIfEqualTo(T t)
bool shouldIgnore(const VertexID &)
IgnoreVertexSetVisitor(ARG1 &&arg1, Args &&... args)
bool shouldIgnoreEdge(const VertexID &v1, const VertexID &v2)
std::remove_reference_t< Visitor > * VisitorPtr
void onExamine(const VertexID &)
VertexID insertMultiFanin(const VertexIDList &fanins, std::string name)
void onExamineEdge(const VertexID &, const VertexID &)
auto findSingleVertex(VertexID v)
VertexID insert(VertexID fanin, std::string name)
friend std::ostream & operator<<(std::ostream &os, const Type &et)
bool shouldIgnoreEdge(const VertexID &, const VertexID &)
void onExamine(const VertexID &v)
void onExamine(const VertexID &v)
EventRecordingVisitor(Base b)
EventRecordingVisitor()=default
void onSkipped(const VertexID &v)
void onSkippedEdge(const VertexID &, const VertexID &)
ReversedGraphFromFaninLists & operator=(const ReversedGraphFromFaninLists &)=default
void onSkipped(const VertexID &v)
VertexID insert(std::string name)
std::vector< Event > examine_order
void onExamineEdge(const VertexID &source, const VertexID &target)
void onSkippedEdge(const VertexID &source, const VertexID &target)
void onSkippedEdge(const VertexID1 &v1, const VertexID2 &v2)
void onSkippedEdge(const VertexID &source, const VertexID &target)
auto end(const SingleItemImmutableSet< VertexID > &siis)
ReversedGraphFromFaninLists(const ReversedGraphFromFaninLists &)=default
std::decay_t< decltype(std::declval< Data >().at(std::declval< VertexID >()).fanin)> VertexList
std::map< std::string, std::vector< VertexID > > fanout_lists
auto findVertexInSet(const VertexSet &v_set, VertexID &vertex_found)
void onSkipped(const VertexID &)
IgnoreEdgeSetVisitor(ARG1 &&arg1, Args &&... args)
auto makeReversedGraphFromFaninLists(Data *data)
ForwardingVisitor & operator=(const ForwardingVisitor &)=default
void onSkipped(const VertexID &v)
const auto & fanout(const VertexID &v)
void onExamine(const VertexID &v)
ForwardingVisitor(VisitorPtr visitor)
void onExamineEdge(const VertexID1 &v1, const VertexID2 &v2)