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/checkpointableInfo.h" 18 #include "sst/core/eli/defaultInfo.h" 19 #include "sst/core/eli/elementbuilder.h" 20 #include "sst/core/eli/elibase.h" 21 #include "sst/core/eli/interfaceInfo.h" 22 #include "sst/core/eli/paramsInfo.h" 23 #include "sst/core/eli/portsInfo.h" 24 #include "sst/core/eli/profilePointInfo.h" 25 #include "sst/core/eli/simpleInfo.h" 26 #include "sst/core/eli/statsInfo.h" 27 #include "sst/core/eli/subcompSlotInfo.h" 28 #include "sst/core/sst_types.h" 29 #include "sst/core/warnmacros.h" 44 namespace Statistics {
62 static T*
get(
const std::string& elemlib,
const std::string& elem)
64 auto libiter = infos().find(elemlib);
65 if ( libiter != infos().end() ) {
66 auto& submap = libiter->second;
67 auto elemiter = submap.find(elem);
68 if ( elemiter != submap.end() ) {
69 return elemiter->second;
75 static void add(
const std::string& elemlib,
const std::string& elem, T* info) { infos()[elemlib][elem] = info; }
78 static std::map<std::string, std::map<std::string, T*>>& infos()
80 static std::map<std::string, std::map<std::string, T*>> infos_;
85 template <
class Policy,
class... Policies>
91 template <
class... Args>
92 BuilderInfoImpl(
const std::string& elemlib,
const std::string& elem, Args&&... args) :
94 Parent(elemlib, elem, args...)
99 template <
class XMLNode>
100 void outputXML(XMLNode* node)
102 Policy::outputXML(node);
103 Parent::outputXML(node);
106 void toString(std::ostream& os)
const 108 Policy::toString(os);
109 Parent::toString(os);
120 template <
class... Args>
124 template <
class XMLNode>
125 void outputXML(XMLNode* UNUSED(node))
128 void toString(std::ostream& UNUSED(os))
const {}
134 template <
class Base>
138 using BaseInfo =
typename Base::BuilderInfo;
144 BaseInfo* getInfo(
const std::string& name)
146 auto iter = infos_.find(name);
147 if ( iter == infos_.end() ) {
155 bool hasInfo(
const std::string& name)
const {
return infos_.find(name) != infos_.end(); }
157 int numEntries(
bool exclude_aliases =
false)
const 159 if ( !exclude_aliases )
return infos_.size();
161 for (
auto x : infos_ ) {
162 if ( x.first != x.second->getAlias() ) ++count;
167 const std::map<std::string, BaseInfo*>& getMap()
const {
return infos_; }
169 void readdInfo(
const std::string& name, BaseInfo* info)
174 const std::string& alias = info->getAlias();
175 if ( !alias.empty() ) infos_[alias] = info;
178 bool addInfo(
const std::string& elem, BaseInfo* info)
180 readdInfo(elem, info);
182 addLoader(name_, elem, info);
187 void addLoader(
const std::string& lib,
const std::string& name, BaseInfo* info);
189 std::map<std::string, BaseInfo*> infos_;
194 template <
class Base>
199 using BaseInfo =
typename Library::BaseInfo;
200 using Map = std::map<std::string, Library*>;
202 static std::vector<std::string> getRegisteredElementNames()
207 std::vector<std::string> ret;
209 for (
auto& [name, lib] : libraries() ) {
210 for (
auto& [elemlib, info] : lib->getMap() ) {
211 ret.push_back(name +
"." + elemlib);
217 static Library* getLibrary(
const std::string& name)
219 auto& lib = libraries()[name];
220 if ( !lib ) lib =
new Library(name);
226 static Map& libraries()
233 template <
class Base,
class Info>
236 InfoLoader(
const std::string& elemlib,
const std::string& elem, Info* info) :
245 if ( !lib->hasInfo(elem_) ) {
246 lib->readdInfo(elem_, info_);
251 std::string elemlib_;
259 template <
class Base>
264 LoadedLibraries::addLoader(elemlib, elem, info->getAlias(), loader);
267 template <
class Base>
278 return Base::template addDerivedInfo<T>(T::ELI_getLibrary(), T::ELI_getName());
282 template <
class Base,
class T>
285 static bool isLoaded() {
return loaded; }
299 static std::vector<std::string> getRegisteredElementNames()
305 void force_instantiate_bool(
bool b,
const char* name);
310 static bool ELI_isLoaded() {
return T::ELI_isLoaded(); }
321 const unsigned major;
322 const unsigned minor;
323 const unsigned tertiary;
325 constexpr
unsigned getMajor()
const {
return major; }
326 constexpr
unsigned getMinor()
const {
return minor; }
327 constexpr
unsigned getTertiary()
const {
return tertiary; }
333 return ver.getMajor();
337 SST_ELI_getMinorNumberFromVersion(SST_ELI_element_version_extraction ver)
339 return ver.getMinor();
343 SST_ELI_getTertiaryNumberFromVersion(SST_ELI_element_version_extraction ver)
345 return ver.getTertiary();
352 #define SST_ELI_DECLARE_INFO(...) \ 353 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<__VA_ARGS__, SST::ELI::ProvidesDefaultInfo, void>; \ 354 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info) \ 356 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \ 358 SST_ELI_DECLARE_INFO_COMMON() 360 #define SST_ELI_DECLARE_DEFAULT_INFO() \ 361 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, void>; \ 362 template <class BuilderImpl> \ 363 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderImpl* info) \ 365 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \ 367 SST_ELI_DECLARE_INFO_COMMON() 369 #define SST_ELI_DECLARE_INFO_EXTERN(...) \ 370 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, __VA_ARGS__, void>; \ 371 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info); \ 372 SST_ELI_DECLARE_INFO_COMMON() 374 #define SST_ELI_DECLARE_DEFAULT_INFO_EXTERN() \ 375 using BuilderInfo = ::SST::ELI::BuilderInfoImpl<SST::ELI::ProvidesDefaultInfo, void>; \ 376 static bool addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info); \ 377 SST_ELI_DECLARE_INFO_COMMON() 379 #define SST_ELI_DEFINE_INFO_EXTERN(base) \ 380 bool base::addInfo(const std::string& elemlib, const std::string& elem, BuilderInfo* info) \ 382 return ::SST::ELI::InfoDatabase::getLibrary<__LocalEliBase>(elemlib)->addInfo(elem, info); \ 385 #define SST_ELI_EXTERN_DERIVED(base, cls, lib, name, version, desc) \ 386 bool ELI_isLoaded(); \ 387 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) 394 #ifdef __INTEL_COMPILER 395 #define SST_ELI_FORCE_INSTANTIATION(base, cls) \ 397 struct ELI_ForceRegister \ 399 ELI_ForceRegister() \ 401 bool b = SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \ 402 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \ 403 SST::ELI::force_instantiate_bool(b, #cls); \ 406 ELI_ForceRegister<cls> force_instantiate; 411 #define SST_ELI_EXPORT(cls) template class SST::ELI::ForceExport<cls>; 413 #define SST_ELI_FORCE_INSTANTIATION(base, cls) 414 #define SST_ELI_EXPORT(cls) 425 #define SST_ELI_REGISTER_DERIVED(base, cls, lib, name, version, desc) \ 427 static constexpr int __EliDerivedLevel = std::is_same_v<base, cls> ? __EliBaseLevel : __EliBaseLevel + 1; \ 428 static bool ELI_isLoaded() \ 430 return SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \ 431 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \ 433 SST_ELI_FORCE_INSTANTIATION(base, cls) \ 434 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) 436 #define SST_ELI_REGISTER_EXTERN(base, cls) \ 437 bool cls::ELI_isLoaded() \ 439 return SST::ELI::InstantiateBuilder<base, cls>::isLoaded() && \ 440 SST::ELI::InstantiateBuilderInfo<base, cls>::isLoaded(); \ 445 #endif // SST_CORE_ELI_ELEMENTINFO_H Definition: elementinfo.h:234
Forms the base class for statistics gathering within SST.
Definition: statbase.h:49
Definition: elementinfo.h:283
Definition: elementinfo.h:290
Forms the template defined base class for statistics gathering within SST.
Definition: elementinfo.h:46
Definition: elementinfo.h:195
Definition: elementinfo.h:268
Definition: elementinfo.h:86
Definition: elementinfo.h:308
Definition: elibase.h:124
Definition: elementinfo.h:135
Definition: rankInfo.h:23
Definition: elementinfo.h:59
Base class for python modules in element libraries.
Definition: element_python.h:132