OpenLexocad  28.0
RelGraph.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Core/CoreDocument.h>
4 #include <boost/graph/adjacency_list.hpp>
5 #ifndef Q_MOC_RUN
6 #include <mutex>
7 #endif
8 
9 typedef boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, boost::property<boost::vertex_name_t, std::string> > ObjectGraph_Type;
10 typedef ObjectGraph_Type::vertex_descriptor Object_Vertex;
11 
12 
13 namespace Core
14 {
15 
16 struct NodeInfo{size_t id;};
17 struct EdgeInfo{size_t pos;};
18 
19 
20 using RelGraph_Type = boost::adjacency_list<boost::listS, boost::setS, boost::bidirectionalS,NodeInfo,EdgeInfo >;
21 using RelGraph_Vertex = RelGraph_Type::vertex_descriptor;
22 using RelGraph_Edge = RelGraph_Type::edge_descriptor;
23 using RelGraph_Link = std::pair<Core::PropertyLinkBaseBase*,Core::DocObject*>;
24 
25 class LX_CORE_EXPORT RelGraph
26 {
27 public:
30 
32 
35  void addRelationShips(PropertyLinkBaseBase* p, Core::DocObject* from,const std::list<Core::DocObject*>& linkList);
36  void addRelationShips(PropertyLinkBaseBase* p, Core::DocObject* from,const std::unordered_set<Core::DocObject*>& linkSet);
38  void removeRelationShips(PropertyLinkBaseBase* p, Core::DocObject* from,const std::list<Core::DocObject*>& linkList);
39  void removeRelationShips(PropertyLinkBaseBase* p, Core::DocObject* from,const std::unordered_set<Core::DocObject*>& linkSet);
40  void test_graph2();
41  std::string dump();
42  void test_graph();
44 
46  void breakLinks( Core::DocObject* from );
47  bool check();
48 
49  std::vector<Link> mProblems;
50 
51 private:
52  RelGraph_Vertex getOrAddVertex( Core::DocObject* docObj );
53  std::optional<RelGraph_Vertex> getVertex(Core::DocObject* docObj);
54  RelGraph_Type _relGraph;
55  std::unordered_map<size_t,RelGraph_Vertex> _object_to_vertex;
56  RelGraph() = default;
57  Core::CoreDocument* _cDoc = nullptr;
58  std::recursive_mutex m_mutex;
59 
60 };
61 
62 
63 } // namespace Core
Core::RelGraph::removeRelationShip
void removeRelationShip(PropertyLinkBaseBase *p, Core::DocObject *from, Core::DocObject *to)
Core::CoreDocument
Definition: CoreDocument.h:269
Core::RelGraph::getProperty
Core::PropertyLinkBaseBase * getProperty(Core::DocObject *docObj, size_t pos)
Core::RelGraph::breakLinks
void breakLinks(Core::DocObject *from)
Core::RelGraph::mProblems
std::vector< Link > mProblems
Definition: RelGraph.h:49
Core::RelGraph::getOutEdges
Core::Link getOutEdges(Core::DocObject *docObj)
Object_Vertex
ObjectGraph_Type::vertex_descriptor Object_Vertex
Definition: RelGraph.h:10
Core::RelGraph_Vertex
RelGraph_Type::vertex_descriptor RelGraph_Vertex
Definition: RelGraph.h:21
Core::RelGraph::removeObject
void removeObject(Core::DocObject *obj)
Core::RelGraph::RelGraph
RelGraph(Core::CoreDocument *doc)
Core::RelGraph::removeRelationShips
void removeRelationShips(PropertyLinkBaseBase *p, Core::DocObject *from, const std::list< Core::DocObject * > &linkList)
Core::RelGraph::addRelationShip
void addRelationShip(PropertyLinkBaseBase *p, Core::DocObject *from, Core::DocObject *to)
Core::RelGraph::addRelationShips
void addRelationShips(PropertyLinkBaseBase *p, Core::DocObject *from, const std::list< Core::DocObject * > &linkList)
Core::DocObject
Definition: DocObject.h:54
Core::RelGraph::addRelationShips
void addRelationShips(PropertyLinkBaseBase *p, Core::DocObject *from, const std::unordered_set< Core::DocObject * > &linkSet)
Core::NodeInfo
Definition: RelGraph.h:16
Core::RelGraph_Edge
RelGraph_Type::edge_descriptor RelGraph_Edge
Definition: RelGraph.h:22
Core
Definition: Base.h:5
Core::RelGraph::test_graph2
void test_graph2()
Core::RelGraph_Link
std::pair< Core::PropertyLinkBaseBase *, Core::DocObject * > RelGraph_Link
Definition: RelGraph.h:23
Core::RelGraph::hasRelationShip
bool hasRelationShip(PropertyLinkBaseBase *p, Core::DocObject *from, Core::DocObject *to)
ObjectGraph_Type
boost::adjacency_list< boost::setS, boost::vecS, boost::bidirectionalS, boost::property< boost::vertex_name_t, std::string > > ObjectGraph_Type
Definition: RelGraph.h:9
Core::RelGraph::removeRelationShips
void removeRelationShips(PropertyLinkBaseBase *p, Core::DocObject *from, const std::unordered_set< Core::DocObject * > &linkSet)
Core::RelGraph::test_graph
void test_graph()
Core::NodeInfo::id
size_t id
Definition: RelGraph.h:16
CoreDocument.h
Core::RelGraph::dump
std::string dump()
Core::EdgeInfo::pos
size_t pos
Definition: RelGraph.h:17
Core::RelGraph::getInEdges
Core::Link getInEdges(Core::DocObject *docObj)
Core::RelGraph
Definition: RelGraph.h:26
Core::RelGraph::check
bool check()
Core::EdgeInfo
Definition: RelGraph.h:17
Core::RelGraph_Type
boost::adjacency_list< boost::listS, boost::setS, boost::bidirectionalS, NodeInfo, EdgeInfo > RelGraph_Type
Definition: RelGraph.h:20