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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #ifndef STLSOFT_INCL_H_STLSOFT
00060 # include "stlsoft.h"
00061 #endif
00062
00063
00064
00065
00066
00067 #ifndef _STLSOFT_NO_NAMESPACE
00068 namespace stlsoft
00069 {
00070 #endif
00071
00072
00073
00074
00075
00076 #if 0
00077 class method_constructor
00078 {
00079 public:
00080 template<typename T>
00081 method_constructor(T const &t, void (T::*const fn)())
00082 {
00083 (t.*fn)();
00084 }
00085 template<typename T, typename R>
00086 method_constructor(T const &t, R (T::*const fn)())
00087 {
00088 (t.*fn)();
00089 }
00090 };
00091 #endif
00092
00096 class static_initialiser
00097 {
00098 public:
00099 typedef static_initialiser class_type;
00100
00102
00103 public:
00104 #ifdef __STLSOFT_CF_MEMBER_TEMPLATE_CTOR_SUPPORT
00105 template <typename T>
00106 static_initialiser(T const &)
00107 {}
00108 template <typename T>
00109 static_initialiser(T const * )
00110 {}
00111 #else
00112 static_initialiser(int )
00113 {}
00114 static_initialiser(void const * )
00115 {}
00116 #endif // __STLSOFT_CF_MEMBER_TEMPLATE_CTOR_SUPPORT
00117
00118
00120
00121 private:
00122 static_initialiser(class_type const &);
00123 static_initialiser &operator =(class_type const &);
00124
00125 #ifdef __STLSOFT_COMPILER_IS_COMO
00126 void *operator new(ss_size_t) stlsoft_throw_0()
00127 {
00128 return 0;
00129 }
00130 #else
00131 void *operator new(ss_size_t) stlsoft_throw_0();
00132 #endif
00133 void operator delete(void *)
00134 {}
00136 };
00137
00139 class api_constructor
00140 {
00142
00143 public:
00144 api_constructor(void (*pfnInit)(), void (*pfnUninit)())
00145 : m_pfnUninit(pfnUninit)
00146 {
00147 if(NULL != pfnInit)
00148 {
00149 (*pfnInit)();
00150 }
00151 }
00152 ~api_constructor()
00153 {
00154 if(NULL != m_pfnUninit)
00155 {
00156 (*m_pfnUninit)();
00157 }
00158 }
00160
00162
00163 private:
00164 void (*m_pfnUninit)(void);
00166
00168
00169 private:
00170 api_constructor(api_constructor const &);
00171 api_constructor &operator =(api_constructor const &);
00172
00173 #ifdef __STLSOFT_COMPILER_IS_COMO
00174 void *operator new(ss_size_t) stlsoft_throw_0()
00175 {
00176 return 0;
00177 }
00178 #else
00179 void *operator new(ss_size_t) stlsoft_throw_0();
00180 #endif
00181 void operator delete(void *)
00182 {}
00184 };
00185
00187 template <ss_typename_param_k T>
00188 class class_constructor
00189 : protected api_constructor
00190 {
00192
00193 public:
00194 typedef void (*class_init_fn_t)();
00195 typedef void (*class_uninit_fn_t)();
00196
00198
00200
00201 public:
00202 ss_explicit_k class_constructor()
00203 : api_constructor(&T::class_init, &T::class_uninit)
00204 {}
00205
00206 ss_explicit_k class_constructor( class_init_fn_t pfnInit
00207 , class_uninit_fn_t pfnUninit)
00208 : api_constructor(pfnInit, pfnUninit)
00209 {}
00211
00213
00214 private:
00215 class_constructor(class_constructor const &);
00216 class_constructor &operator =(class_constructor const &);
00217
00218 #ifdef __STLSOFT_COMPILER_IS_COMO
00219 void *operator new(ss_size_t) stlsoft_throw_0()
00220 {
00221 return 0;
00222 }
00223 #else
00224 void *operator new(ss_size_t) stlsoft_throw_0();
00225 #endif
00226 void operator delete(void *)
00227 {}
00229 };
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241