00001 00011 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 00012 #pragma once 00013 #endif 00014 #ifndef COMMON_DATOR_H_ 00015 #define COMMON_DATOR_H_ 00016 00017 #include <map> // :( 00018 00019 namespace common 00020 { 00021 00026 00028 class GenericDator 00029 { 00030 public: 00031 virtual ~GenericDator() { } 00032 virtual bool SetValue(const tstring &Value) { return false; } 00033 virtual bool GetValue(tstring *Value) { return false; } 00034 }; 00035 00037 template <typename T> 00038 class Dator : public GenericDator 00039 { 00040 private: 00041 T *m_Ptr; 00042 00043 public: 00044 Dator() : m_Ptr(0) { } 00045 Dator(T *Ptr) : m_Ptr(Ptr) { } 00046 00047 T * GetPtr() { return m_Ptr; } 00048 void SetPtr(T *Ptr) { m_Ptr = Ptr; } 00049 00050 virtual bool SetValue(const tstring &Value); 00051 virtual bool GetValue(tstring *Value); 00052 }; 00053 00054 template <typename T> 00055 inline bool Dator<T>::SetValue(const tstring &Value) 00056 { 00057 T Tmp; 00058 if (m_Ptr == 0) return false; 00059 if (!StrToSth_obj<T>::IsSupported()) return false; 00060 if (StrToSth<T>(&Tmp, Value)) 00061 { 00062 *m_Ptr = Tmp; 00063 return true; 00064 } 00065 else return false; 00066 } 00067 00068 template <typename T> 00069 inline bool Dator<T>::GetValue(tstring *Value) 00070 { 00071 if (m_Ptr == 0) return false; 00072 if (!SthToStr_obj<T>::IsSupported()) return false; 00073 SthToStr(Value, *m_Ptr); 00074 return true; 00075 } 00076 00077 00079 template <typename T> 00080 class Dator<const T> : public GenericDator 00081 { 00082 private: 00083 const T *m_Ptr; 00084 00085 public: 00086 Dator() : m_Ptr(0) { } 00087 Dator(const T *Ptr) : m_Ptr(Ptr) { } 00088 00089 const T * GetPtr() { return m_Ptr; } 00090 void SetPtr(const T *Ptr) { m_Ptr = Ptr; } 00091 00092 virtual bool SetValue(const tstring &Value) { return false; } 00093 virtual bool GetValue(tstring *Value); 00094 }; 00095 00096 template <typename T> 00097 inline bool Dator<const T>::GetValue(tstring *Value) 00098 { 00099 if (m_Ptr == 0) return false; 00100 SthToStr(Value, *m_Ptr); 00101 return true; 00102 } 00103 00104 00106 class DatorGroup 00107 { 00108 private: 00109 typedef std::map< tstring, shared_ptr<GenericDator> > DATOR_MAP; 00110 DATOR_MAP m_Dators; 00111 00112 public: 00114 00115 template <typename U> 00116 bool Add(const tstring &Name, U *Value) 00117 { 00118 return m_Dators.insert(DATOR_MAP::value_type(Name, shared_ptr<GenericDator>(new Dator<U>(Value)))).second; 00119 } 00121 00122 bool Delete(const tstring &Name); 00124 bool Exists(const tstring &Name); 00125 00127 00131 int SetValue(const tstring &Name, const tstring &Value); 00133 00137 int GetValue(const tstring &Name, tstring *Value); 00138 }; 00139 00141 // code_dator 00142 00143 } // namespace common 00144 00145 #endif
1.5.5