00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef BASIC_DEVICE_FACTORY_HEADER
00029 #define BASIC_DEVICE_FACTORY_HEADER
00030
00031 #include <string>
00032 #include <iosfwd>
00033 #include <map>
00034 #include <simthetic/propertylist.h>
00035
00036 namespace simth
00037 {
00038
00056 class Device;
00057 class DeviceSystemIntf;
00058
00063 class DeviceFactory
00064 {
00065 public:
00067 DeviceFactory();
00069 virtual ~DeviceFactory() = 0;
00070
00093 virtual Device* createDevice(const std::string& fileName,
00094 DeviceSystemIntf* sysPtr,
00095 int ID,
00096 const std::string blockQualifier = "") = 0;
00098
00099
00100
00117 typedef simth::Device *(*FactoryFunc)(int id,
00118 simth::DeviceSystemIntf* sysPtr,
00119 const simth::PropertyList& pl,
00120 const std::string& cpptype);
00121
00124 typedef std::map<std::string, FactoryFunc> FactoryMap;
00125
00155 virtual FactoryMap allDevices();
00156
00171 void addFunction(const std::string& cppname, FactoryFunc func);
00173
00174 private:
00175
00176
00177 FactoryMap _fm;
00178 };
00179
00184 template<class T>
00185 static simth::Device* factory_function(int ID,
00186 simth::DeviceSystemIntf* sysPtr,
00187 const simth::PropertyList& pl,
00188 const std::string& )
00189 {
00190 return new T(ID, sysPtr, pl);
00191 }
00192
00194 std::ostream& operator<<(std::ostream&os,
00195 const DeviceFactory::FactoryMap& fm);
00196
00197 }
00198
00199 #endif // BASIC_DEVICE_FACTORY_HEADER