WSF
WsfCommMediumContainer.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 2019 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 WSFCOMMMEDIUMCONTAINER_HPP
13#define WSFCOMMMEDIUMCONTAINER_HPP
14
15#include "wsf_export.h"
16
17#include <memory>
18#include <set>
19
20#include "UtInput.hpp"
21#include "WsfCommMedium.hpp"
23#include "WsfComponent.hpp"
25#include "WsfComponentRoles.hpp"
26#include "WsfScenario.hpp"
27#include "WsfSimulation.hpp"
28
29namespace wsf
30{
31namespace comm
32{
33namespace medium
34{
35
43{
44public:
52
53 Container(const WsfScenario& aScenario)
54 : mScenario(aScenario)
55 {
56 }
57 Container(const Container& aSrc);
58 virtual ~Container() = default;
59
60 Medium* GetMedium() const { return mMedium.get(); }
61 void SetMedium(std::shared_ptr<Medium> aMedium) { mMedium = aMedium; }
62
68 virtual bool ProcessInput(UtInput& aInput);
69
70 virtual bool Initialize(double aSimTime);
71
74 void SetSimulation(WsfSimulation* aSimPtr) { mSimPtr = aSimPtr; }
75
80 virtual bool ProcessContainerInput(UtInput& aInput, InputAction aAction = cNONE);
81
82 const std::set<TypeIdentifier>& GetValidMediums() const { return mValidMediums; }
83
87 void AddValidMedium(TypeIdentifier aValue);
88
92 void AddForbiddenMedium(TypeIdentifier aValue);
93
95 bool IsValidMedium(TypeIdentifier aValue) const;
96
103
104 void SetDefaultMedium(TypeIdentifier aValue);
105 TypeIdentifier GetDefaultMedium() const { return mDefaultMedium; }
107
111 virtual bool AddDefaultMedium();
112
113 const WsfScenario& GetScenario() const { return mScenario; }
114
115private:
116 const WsfScenario& mScenario;
117 WsfSimulation* mSimPtr{nullptr};
118 std::shared_ptr<Medium> mMedium{nullptr};
119 std::set<TypeIdentifier> mValidMediums{};
120 std::set<TypeIdentifier> mForbiddenMediums{};
121 TypeIdentifier mDefaultMedium{TypeIdentifier::cNONE};
122};
123
124// Forward declare
125template<typename PARENT>
127
129template<typename PARENT>
131{
132public:
133 bool ProcessAddOrEditCommand(UtInput& aInput, PARENT& aParent, bool aIsAdding) override
134 {
135 // This is a wrapper for medium usage. Redirect input back to the container for proper processing.
136 auto containerPtr = wsf::comm::medium::ContainerComponent<PARENT>::Find(aParent);
137 if (containerPtr)
138 {
140 if (aIsAdding)
141 {
143 }
144 else
145 {
147 }
148
149 return containerPtr->ProcessContainerInput(aInput, action);
150 }
151
152 return false;
153 }
154
155 bool ProcessDeleteCommand(UtInput& aInput, PARENT& aParent) override
156 {
157 // This is a wrapper for medium usage. Redirect input back to the container for proper processing.
158 auto containerPtr = wsf::comm::medium::ContainerComponent<PARENT>::Find(aParent);
159 if (containerPtr)
160 {
162 return containerPtr->ProcessContainerInput(aInput, action);
163 }
164
165 return false;
166 }
167
168 bool PreInitialize(double aSimTime, PARENT& aParent) override
169 {
170 // At the time PreInitialize is called, all input has been parsed.
171 // If user input has not resulted in a viable medium added to the container,
172 // a default instance is required.
173 auto containerPtr = wsf::comm::medium::ContainerComponent<PARENT>::Find(aParent);
174 if (containerPtr && !containerPtr->GetMedium())
175 {
176 return containerPtr->AddDefaultMedium();
177 }
178
179 return true;
180 }
181};
182
184
202template<typename PARENT>
203class ContainerComponent : public Container, public WsfComponentT<PARENT>
204{
205public:
207 : Container(aScenario)
208 {
209 }
210
213 bool Initialize(double aSimTime) override { return Container::Initialize(aSimTime); }
214
217 bool ProcessInput(UtInput& aInput) override { return Container::ProcessInput(aInput); }
218
219 ~ContainerComponent() override = default;
220
224
225 static ContainerComponent<PARENT>* Find(const PARENT& aParent)
226 {
227 const auto& components = aParent.GetComponents();
228 auto containerPtr = components.template GetComponent<ContainerComponent<PARENT>>();
229
230 return containerPtr;
231 }
232
233 static ContainerComponent<PARENT>* FindOrCreate(PARENT& aParent, const WsfScenario& aScenario)
234 {
235 auto containerPtr = Find(aParent);
236 if (!containerPtr)
237 {
238 auto clonedContainer = ut::make_unique<ContainerComponent<PARENT>>(aScenario);
239 auto& components = aParent.GetComponents();
240 if (components.AddComponent(clonedContainer.get()))
241 {
242 containerPtr = clonedContainer.release();
243 }
244 }
245 return containerPtr;
246 }
247
248
250
251 WsfComponent* CloneComponent() const override { return new ContainerComponent<PARENT>(*this); }
253 const int* GetComponentRoles() const override
254 {
256
257 return roles;
258 }
259
260 void* QueryInterface(int aRole) override
261 {
263 {
264 return this;
265 }
266
267 return nullptr;
268 }
269
270};
271
272} // namespace medium
273} // namespace comm
274} // namespace wsf
275
276#endif
@ cWSF_COMPONENT_NULL
A special entry to indicate the end of the list of roles assumed by a component.
Definition WsfComponentRoles.hpp:92
UtStringId WsfStringId
WsfStringId – the same thing as UtStringId.
Definition WsfStringId.hpp:23
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
WsfComponentFactory()
Definition WsfComponentFactory.hpp:56
WsfComponentT()
Definition WsfComponent.hpp:124
Definition WsfComponent.hpp:39
Contains the data required to create a simulation, and acts as the entry point for input file process...
Definition WsfScenario.hpp:111
The main controller for a simulation.
Definition WsfSimulation.hpp:109
Definition WsfCommMediumContainer.hpp:204
static ContainerComponent< PARENT > * Find(const PARENT &aParent)
Definition WsfCommMediumContainer.hpp:225
const int * GetComponentRoles() const override
Definition WsfCommMediumContainer.hpp:253
bool Initialize(double aSimTime) override
Definition WsfCommMediumContainer.hpp:213
ContainerComponent(const WsfScenario &aScenario)
Definition WsfCommMediumContainer.hpp:206
WsfComponent * CloneComponent() const override
Required method implementations for components.
Definition WsfCommMediumContainer.hpp:251
void * QueryInterface(int aRole) override
Definition WsfCommMediumContainer.hpp:260
bool ProcessInput(UtInput &aInput) override
Definition WsfCommMediumContainer.hpp:217
WsfStringId GetComponentName() const override
Definition WsfCommMediumContainer.hpp:252
static ContainerComponent< PARENT > * FindOrCreate(PARENT &aParent, const WsfScenario &aScenario)
Definition WsfCommMediumContainer.hpp:233
A template class for common medium component factory registration.
Definition WsfCommMediumContainer.hpp:131
bool ProcessDeleteCommand(UtInput &aInput, PARENT &aParent) override
Definition WsfCommMediumContainer.hpp:155
bool ProcessAddOrEditCommand(UtInput &aInput, PARENT &aParent, bool aIsAdding) override
Definition WsfCommMediumContainer.hpp:133
bool PreInitialize(double aSimTime, PARENT &aParent) override
Definition WsfCommMediumContainer.hpp:168
Definition WsfCommMediumContainer.hpp:43
InputAction
Definition WsfCommMediumContainer.hpp:46
@ cDELETE
Definition WsfCommMediumContainer.hpp:50
@ cEDIT
Definition WsfCommMediumContainer.hpp:49
@ cADD
Definition WsfCommMediumContainer.hpp:48
@ cNONE
Definition WsfCommMediumContainer.hpp:47
virtual bool Initialize(double aSimTime)
Definition WsfCommMediumContainer.cpp:147
TypeIdentifier GetDefaultMedium() const
Definition WsfCommMediumContainer.hpp:105
const std::set< TypeIdentifier > & GetValidMediums() const
Definition WsfCommMediumContainer.hpp:82
Medium * GetMedium() const
Definition WsfCommMediumContainer.hpp:60
virtual ~Container()=default
void SetMedium(std::shared_ptr< Medium > aMedium)
Definition WsfCommMediumContainer.hpp:61
void SetSimulation(WsfSimulation *aSimPtr)
Definition WsfCommMediumContainer.hpp:74
virtual bool ProcessInput(UtInput &aInput)
Definition WsfCommMediumContainer.cpp:83
const WsfScenario & GetScenario() const
Definition WsfCommMediumContainer.hpp:113
Container(const WsfScenario &aScenario)
Definition WsfCommMediumContainer.hpp:53
Definition WsfCommMedium.hpp:113
Definition WsfCommMedium.cpp:31
TypeIdentifier
Definition WsfCommMediumTypeIdentifier.hpp:50
@ cNONE
Definition WsfCommMediumTypeIdentifier.hpp:51
WSF_EXPORT WsfStringId GetContainerComponentName()
Definition WsfCommMediumContainer.cpp:211
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfComponentRoles.hpp:60
Copyrights Multiple, All Rights Reserved