WSF
WsfCommMediumFactory.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 WSFCOMMMEDIUMFACTORY_HPP
13#define WSFCOMMMEDIUMFACTORY_HPP
14
15#include <memory>
16#include <unordered_map>
17
20#include "WsfScenario.hpp"
21
22namespace wsf
23{
24namespace comm
25{
26namespace medium
27{
28
34{
36 friend class FactoryManager;
37
38public:
39 using FactoryMap = std::unordered_map<int, std::unique_ptr<FactoryInterface>>;
40
41 FactoryInterface(int aMediumIdentifier)
42 : mMediumIdentifier(aMediumIdentifier)
43 {
44 }
45 virtual ~FactoryInterface() = default;
46
47 int GetMediumIdentifier() const { return mMediumIdentifier; }
48
49 virtual void PreInput(Container& aParent) {}
50
51 virtual bool ProcessInput(UtInput& aInput, Container& aParent) { return false; }
52
53 virtual bool ProcessAddOrEditCommand(UtInput& aInput, Container& aParent, bool aIsAdding) { return false; }
54
55 virtual bool ProcessDeleteCommand(UtInput& aInput, Container& aParent) { return false; }
56
57 virtual bool PreInitialize(double aSimTime, Container& aParent) { return true; }
58
59protected:
60 WsfScenario& GetScenario() const { return *mScenarioPtr; }
61
62private:
63 void SetScenario(WsfScenario& aScenario) { mScenarioPtr = &aScenario; }
64
65 WsfScenario* mScenarioPtr{nullptr};
66 int mMediumIdentifier{0};
67};
68
71template<typename MEDIUM_TYPE>
73{
74public:
75 static_assert(std::is_base_of<Medium, MEDIUM_TYPE>::value,
76 "FactoryList must be a template of a derived class of wsf::comm::medium::Medium");
78 : FactoryInterface(cMEDIUM_ROLE<MEDIUM_TYPE>())
79 {
80 }
81 virtual ~Factory() override = default;
82};
83
94{
95public:
96 using FactoryMap = std::unordered_map<int, std::unique_ptr<FactoryInterface>>;
97
99 : mScenarioPtr(&aScenario)
100 {
101 }
102 virtual ~FactoryManager() = default;
103 FactoryManager(const FactoryManager& aSrc) = delete;
105
107 template<typename MEDIUM_TYPE>
108 void AddFactory(std::unique_ptr<Factory<MEDIUM_TYPE>> aFactory)
109 {
110 auto it = mFactoryMap.find(cMEDIUM_ROLE<MEDIUM_TYPE>());
111 if (it != std::end(mFactoryMap))
112 {
113 throw UtException("Attempting to add a factory to a medium type that is already registered.");
114 }
115
116 aFactory->SetScenario(*mScenarioPtr);
117 mFactoryMap[cMEDIUM_ROLE<MEDIUM_TYPE>()] = std::move(aFactory);
118 }
119
120 bool ProcessInput(UtInput& aInput, Container& aParent) const
121 {
122 const auto& validMediums = aParent.GetValidMediums();
123 for (auto mediumIdentifier : validMediums)
124 {
125 auto it = mFactoryMap.find(mediumIdentifier);
126 if (it != std::end(mFactoryMap))
127 {
128 if (it->second->ProcessInput(aInput, aParent))
129 {
130 return true;
131 }
132 }
133 }
134 return false;
135 }
136
137 bool ProcessAddOrEditCommand(UtInput& aInput, Container& aParent, bool aIsAdding) const
138 {
139 const auto& validMediums = aParent.GetValidMediums();
140 for (auto mediumIdentifier : validMediums)
141 {
142 auto it = mFactoryMap.find(mediumIdentifier);
143 if (it != std::end(mFactoryMap))
144 {
145 if (it->second->ProcessAddOrEditCommand(aInput, aParent, aIsAdding))
146 {
147 return true;
148 }
149 }
150 }
151 return false;
152 }
153
154 bool ProcessDeleteCommand(UtInput& aInput, Container& aParent) const
155 {
156 auto command = aInput.GetCommand();
157 if (command == "medium")
158 {
159 std::string type;
160 aInput.ReadValue(type);
161 auto mediumPtr = aParent.GetMedium();
162
163 if (mediumPtr && (mediumPtr->GetType() == type))
164 {
165 auto mediumIdentifier = mediumPtr->GetMediumIdentifier();
166 auto it = mFactoryMap.find(mediumIdentifier);
167 if (it != std::end(mFactoryMap))
168 {
169 return it->second->ProcessDeleteCommand(aInput, aParent);
170 }
171 }
172
173 throw UtInput::BadValue(aInput, "Unknown medium type to delete: " + type);
174 }
175 return false;
176 }
177
178private:
179 WsfScenario* mScenarioPtr{nullptr};
180 FactoryMap mFactoryMap{};
181};
182
183} // namespace medium
184} // namespace comm
185} // namespace wsf
186
187#endif
Contains the data required to create a simulation, and acts as the entry point for input file process...
Definition WsfScenario.hpp:111
Definition WsfCommMediumContainer.hpp:43
const std::set< TypeIdentifier > & GetValidMediums() const
Definition WsfCommMediumContainer.hpp:82
Medium * GetMedium() const
Definition WsfCommMediumContainer.hpp:60
virtual bool ProcessDeleteCommand(UtInput &aInput, Container &aParent)
Definition WsfCommMediumFactory.hpp:55
WsfScenario & GetScenario() const
Definition WsfCommMediumFactory.hpp:60
friend class FactoryManager
Required for SetScenario().
Definition WsfCommMediumFactory.hpp:36
FactoryInterface(int aMediumIdentifier)
Definition WsfCommMediumFactory.hpp:41
virtual void PreInput(Container &aParent)
Definition WsfCommMediumFactory.hpp:49
virtual bool ProcessInput(UtInput &aInput, Container &aParent)
Definition WsfCommMediumFactory.hpp:51
std::unordered_map< int, std::unique_ptr< FactoryInterface > > FactoryMap
Definition WsfCommMediumFactory.hpp:39
virtual bool ProcessAddOrEditCommand(UtInput &aInput, Container &aParent, bool aIsAdding)
Definition WsfCommMediumFactory.hpp:53
virtual bool PreInitialize(double aSimTime, Container &aParent)
Definition WsfCommMediumFactory.hpp:57
int GetMediumIdentifier() const
Definition WsfCommMediumFactory.hpp:47
bool ProcessInput(UtInput &aInput, Container &aParent) const
Definition WsfCommMediumFactory.hpp:120
void AddFactory(std::unique_ptr< Factory< MEDIUM_TYPE > > aFactory)
Template function requires provision of derived type to ensure correct functionality/assignments.
Definition WsfCommMediumFactory.hpp:108
FactoryManager(const FactoryManager &aSrc)=delete
FactoryManager(WsfScenario &aScenario)
Definition WsfCommMediumFactory.hpp:98
std::unordered_map< int, std::unique_ptr< FactoryInterface > > FactoryMap
Definition WsfCommMediumFactory.hpp:96
bool ProcessDeleteCommand(UtInput &aInput, Container &aParent) const
Definition WsfCommMediumFactory.hpp:154
bool ProcessAddOrEditCommand(UtInput &aInput, Container &aParent, bool aIsAdding) const
Definition WsfCommMediumFactory.hpp:137
FactoryManager(FactoryManager &&aSrc)=delete
Definition WsfCommMediumFactory.hpp:73
virtual ~Factory() override=default
Factory()
Definition WsfCommMediumFactory.hpp:77
Definition WsfCommMedium.cpp:31
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfCommMediumTypeIdentifier.hpp:45
Copyrights Multiple, All Rights Reserved