13enum MutationSupportOption { None, NodeInsertion, EdgeInsertion, NodeDeletion, EdgeDeletion};
20 static constexpr auto ENTRY_NODES_TRAVERSAL = 1;
21 static constexpr auto EXIT_NODES_TRAVERSAL = 2;
22 static constexpr auto INTERNAL_NODES_TRAVERSAL = 4;
23 static constexpr auto OUT_EDGES_TRAVERSAL = 8;
24 static constexpr auto IN_EDGES_TRAVERSAL = 16;
25 static constexpr auto ALL_NODES_OUT_EDGES_TRAVERSAL = ENTRY_NODES_TRAVERSAL + EXIT_NODES_TRAVERSAL + INTERNAL_NODES_TRAVERSAL + OUT_EDGES_TRAVERSAL;
26 static constexpr auto ALL_NODES_IN_EDGES_TRAVERSAL = ENTRY_NODES_TRAVERSAL + EXIT_NODES_TRAVERSAL + INTERNAL_NODES_TRAVERSAL + IN_EDGES_TRAVERSAL;
29 static constexpr auto BOUNDARY_NODES_TRAVERSAL=ENTRY_NODES_TRAVERSAL | EXIT_NODES_TRAVERSAL;
32 bool isIncludedTraversal(
int t)
const {
return t_ & t; }
33 bool isTraversal(
int t)
const {
return t_ == t; }
35 template <
class Iterator>
36 auto traversalSupportFilter()
const
38 return [
this](Iterator it) ->
bool
40 return isIncludedTraversal(it->traversal_kind());
63 using NodeCollectionType = NodeCollection;
64 using EdgeCollectionType = EdgeCollection;
66 using NodePredicate = std::function<bool(NodeIterator)>;
67 using EdgePredicate = std::function<bool(EdgeIterator)>;
71 virtual NodeCollection getNodes(NodePredicate = noFilter<NodeIterator>() )
const = 0;
75 virtual EdgeCollection getEdges(EdgePredicate = noFilter<EdgeIterator>())
const = 0;
78 virtual NodeIterator edgeSource(
const EdgeIterator& p)
const = 0;
79 virtual NodeIterator edgeTarget(
const EdgeIterator& p)
const = 0;
83 virtual EdgeCollection getEdgesFrom(
const NodeIterator&, EdgePredicate = noFilter<EdgeIterator>())
const { assert(
"Error: outgoing edge traversal not supported!");
return EdgeCollection(); }
84 virtual EdgeCollection getEdgesTo(
const NodeIterator&, EdgePredicate = noFilter<EdgeIterator>())
const { assert(
"Error: incomng edge traversal not supported!");
return EdgeCollection(); }
86 virtual enum MutationSupportOption allowMutationDuringTraversal()
const {
return MutationSupportOption::None; }
117 using NodeCollectionType = NodeCollection;
118 using EdgeCollectionType = EdgeCollection;
119 virtual const NodeInfo& dereferenceNode(
const NodeIterator& p)
const = 0;
120 virtual const EdgeInfo& dereferenceEdge(
const EdgeIterator& p)
const = 0;
133 using NodeCollectionType = NodeCollection;
134 using EdgeCollectionType = EdgeCollection;
135 virtual const NodeInfo& dereferenceNode(
const NodeIterator& p)
const = 0;
136 virtual const EdgeInfo& dereferenceEdge(
const EdgeIterator& p)
const = 0;