WSF
WsfCommGraph.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2017 Infoscitex, a DCS Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12#ifndef WSFCOMMGRAPH_HPP
13#define WSFCOMMGRAPH_HPP
14
15#include "wsf_export.h"
16
17#include <map>
18
19#include "UtGraph.hpp"
20#include "UtScriptAccessible.hpp"
21#include "UtScriptClassDefine.hpp"
22#include "WsfCommAddress.hpp"
23
24namespace wsf
25{
26namespace comm
27{
28namespace graph
29{
30
33class Node;
34class Edge;
35using GraphImpl = UtGraphT<Node, Edge, true, double>;
36using AddressList = std::vector<Address>;
37using EdgeList = std::vector<Edge*>;
38
49class WSF_EXPORT Node : public UtScriptAccessible
50{
51public:
52 Node(const Address& aAddress);
53 Node(const Node& aSrc) = default;
54 virtual ~Node() = default;
55
56 virtual Node* Clone() const;
57
58 bool operator==(const Node& aRhs) const;
59 bool operator!=(const Node& aRhs) const;
60 bool operator<(const Node& aRhs) const;
61 Node& operator=(const Node& aRhs) = default;
62
63 const Address& GetAddress() const { return mAddress; }
64
65 void SetEnabled() { mEnabled = true; }
66 void SetDisabled() { mEnabled = false; }
67 bool IsEnabled() const { return mEnabled; }
68
69 const char* GetScriptClassName() const override { return "WsfCommGraphNode"; }
70
71private:
72 Address mAddress;
73 bool mEnabled;
74};
75
76class WSF_EXPORT ScriptCommGraphNodeClass : public UtScriptClass
77{
78public:
79 ScriptCommGraphNodeClass(const std::string& aClassName, UtScriptTypes* aTypesPtr);
80
81 void Destroy(void* aNodePtr) override;
82
85};
86
97class WSF_EXPORT Edge : public UtScriptAccessible
98{
99public:
100 Edge(bool aEnabled, const Address& aSourceAddress, const Address& aDestinationAddress);
101 Edge(const Edge& aSrc) = default;
102 virtual ~Edge() = default;
103 Edge& operator=(const Edge& aRhs) = default;
104
105 virtual Edge* Clone() const;
106
107 const Address& GetSourceAddress() const { return mSourceAddress; }
108 const Address& GetDestinationAddress() const { return mDestinationAddress; }
109 double GetWeight() const { return mWeight; }
110 void SetEnabled() { mEnabled = true; }
111 void SetDisabled() { mEnabled = false; }
112 void SetStatic(bool aIsStatic) { mStatic = aIsStatic; }
113 void SetWeight(double aWeight) { mWeight = aWeight; }
114 bool IsEnabled() const { return mEnabled; }
115 bool IsStatic() const { return mStatic; }
116
117 const char* GetScriptClassName() const override { return "WsfCommGraphEdge"; }
118
119private:
120 Address mSourceAddress;
121 Address mDestinationAddress;
122 double mWeight;
123 bool mEnabled;
124 bool mStatic;
125};
126
127class WSF_EXPORT ScriptCommGraphEdgeClass : public UtScriptClass
128{
129public:
130 ScriptCommGraphEdgeClass(const std::string& aClassName, UtScriptTypes* aTypesPtr);
131
132 void Destroy(void* aEdgePtr) override;
133
135 UT_DECLARE_SCRIPT_METHOD(DestinationAddress);
138};
139
149class WSF_EXPORT Graph : public UtScriptAccessible
150{
151public:
152 enum class GraphAction
153 {
154 cADD_NODE,
155 cADD_EDGE,
156 cREMOVE_NODE,
157 cREMOVE_EDGE
158 };
159
160 Graph() = default;
161 Graph(const Graph& aSrc) = default;
162 virtual ~Graph() = default;
163 Graph& operator=(const Graph& aRhs) = default;
164
165 virtual Node* FindNode(const Address& aAddress) const;
166
167 virtual const Node* CreateNode(const Address& aAddress);
168
169 virtual bool RemoveNode(const Node* aNodePtr);
170 virtual bool RemoveNode(const Address& aAddress);
171
172 virtual Edge* InsertEdge(const Node* aSourceNode, const Node* aDestinationNode, bool aIsEnabled, bool aIsStatic = false);
173 virtual Edge* InsertEdge(const Address& aSourceAddress,
174 const Address& aDestinationAddress,
175 bool aIsEnabled,
176 bool aIsStatic = false);
177
178 virtual bool EraseEdge(const Node* aSourceNode, const Node* aDestinationNode);
179 virtual bool EraseEdge(const Address& aSourceAddress, const Address& aDestinationAddress);
180
181 virtual Edge* FindEdge(const Node* aSourceNode, const Node* aDestinationNode);
182 virtual Edge* FindEdge(const Address& aSourceAddress, const Address& aDestinationAddress);
183
184 std::vector<const Node*> GetNodes() const;
185
186 virtual EdgeList GetIncomingNodeEdges(const Node* aNodePtr);
187 virtual EdgeList GetIncomingNodeEdges(const Address& aAddress);
188 virtual EdgeList GetOutgoingNodeEdges(const Node* aNodePtr) const;
189 virtual EdgeList GetOutgoingNodeEdges(const Address& aAddress) const;
190
191 virtual EdgeList GetAllNodeEdges(const Node* aNodePtr);
192 virtual EdgeList GetAllNodeEdges(const Address& aAddress);
193
194 virtual void RemoveNodeEdges(Node* aNode);
195
196 void SetUserModifiable(bool aCanModify) { mUserModifiable = aCanModify; }
197 bool IsUserModifiable() const { return mUserModifiable; }
198
199
210
211 bool FindPath(const Node* aSourceNode,
212 const Node* aDestinationNode,
213 GraphImpl::NodeList& aPath,
214 double& aCost,
215 const GraphImpl::cost_func* aCostClass = nullptr) const;
216 bool FindPath(const Address& aSourceAddress,
217 const Address& aDestinationAddress,
218 AddressList& aAddressList,
219 double& aCost,
220 const GraphImpl::cost_func* aCostClass = nullptr) const;
221
223 bool FindAnyPath(const Address& aSourceAddress,
224 const Address& aDestinationAddress,
225 AddressList* aAddressList, // nullptr if we don't need to know which path is used
226 double& aCost,
227 const GraphImpl::cost_func* aCostClass = nullptr) const;
229
230 void Clear();
231 const char* GetScriptClassName() const override { return "WsfCommGraph"; }
232
233private:
236 bool mUserModifiable{false};
237
238 GraphImpl mGraph;
239};
240
241class WSF_EXPORT ScriptCommGraphClass : public UtScriptClass
242{
243public:
244 ScriptCommGraphClass(const std::string& aClassName, UtScriptTypes* aTypesPtr);
245
251 UT_DECLARE_SCRIPT_METHOD(GetIncomingNodeEdges);
252 UT_DECLARE_SCRIPT_METHOD(GetOutgoingNodeEdges);
254
263
267};
268
269} // namespace graph
270} // namespace comm
271} // namespace wsf
272
273#endif
bool operator!=(int aId, const WsfStringInt &aRhs)
Not equal relational operator for the case of an integer on the LHS and a StringId on the RHS.
Definition WsfStringId.hpp:75
bool operator==(int aId, const WsfStringInt &aRhs)
Equal relational operator for the case of an integer on the LHS and a StringId on the RHS.
Definition WsfStringId.hpp:69
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfCommAddress.hpp:57
Definition WsfCommGraph.hpp:98
Edge(const Edge &aSrc)=default
void SetStatic(bool aIsStatic)
Definition WsfCommGraph.hpp:112
const Address & GetSourceAddress() const
Definition WsfCommGraph.hpp:107
bool IsStatic() const
Definition WsfCommGraph.hpp:115
bool IsEnabled() const
Definition WsfCommGraph.hpp:114
void SetWeight(double aWeight)
Definition WsfCommGraph.hpp:113
Edge(bool aEnabled, const Address &aSourceAddress, const Address &aDestinationAddress)
Definition WsfCommGraph.cpp:90
double GetWeight() const
Definition WsfCommGraph.hpp:109
virtual ~Edge()=default
const Address & GetDestinationAddress() const
Definition WsfCommGraph.hpp:108
Edge & operator=(const Edge &aRhs)=default
void SetDisabled()
Definition WsfCommGraph.hpp:111
void SetEnabled()
Definition WsfCommGraph.hpp:110
const char * GetScriptClassName() const override
Definition WsfCommGraph.hpp:117
virtual Edge * Clone() const
Definition WsfCommGraph.cpp:100
virtual const Node * CreateNode(const Address &aAddress)
Definition WsfCommGraph.cpp:162
const char * GetScriptClassName() const override
Definition WsfCommGraph.hpp:231
virtual Edge * InsertEdge(const Node *aSourceNode, const Node *aDestinationNode, bool aIsEnabled, bool aIsStatic=false)
Definition WsfCommGraph.cpp:187
Graph(const Graph &aSrc)=default
virtual Node * FindNode(const Address &aAddress) const
Definition WsfCommGraph.cpp:150
virtual EdgeList GetIncomingNodeEdges(const Node *aNodePtr)
Definition WsfCommGraph.cpp:262
Graph & operator=(const Graph &aRhs)=default
virtual void RemoveNodeEdges(Node *aNode)
Removes all incoming and outgoing edges to this node.
Definition WsfCommGraph.cpp:434
virtual Edge * FindEdge(const Node *aSourceNode, const Node *aDestinationNode)
Definition WsfCommGraph.cpp:238
virtual bool RemoveNode(const Node *aNodePtr)
Definition WsfCommGraph.cpp:169
void SetUserModifiable(bool aCanModify)
Definition WsfCommGraph.hpp:196
virtual ~Graph()=default
virtual EdgeList GetOutgoingNodeEdges(const Node *aNodePtr) const
Definition WsfCommGraph.cpp:289
bool IsUserModifiable() const
Definition WsfCommGraph.hpp:197
virtual EdgeList GetAllNodeEdges(const Node *aNodePtr)
Definition WsfCommGraph.cpp:317
virtual bool EraseEdge(const Node *aSourceNode, const Node *aDestinationNode)
Definition WsfCommGraph.cpp:213
std::vector< const Node * > GetNodes() const
Definition WsfCommGraph.cpp:444
GraphAction
Definition WsfCommGraph.hpp:153
Definition WsfCommGraph.hpp:50
virtual Node * Clone() const
Definition WsfCommGraph.cpp:52
virtual ~Node()=default
Node & operator=(const Node &aRhs)=default
bool IsEnabled() const
Definition WsfCommGraph.hpp:67
Node(const Address &aAddress)
Definition WsfCommGraph.cpp:27
void SetDisabled()
Definition WsfCommGraph.hpp:66
const char * GetScriptClassName() const override
Definition WsfCommGraph.hpp:69
void SetEnabled()
Definition WsfCommGraph.hpp:65
const Address & GetAddress() const
Definition WsfCommGraph.hpp:63
bool operator<(const Node &aRhs) const
Definition WsfCommGraph.cpp:46
Node(const Node &aSrc)=default
UT_DECLARE_SCRIPT_METHOD(GetOutgoingNodeEdges)
ScriptCommGraphClass(const std::string &aClassName, UtScriptTypes *aTypesPtr)
Definition WsfCommGraph.cpp:457
UT_DECLARE_SCRIPT_METHOD(GetIncomingNodeEdges)
ScriptCommGraphEdgeClass(const std::string &aClassName, UtScriptTypes *aTypesPtr)
Definition WsfCommGraph.cpp:106
void Destroy(void *aEdgePtr) override
Definition WsfCommGraph.cpp:120
ScriptCommGraphNodeClass(const std::string &aClassName, UtScriptTypes *aTypesPtr)
Definition WsfCommGraph.cpp:58
void Destroy(void *aNodePtr) override
Definition WsfCommGraph.cpp:70
Definition WsfCommGraph.cpp:22
std::vector< Edge * > EdgeList
Definition WsfCommGraph.hpp:37
std::vector< Address > AddressList
Definition WsfCommGraph.hpp:36
UtGraphT< Node, Edge, true, double > GraphImpl
Definition WsfCommGraph.hpp:35
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Copyrights Multiple, All Rights Reserved