00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _SST_FACTORY_H
00014 #define _SST_FACTORY_H
00015
00016 #include <boost/foreach.hpp>
00017
00018 #include <sst/core/sst.h>
00019 #include <sst/core/component.h>
00020 #include <sst/core/introspector.h>
00021 #include <sst/core/element.h>
00022
00023 namespace SST {
00024
00025 class SimulationBase;
00026 struct FactoryLoaderData;
00027
00028 class Factory {
00029 public:
00030 Component* CreateComponent(ComponentId_t id, std::string componentname,
00031 Component::Params_t& params);
00032 void RegisterEvent(std::string eventname);
00033
00034 private:
00035 friend class SST::SimulationBase;
00036
00037 typedef std::map<std::string, const ElementLibraryInfo*> eli_map_t;
00038 typedef std::map<std::string, const ElementInfoComponent*> eic_map_t;
00039 typedef std::map<std::string, const ElementInfoEvent*> eie_map_t;
00040
00041 Factory(std::string searchPaths);
00042 ~Factory();
00043
00044 Factory();
00045 Factory(Factory const&);
00046 void operator=(Factory const&);
00047
00048
00049 const ElementLibraryInfo* findLibrary(std::string name);
00050
00051 const ElementLibraryInfo* loadLibrary(std::string name);
00052
00053 eli_map_t loaded_libraries;
00054 eic_map_t found_components;
00055 eie_map_t found_events;
00056 std::string searchPaths;
00057 FactoryLoaderData *loaderData;
00058
00059 std::pair<std::string, std::string> parseLoadName(std::string wholename);
00060
00061 friend class boost::serialization::access;
00062 template<class Archive>
00063 void save(Archive & ar, const unsigned int version) const
00064 {
00065 std::vector<std::string> loaded_elis;
00066 loaded_elis.resize(loaded_libraries.size());
00067 for (eli_map_t::const_iterator i = loaded_libraries.begin() ;
00068 i != loaded_libraries.end() ;
00069 ++i) {
00070 loaded_elis.push_back(i->first);
00071 }
00072 }
00073
00074 template<class Archive>
00075 void load(Archive & ar, const unsigned int version)
00076 {
00077 std::vector<std::string> loaded_elis;
00078 ar >> BOOST_SERIALIZATION_NVP( loaded_elis );
00079 BOOST_FOREACH( std::string type, loaded_elis ) {
00080 if (NULL == findLibrary(type)) {
00081 fprintf(stderr,
00082 "factory::load failed to load %s\n",
00083 type.c_str());
00084 abort();
00085 }
00086 }
00087 }
00088
00089 template<class Archive>
00090 friend void save_construct_data(Archive & ar,
00091 const Factory * t,
00092 const unsigned int file_version)
00093 {
00094 std::string search_path = t->searchPaths;
00095 ar << BOOST_SERIALIZATION_NVP(search_path);
00096 }
00097
00098 template<class Archive>
00099 friend void load_construct_data(Archive & ar,
00100 Factory * t,
00101 const unsigned int file_version)
00102 {
00103 std::string search_path;
00104 ar >> BOOST_SERIALIZATION_NVP(search_path);
00105 ::new(t)Factory(search_path);
00106 }
00107
00108 BOOST_SERIALIZATION_SPLIT_MEMBER()
00109 };
00110
00111 }
00112
00113 #endif