00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef FACTORY2_H_
00020 #define FACTORY2_H_
00021
00022 #define LIBSMBIOS_SOURCE
00023 #include "smbios/compat.h"
00024
00025 #include <map>
00026
00027 #include "smbios/types.h"
00028
00029
00030 #include "smbios/config/abi_prefix.hpp"
00031
00032 namespace factory
00033 {
00034
00035 template <class S>
00036 class TFactory : public S
00037 {
00038 public:
00039 virtual ~TFactory() throw()
00040 {
00041 if( _instance )
00042 {
00043 TFactory<S> *savedInstance = _instance;
00044 _instance = 0;
00045 delete savedInstance;
00046 }
00047 _instance = 0;
00048 };
00049
00050
00051
00052 template <class R>
00053 static TFactory<S> *getFactory(R *foo= 0)
00054 {
00055 UNREFERENCED_PARAMETER(foo);
00056 if( _instance == 0 )
00057 {
00058 _instance = new R();
00059 }
00060 return _instance;
00061 }
00062
00063 virtual void reset()
00064 {
00065 if( _instance )
00066 {
00067 TFactory<S> *savedInstance = _instance;
00068 _instance = 0;
00069 delete savedInstance;
00070 }
00071 _instance = 0;
00072 };
00073
00074
00075 virtual void setParameter( const std::string name, const std::string value) { strParamMap[ name ] = value; };
00076 virtual void setParameter( const std::string name, const u32 value) { numParamMap[ name ] = value; };
00077 virtual void setMode( const int newMode ) { mode = newMode; };
00078
00079
00080 virtual std::string getParameterString( const std::string name ) const { return strParamMap[ name ]; };
00081 virtual u32 getParameterNum( const std::string name ) const {return numParamMap[ name ];};
00082 virtual int getMode( ) const { return mode ; };
00083
00084 protected:
00085 TFactory() : S(), mode(0) {};
00086 TFactory( const TFactory<S> &src );
00087 TFactory<S> &operator =( const TFactory<S> &src );
00088
00089 int mode;
00090 mutable std::map< std::string, std::string > strParamMap;
00091 mutable std::map< std::string, u32 > numParamMap;
00092 static TFactory<S> * _instance;
00093 };
00094
00095 template<class S> TFactory<S> *TFactory<S>::_instance = 0;
00096 }
00097
00098
00099 #include "smbios/config/abi_suffix.hpp"
00100
00101 #endif