00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef SST_CORE_COMPONENTINFO_H
00013 #define SST_CORE_COMPONENTINFO_H
00014
00015 #include <sst/core/sst_types.h>
00016 #include <sst/core/serialization.h>
00017
00018 #include <unordered_set>
00019 #include <string>
00020 #include <functional>
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 namespace SST {
00033
00034 class LinkMap;
00035 class Component;
00036
00037 struct ComponentInfo {
00038
00039 friend class Simulation;
00040
00041 private:
00042 const ComponentId_t id;
00043 const std::string name;
00044 const std::string type;
00045 LinkMap* link_map;
00046 Component* component;
00047
00048 inline void setComponent(Component* comp) { component = comp; }
00049
00050
00051 public:
00052 ComponentInfo(ComponentId_t id, std::string name, std::string type, LinkMap* link_map) :
00053 id(id),
00054 name(name),
00055 type(type),
00056 link_map(link_map)
00057 {}
00058
00059 ~ComponentInfo();
00060
00061
00062
00063
00064
00065
00066
00067
00068 inline ComponentId_t getID() const { return id; }
00069
00070 inline const std::string& getName() const { return name; }
00071
00072 inline const std::string& getType() const { return type; }
00073
00074 inline Component* getComponent() const { return component; }
00075
00076 inline LinkMap* getLinkMap() const { return link_map; }
00077
00078
00079 struct HashName {
00080 size_t operator() (const ComponentInfo* info) const {
00081 std::hash<std::string> hash;
00082 return hash(info->name);
00083 }
00084 };
00085
00086 struct EqualsName {
00087 bool operator() (const ComponentInfo* lhs, const ComponentInfo* rhs) const {
00088 return lhs->name == rhs->name;
00089 }
00090 };
00091
00092 struct HashID {
00093 size_t operator() (const ComponentInfo* info) const {
00094 std::hash<ComponentId_t> hash;
00095 return hash(info->id);
00096 }
00097 };
00098
00099 struct EqualsID {
00100 bool operator() (const ComponentInfo* lhs, const ComponentInfo* rhs) const {
00101 return lhs->id == rhs->id;
00102 }
00103 };
00104
00105 };
00106
00107
00108 class ComponentInfoMap {
00109 private:
00110 std::unordered_set<ComponentInfo*, ComponentInfo::HashName, ComponentInfo::EqualsName> dataByName;
00111 std::unordered_set<ComponentInfo*, ComponentInfo::HashID, ComponentInfo::EqualsID> dataByID;
00112
00113 public:
00114 typedef std::unordered_set<ComponentInfo*, ComponentInfo::HashName, ComponentInfo::EqualsName>::const_iterator const_iterator;
00115
00116 const_iterator begin() const {
00117 return dataByName.begin();
00118 }
00119
00120 const_iterator end() const {
00121 return dataByName.end();
00122 }
00123
00124 ComponentInfoMap() {}
00125
00126 void insert(ComponentInfo* info) {
00127 dataByName.insert(info);
00128 dataByID.insert(info);
00129 }
00130
00131 ComponentInfo* getByName(const std::string& key) const {
00132 ComponentInfo infoKey(0, key, "", NULL);
00133 auto value = dataByName.find(&infoKey);
00134 if ( value == dataByName.end() ) return NULL;
00135 return *value;
00136 }
00137
00138 ComponentInfo* getByID(const ComponentId_t key) const {
00139 ComponentInfo infoKey(key, "", "", NULL);
00140 auto value = dataByID.find(&infoKey);
00141 if ( value == dataByID.end() ) return NULL;
00142 return *value;
00143 }
00144
00145 };
00146
00147 }
00148
00149 #endif // SST_CORE_COMPONENTINFO_H