12#ifndef SST_CORE_ELI_ELEMENTINFO_H
13#define SST_CORE_ELI_ELEMENTINFO_H
15#include "sst/core/eli/attributeInfo.h"
16#include "sst/core/eli/categoryInfo.h"
17#include "sst/core/eli/defaultInfo.h"
18#include "sst/core/eli/elementbuilder.h"
19#include "sst/core/eli/elibase.h"
20#include "sst/core/eli/interfaceInfo.h"
21#include "sst/core/eli/paramsInfo.h"
22#include "sst/core/eli/portsInfo.h"
23#include "sst/core/eli/profilePointInfo.h"
24#include "sst/core/eli/simpleInfo.h"
25#include "sst/core/eli/statsInfo.h"
26#include "sst/core/eli/subcompSlotInfo.h"
27#include "sst/core/sst_types.h"
28#include "sst/core/warnmacros.h"
61 static T* get(
const std::string& elemlib,
const std::string& elem)
63 auto libiter = infos().find(elemlib);
64 if ( libiter != infos().end() ) {
65 auto& submap = libiter->second;
66 auto elemiter = submap.find(elem);
67 if ( elemiter != submap.end() ) {
68 return elemiter->second;
74 static void add(
const std::string& elemlib,
const std::string& elem, T* info) { infos()[elemlib][elem] = info; }
77 static std::map<std::string, std::map<std::string, T*>>& infos()
79 static std::map<std::string, std::map<std::string, T*>> infos_;
84template <
class Policy,
class... Policies>
85class BuilderInfoImpl :
public Policy,
public BuilderInfoImpl<Policies...>
87 using Parent = BuilderInfoImpl<Policies...>;
90 template <
class... Args>
91 BuilderInfoImpl(
const std::string& elemlib,
const std::string& elem, Args&&... args) :
93 Parent(elemlib, elem, args...)
95 DataBase<Policy>::add(elemlib, elem,
this);
98 template <
class XMLNode>
99 void outputXML(XMLNode* node)
101 Policy::outputXML(node);
102 Parent::outputXML(node);
105 void toString(std::ostream& os)
const
107 Policy::toString(os);
108 Parent::toString(os);
111 BuilderInfoImpl(
const BuilderInfoImpl&) =
delete;
112 BuilderInfoImpl& operator=(
const BuilderInfoImpl&) =
delete;
116class BuilderInfoImpl<void>
119 template <
class... Args>
120 explicit BuilderInfoImpl(Args&&... UNUSED(args))
123 template <
class XMLNode>
124 void outputXML(XMLNode* UNUSED(node))
127 void toString(std::ostream& UNUSED(os))
const {}
129 BuilderInfoImpl(
const BuilderInfoImpl&) =
delete;
130 BuilderInfoImpl& operator=(
const BuilderInfoImpl&) =
delete;
133template <
class Base,
class T>
136 static bool isLoaded() {
return loaded; }
138 static const bool loaded;
145 using BaseInfo =
typename Base::BuilderInfo;
147 explicit InfoLibrary(
const std::string& name) :
151 BaseInfo* getInfo(
const std::string& name)
153 auto iter = infos_.find(name);
154 if ( iter == infos_.end() ) {
162 bool hasInfo(
const std::string& name)
const {
return infos_.find(name) != infos_.end(); }
164 int numEntries(
bool exclude_aliases =
false)
const
166 if ( !exclude_aliases )
return infos_.size();
168 for (
auto x : infos_ ) {
169 if ( x.first != x.second->getAlias() ) ++count;
174 const std::map<std::string, BaseInfo*>& getMap()
const {
return infos_; }
176 void readdInfo(
const std::string& name, BaseInfo* info)
181 const std::string& alias = info->getAlias();
182 if ( !alias.empty() ) infos_[alias] = info;
185 bool addInfo(
const std::string& elem, BaseInfo* info)
187 readdInfo(elem, info);
189 addLoader(name_, elem, info);
194 void addLoader(
const std::string& lib,
const std::string& name, BaseInfo* info);
196 std::map<std::string, BaseInfo*> infos_;
206 using BaseInfo =
typename Library::BaseInfo;
207 using Map = std::map<std::string, Library*>;
209 static std::vector<std::string> getRegisteredElementNames()
214 std::vector<std::string> ret;
216 for (
auto& [name, lib] : libraries() ) {
217 for (
auto& [elemlib, info] : lib->getMap() ) {
218 ret.push_back(name +
"." + elemlib);
224 static Library* getLibrary(
const std::string& name)
226 auto& lib = libraries()[name];
227 if ( !lib ) lib =
new Library(name);
233 static Map& libraries()
240template <
class Base,
class Info>
243 InfoLoader(
const std::string& elemlib,
const std::string& elem, Info* info) :
251 auto* lib = InfoLibraryDatabase<Base>::getLibrary(elemlib_);
252 if ( !lib->hasInfo(elem_) ) {
253 lib->readdInfo(elem_, info_);
258 std::string elemlib_;
262 InfoLoader(
const InfoLoader&) =
delete;
263 InfoLoader& operator=(
const InfoLoader&) =
delete;
268InfoLibrary<Base>::addLoader(
const std::string& elemlib,
const std::string& elem, BaseInfo* info)
271 LoadedLibraries::addLoader(elemlib, elem, info->getAlias(), loader);
279 return InfoLibraryDatabase<Base>::getLibrary(name);
285 return Base::template addDerivedInfo<T>(T::ELI_getLibrary(), T::ELI_getName());
289template <
class Base,
class T>
297 return InfoLibraryDatabase<T>::getLibrary(name);
301 static std::vector<std::string> getRegisteredElementNames()
303 return InfoLibraryDatabase<T>::getRegisteredElementNames();
307void force_instantiate_bool(
bool b,
const char* name);
312 static bool ELI_isLoaded() {
return T::ELI_isLoaded(); }
323 const unsigned major;
324 const unsigned minor;
325 const unsigned tertiary;
327 constexpr unsigned getMajor()
const {
return major; }
328 constexpr unsigned getMinor()
const {
return minor; }
329 constexpr unsigned getTertiary()
const {
return tertiary; }
335 return ver.getMajor();
339SST_ELI_getMinorNumberFromVersion(SST_ELI_element_version_extraction ver)
341 return ver.getMinor();
347 return ver.getTertiary();
354#define SST_ELI_DECLARE_INFO(...) \
355 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<__VA_ARGS__, SST::ELI::ProvidesDefaultInfo, void>; \
356 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info) \
358 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \
360 SST_ELI_DECLARE_INFO_COMMON()
362#define SST_ELI_DECLARE_DEFAULT_INFO() \
363 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, void>; \
364 template <class BuilderImpl> \
365 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderImpl* info) \
367 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \
369 SST_ELI_DECLARE_INFO_COMMON()
371#define SST_ELI_DECLARE_INFO_EXTERN(...) \
372 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, __VA_ARGS__, void>; \
373 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info); \
374 SST_ELI_DECLARE_INFO_COMMON()
376#define SST_ELI_DECLARE_DEFAULT_INFO_EXTERN() \
377 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, void>; \
378 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info); \
379 SST_ELI_DECLARE_INFO_COMMON()
381#define SST_ELI_DEFINE_INFO_EXTERN(base) \
382 bool base::addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info) \
384 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \
387#define SST_ELI_EXTERN_DERIVED(base, cls, lib, name, version, desc) \
388 bool ELI_isLoaded(); \
389 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc)
396#ifdef __INTEL_COMPILER
397#define SST_ELI_FORCE_INSTANTIATION(base, cls) \
399 struct ELI_ForceRegister \
401 ELI_ForceRegister() \
403 bool b = SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \
404 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \
405 SST::ELI::force_instantiate_bool(b, #cls); \
408 ELI_ForceRegister<cls> force_instantiate;
413#define SST_ELI_EXPORT(cls) template class SST::ELI::ForceExport<cls>;
415#define SST_ELI_FORCE_INSTANTIATION(base, cls)
416#define SST_ELI_EXPORT(cls)
427#define SST_ELI_REGISTER_DERIVED(base, cls, lib, name, version, desc) \
429 static constexpr int __EliDerivedLevel = std::is_same_v<base, cls> ? __EliBaseLevel : __EliBaseLevel + 1; \
430 static bool ELI_isLoaded() \
432 return SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \
433 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \
435 SST_ELI_FORCE_INSTANTIATION(base, cls) \
436 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc)
438#define SST_ELI_REGISTER_EXTERN(base, cls) \
439 bool cls::ELI_isLoaded() \
441 return SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \
442 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \
Main component object for the simulation.
Definition baseComponent.h:62
Main component object for the simulation.
Definition component.h:31
Definition elementinfo.h:59
Definition elementinfo.h:203
Definition elementinfo.h:143
Module is a tag class used with the loadModule function.
Definition module.h:26
Base class for Partitioning graphs.
Definition sstpart.h:32
An event to trigger at a real-time interval.
Definition realtimeAction.h:32
Base class for python modules in element libraries.
Definition element_python.h:133
Forms the base class for statistics gathering within SST.
Definition statbase.h:49
Forms the template defined base class for statistics gathering within SST.
Definition statbase.h:373
SubComponent is a class loadable through the factory which allows dynamic functionality to be added t...
Definition subcomponent.h:29
Definition elementinfo.h:276
Definition elementinfo.h:311
Definition elementinfo.h:293
Definition elementinfo.h:242
Definition elementinfo.h:135