41 #ifndef BPP_GRAPH_ASSOCIATIONGRAPHOBSERVER_H
42 #define BPP_GRAPH_ASSOCIATIONGRAPHOBSERVER_H
48 #include <type_traits>
51 #include "../Clonable.h"
52 #include "../Exceptions.h"
64 template<
class N,
class E>
81 template<
class A,
class B>
82 static B*
copy(
const A& a,
typename std::enable_if< !std::is_base_of<B, A>::value && !std::is_abstract<B>::value, B*>::type* = 0)
87 template<
class A,
class B>
88 static B*
copy(
const A& a,
typename std::enable_if< !std::is_base_of<B, A>::value && std::is_abstract<B>::value, B*>::type* = 0)
90 throw Exception(
"Unknow AssociationGraphObserver::copy(const A& a, typename std::enable_if< !std::is_base_of<B, A>::value&& std::is_abstract<B>::value, B*>::type* = 0)");
94 template<
class A,
class B>
95 static B*
copy(
const A& a,
typename std::enable_if< std::is_base_of<B, A>::value && !std::is_abstract<A>::value, B*>::type* = 0)
97 return dynamic_cast<B*
>(
new A(a));
100 template<
class A,
class B>
101 static B*
copy(
const A& a,
typename std::enable_if< std::is_base_of<B, A>::value && std::is_abstract<A>::value && std::is_base_of<Clonable, A>::value, B*>::type* = 0)
103 return dynamic_cast<B*
>(a.clone());
106 template<
class A,
class B>
107 static B*
copy(
const A& a,
typename std::enable_if< std::is_base_of<B, A>::value && std::is_abstract<A>::value && !std::is_base_of<Clonable, A>::value, B*>::type* = 0)
109 throw Exception(
"Unknow AssociationGraphObserver::copy(const A& a, typename std::enable_if< std::is_base_of<B, A>::value&& std::is_abstract<A>::value && !std::is_base_of<Clonable, A>::value, B*>::type*= 0)");
124 virtual void createNode(std::shared_ptr<N> newNodeObject) = 0;
136 virtual void createNode(std::shared_ptr<N> objectOriginNode, std::shared_ptr<N> newNodeObject, std::shared_ptr<E> newEdgeObject = 00) = 0;
147 virtual void link(std::shared_ptr<N> nodeObjectA, std::shared_ptr<N> nodeObjectB, std::shared_ptr<E> edgeObject = 00) = 0;
156 virtual void unlink(std::shared_ptr<N> nodeObjectA, std::shared_ptr<N> nodeObjectB) = 0;
228 virtual std::shared_ptr<N>
getRoot()
const = 0;
244 virtual bool hasNodeIndex(
const std::shared_ptr<N> nodeObject)
const = 0;
245 virtual bool hasEdgeIndex(
const std::shared_ptr<E> edgeObject)
const = 0;
254 virtual std::vector<NodeIndex>
getNodeIndexes(std::vector<std::shared_ptr<N> > nodeObjects)
const = 0;
263 virtual std::vector<EdgeIndex>
getEdgeIndexes(std::vector<std::shared_ptr<E> > edgeObjects)
const = 0;
328 virtual bool end()
const = 0;
368 virtual std::vector<std::shared_ptr<N> >
getNeighbors(
const std::shared_ptr<N> node)
const = 0;
376 virtual std::vector<std::shared_ptr<E> >
getEdges(
const std::shared_ptr<N> node)
const = 0;
394 virtual std::vector<std::shared_ptr<E> >
getOutgoingEdges(
const std::shared_ptr<N> node)
const = 0;
413 virtual std::vector<std::shared_ptr<E> >
getIncomingEdges(
const std::shared_ptr<N> node)
const = 0;
424 virtual std::vector<std::shared_ptr<N> >
getLeavesFromNode(std::shared_ptr<N> node,
unsigned int maxDepth)
const = 0;
458 virtual bool end()
const = 0;
501 virtual std::shared_ptr<E>
getEdgeLinking(std::shared_ptr<N> nodeA, std::shared_ptr<N> nodeB)
const = 0;
509 virtual void setEdgeLinking(std::shared_ptr<N> nodeA, std::shared_ptr<N> nodeB, std::shared_ptr<E> edge) = 0;
virtual bool end() const =0
virtual std::shared_ptr< E > operator*()=0
virtual bool end() const =0
virtual std::shared_ptr< N > operator*()=0
Defines a Graph Associator. It is a template which follows (subscribed to) a Graph.
virtual std::vector< std::shared_ptr< N > > getNodesFromGraphid(std::vector< NodeGraphid >) const =0
virtual std::vector< std::shared_ptr< E > > getIncomingEdges(const std::shared_ptr< N > node) const =0
virtual std::vector< std::shared_ptr< E > > getEdges(const std::shared_ptr< N > node) const =0
virtual std::vector< std::shared_ptr< N > > getAllLeaves() const =0
virtual std::shared_ptr< N > getNode(NodeIndex nodeIndex) const =0
static B * copy(const A &a, typename std::enable_if< !std::is_base_of< B, A >::value &&std::is_abstract< B >::value, B * >::type *=0)
virtual std::vector< EdgeIndex > getAllEdgesIndexes() const =0
virtual std::unique_ptr< EdgeIterator > allEdgesIterator()=0
virtual std::vector< NodeIndex > getAllInnerNodesIndexes() const =0
virtual std::vector< std::shared_ptr< E > > getEdgesFromGraphid(std::vector< EdgeGraphid >) const =0
virtual NodeGraphid getNodeGraphid(const std::shared_ptr< N > nodeObject) const =0
virtual std::vector< EdgeIndex > getIncomingEdges(NodeIndex node) const =0
virtual void link(std::shared_ptr< N > nodeObjectA, std::shared_ptr< N > nodeObjectB, std::shared_ptr< E > edgeObject=00)=0
virtual std::vector< std::shared_ptr< E > > getAllEdges() const =0
virtual NodeIndex setNodeIndex(const std::shared_ptr< N > nodeObject, NodeIndex index)=0
virtual std::unique_ptr< NodeIterator > outgoingNeighborNodesIterator(std::shared_ptr< N > node)=0
virtual void createNode(std::shared_ptr< N > objectOriginNode, std::shared_ptr< N > newNodeObject, std::shared_ptr< E > newEdgeObject=00)=0
virtual void associateNode(std::shared_ptr< N > nodeObject, NodeGraphid node)=0
static B * copy(const A &a, typename std::enable_if< std::is_base_of< B, A >::value &&std::is_abstract< A >::value &&std::is_base_of< Clonable, A >::value, B * >::type *=0)
virtual void setEdgeLinking(std::shared_ptr< N > nodeA, std::shared_ptr< N > nodeB, std::shared_ptr< E > edge)=0
virtual void deleteNode(std::shared_ptr< N > nodeObject)=0
virtual std::shared_ptr< N > getRoot() const =0
virtual EdgeIndex getEdgeIndex(const std::shared_ptr< E > edgeObject) const =0
static B * copy(const A &a, typename std::enable_if< std::is_base_of< B, A >::value &&std::is_abstract< A >::value &&!std::is_base_of< Clonable, A >::value, B * >::type *=0)
virtual std::unique_ptr< EdgeIterator > outgoingEdgesIterator(std::shared_ptr< N > node)=0
virtual EdgeGraphid getEdgeGraphid(const std::shared_ptr< E > edgeObject) const =0
virtual bool hasNodeIndex(const std::shared_ptr< N > nodeObject) const =0
return if the object has an index.
virtual std::vector< std::shared_ptr< N > > getAllNodes() const =0
virtual NodeIndex getRootIndex() const =0
virtual std::unique_ptr< EdgeIterator > incomingEdgesIterator(std::shared_ptr< N > node)=0
virtual std::vector< NodeIndex > getNodeIndexes(std::vector< std::shared_ptr< N > > nodeObjects) const =0
virtual std::shared_ptr< N > getNodeFromGraphid(NodeGraphid)=0
virtual std::vector< EdgeIndex > getEdges(NodeIndex node) const =0
virtual void dissociateNode(std::shared_ptr< N > nodeObject)=0
virtual void unlink(std::shared_ptr< N > nodeObjectA, std::shared_ptr< N > nodeObjectB)=0
virtual std::vector< EdgeIndex > getEdgeIndexes(std::vector< std::shared_ptr< E > > edgeObjects) const =0
virtual EdgeIndex setEdgeIndex(const std::shared_ptr< E > edgeObject, EdgeIndex index)=0
virtual std::shared_ptr< E > getEdgeFromGraphid(EdgeGraphid)=0
virtual NodeIndex getNodeIndex(const std::shared_ptr< N > nodeObject) const =0
virtual std::vector< NodeIndex > getOutgoingNeighbors(NodeIndex node) const =0
virtual std::vector< std::shared_ptr< E > > getOutgoingEdges(const std::shared_ptr< N > node) const =0
virtual bool hasEdgeIndex(const std::shared_ptr< E > edgeObject) const =0
virtual std::vector< NodeIndex > getAllNodesIndexes() const =0
Graph::NodeId NodeGraphid
virtual std::vector< std::shared_ptr< N > > getAllInnerNodes() const =0
static B * copy(const A &a, typename std::enable_if< !std::is_base_of< B, A >::value &&!std::is_abstract< B >::value, B * >::type *=0)
virtual std::vector< NodeIndex > getIncomingNeighbors(NodeIndex node) const =0
virtual bool hasNode(NodeIndex nodeIndex) const =0
virtual std::vector< std::shared_ptr< N > > getLeavesFromNode(std::shared_ptr< N > node, unsigned int maxDepth) const =0
static B * copy(const A &a, typename std::enable_if< std::is_base_of< B, A >::value &&!std::is_abstract< A >::value, B * >::type *=0)
virtual std::vector< std::shared_ptr< N > > getNeighbors(const std::shared_ptr< N > node) const =0
virtual std::shared_ptr< E > getEdge(EdgeIndex edgeIndex) const =0
virtual std::shared_ptr< E > getEdgeLinking(std::shared_ptr< N > nodeA, std::shared_ptr< N > nodeB) const =0
virtual std::unique_ptr< NodeIterator > allNodesIterator() const =0
virtual std::unique_ptr< NodeIterator > allNodesIterator()=0
virtual std::vector< std::shared_ptr< N > > getIncomingNeighbors(const std::shared_ptr< N > node) const =0
virtual const std::shared_ptr< E > getEdgeFromGraphid(EdgeGraphid) const =0
virtual std::vector< NodeIndex > getNeighbors(NodeIndex node) const =0
virtual std::vector< NodeIndex > getAllLeavesIndexes() const =0
Graph::EdgeId EdgeGraphid
virtual bool hasEdge(EdgeIndex edgeIndex) const =0
virtual std::unique_ptr< NodeIterator > outgoingNeighborNodesIterator(std::shared_ptr< N > node) const =0
virtual void associateEdge(std::shared_ptr< E > edgeObject, EdgeGraphid edge)=0
virtual std::vector< std::shared_ptr< N > > getOutgoingNeighbors(const std::shared_ptr< N > node) const =0
virtual const std::shared_ptr< N > getNodeFromGraphid(NodeGraphid) const =0
virtual std::unique_ptr< NodeIterator > incomingNeighborNodesIterator(std::shared_ptr< N > node)=0
virtual void dissociateEdge(std::shared_ptr< E > edgeObject)=0
virtual std::vector< EdgeIndex > getOutgoingEdges(NodeIndex node) const =0
virtual std::unique_ptr< NodeIterator > incomingNeighborNodesIterator(std::shared_ptr< N > node) const =0
virtual void createNode(std::shared_ptr< N > newNodeObject)=0
Exception base class. Overload exception constructor (to control the exceptions mechanism)....
Defines a Graph Observer. It is a template which follows (subscribed to) a Graph. The graph and the g...