STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ... ATLSTL - Template Software for the Active Template Library COMSTL - The Standard Template Library meets the Component Object Model .netSTL - Standard Template Library meets the Microsoft.NET Common Language Runtime InetSTL - The Standard Template Library meets WinInet MFCSTL - Template Software for the Microsoft Foundation Classes UNIXSTL - Template Software for the UNIX Operating System WinSTL - where the Standard Template Library meets the Win32 API

Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

stlsoft_static_initialisers.h

Go to the documentation of this file.
00001 /* 
00002  * File:        stlsoft_static_initialisers.h (formerly MLClsCtr.h, ::SynesisStd)
00003  *
00004  * Purpose:     Initialiser classes for the STLSoft libraries.
00005  *
00006  * Created:     17th February 1997
00007  * Updated:     11th September 2004
00008  *
00009  * Home:        http://stlsoft.org/
00010  *
00011  * Copyright (c) 1997-2004, Matthew Wilson and Synesis Software
00012  * All rights reserved.
00013  *
00014  * Redistribution and use in source and binary forms, with or without
00015  * modification, are permitted provided that the following conditions are met:
00016  *
00017  * - Redistributions of source code must retain the above copyright notice, this
00018  *   list of conditions and the following disclaimer.
00019  * - Redistributions in binary form must reproduce the above copyright notice,
00020  *   this list of conditions and the following disclaimer in the documentation
00021  *   and/or other materials provided with the distribution.
00022  * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of
00023  *   any contributors may be used to endorse or promote products derived from
00024  *   this software without specific prior written permission.
00025  *
00026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00036  * POSSIBILITY OF SUCH DAMAGE.
00037  *
00038  * 
00039 
00040 
00044 
00045 #ifndef STLSOFT_INCL_H_STLSOFT_STATIC_INITIALISERS
00046 #define STLSOFT_INCL_H_STLSOFT_STATIC_INITIALISERS
00047 
00048 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00049 # define STLSOFT_VER_H_STLSOFT_STATIC_INITIALISERS_MAJOR     2
00050 # define STLSOFT_VER_H_STLSOFT_STATIC_INITIALISERS_MINOR     0
00051 # define STLSOFT_VER_H_STLSOFT_STATIC_INITIALISERS_REVISION  1
00052 # define STLSOFT_VER_H_STLSOFT_STATIC_INITIALISERS_EDIT      196
00053 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00054 
00055 /* 
00056  * Includes
00057  */
00058 
00059 #ifndef STLSOFT_INCL_H_STLSOFT
00060 # include "stlsoft.h"   // Include the STLSoft root header
00061 #endif /* !STLSOFT_INCL_H_STLSOFT */
00062 
00063 /* 
00064  * Namespace
00065  */
00066 
00067 #ifndef _STLSOFT_NO_NAMESPACE
00068 namespace stlsoft
00069 {
00070 #endif /* _STLSOFT_NO_NAMESPACE */
00071 
00072 /* 
00073  * Classes
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 /* 0 */
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 &/* t */)
00107     {}
00108     template <typename T>
00109     static_initialiser(T const * /* pt */)
00110     {}
00111 #else
00112     static_initialiser(int /* t */)
00113     {}
00114     static_initialiser(void const * /* pt */)
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 /* ? __STLSOFT_COMPILER_IS_COMO */
00131     void *operator new(ss_size_t) stlsoft_throw_0();
00132 #endif /* __STLSOFT_COMPILER_IS_COMO */
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 /* ? __STLSOFT_COMPILER_IS_COMO */
00179     void *operator new(ss_size_t) stlsoft_throw_0();
00180 #endif /* __STLSOFT_COMPILER_IS_COMO */
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 /* ? __STLSOFT_COMPILER_IS_COMO */
00224     void *operator new(ss_size_t) stlsoft_throw_0();
00225 #endif /* __STLSOFT_COMPILER_IS_COMO */
00226     void operator delete(void *)
00227     {}
00229 };
00230 
00231 /* 
00232 
00233 #ifndef _STLSOFT_NO_NAMESPACE
00234 } // namespace stlsoft
00235 #endif /* _STLSOFT_NO_NAMESPACE */
00236 
00237 /* 
00238 
00239 #endif /* !STLSOFT_INCL_H_STLSOFT_STATIC_INITIALISERS */
00240 
00241 /* 

STLSoft Libraries documentation © Synesis Software Pty Ltd, 2001-2004