12#ifndef WSFCOMMMEDIUMFACTORY_HPP
13#define WSFCOMMMEDIUMFACTORY_HPP
16#include <unordered_map>
39 using FactoryMap = std::unordered_map<int, std::unique_ptr<FactoryInterface>>;
42 : mMediumIdentifier(aMediumIdentifier)
63 void SetScenario(
WsfScenario& aScenario) { mScenarioPtr = &aScenario; }
66 int mMediumIdentifier{0};
71template<
typename MEDIUM_TYPE>
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");
96 using FactoryMap = std::unordered_map<int, std::unique_ptr<FactoryInterface>>;
99 : mScenarioPtr(&aScenario)
107 template<
typename MEDIUM_TYPE>
111 if (it != std::end(mFactoryMap))
113 throw UtException(
"Attempting to add a factory to a medium type that is already registered.");
116 aFactory->SetScenario(*mScenarioPtr);
123 for (
auto mediumIdentifier : validMediums)
125 auto it = mFactoryMap.find(mediumIdentifier);
126 if (it != std::end(mFactoryMap))
128 if (it->second->ProcessInput(aInput, aParent))
140 for (
auto mediumIdentifier : validMediums)
142 auto it = mFactoryMap.find(mediumIdentifier);
143 if (it != std::end(mFactoryMap))
145 if (it->second->ProcessAddOrEditCommand(aInput, aParent, aIsAdding))
156 auto command = aInput.GetCommand();
157 if (command ==
"medium")
160 aInput.ReadValue(type);
163 if (mediumPtr && (mediumPtr->GetType() == type))
165 auto mediumIdentifier = mediumPtr->GetMediumIdentifier();
166 auto it = mFactoryMap.find(mediumIdentifier);
167 if (it != std::end(mFactoryMap))
169 return it->second->ProcessDeleteCommand(aInput, aParent);
173 throw UtInput::BadValue(aInput,
"Unknown medium type to delete: " + type);
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 ~FactoryInterface()=default
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
virtual ~FactoryManager()=default
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