root/core/singleton.hpp

/* [<][>][^][v][top][bottom][index][help] */
   1 #ifndef libjmmcg_core_singleton_hpp
   2 #       define libjmmcg_core_singleton_hpp
   3 /******************************************************************************
   4 ** $Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/core/singleton.hpp 2055 2017-05-13 19:35:47Z jmmcg $
   5 **
   6 ** Copyright © 2012 by J.M.McGuiness, coder@hussar.me.uk
   7 **
   8 ** This library is free software; you can redistribute it and/or
   9 ** modify it under the terms of the GNU Lesser General Public
  10 ** License as published by the Free Software Foundation; either
  11 ** version 2.1 of the License, or (at your option) any later version.
  12 **
  13 ** This library is distributed in the hope that it will be useful,
  14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16 ** Lesser General Public License for more details.
  17 **
  18 ** You should have received a copy of the GNU Lesser General Public
  19 ** License along with this library; if not, write to the Free Software
  20 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21 */
  22 
  23 namespace jmmcg { namespace singleton {
  24 
  25         /// A so-called "Meyers" singleton.
  26         /**
  27                 Note that this implementation specifically leaks, and does not clean up, even at atexit(), any resource it allocates.
  28                 Based upon the "Meyers Singleton" from [1], that reference gives full details of the undefined & implementation-defined "features" of this type of singleton.
  29 
  30                 [1] "Modern C++ Design" by A. Alexandrescu, Chapter 6 "Implementing Singletons", page 133
  31         */
  32         template<class V>
  33         struct leaked_meyers {
  34                 typedef V element_type; ///< The type of the object "managed".
  35                 typedef void argument_type;
  36                 typedef argument_type first_argument_type;
  37                 typedef element_type result_type;
  38 
  39                 /// Obtain the unique instance of the object.
  40                 /**
  41                         \return The unique instance of the object, initialised and allocated upon the heap, upon first calling, assuming sufficient resources exist.
  42                 */
  43                 static element_type & instance() noexcept(false) {
  44                         static element_type * const val=new element_type();
  45                         return *val;
  46                 }
  47         };
  48 
  49 } }
  50 
  51 #endif

/* [<][>][^][v][top][bottom][index][help] */