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