iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Singleton.H
Go to the documentation of this file.
1 /*! @file
2  @author
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 #ifndef INCLUDE_NRT_CORE_DESIGN_SINGLETON_H
36 #define INCLUDE_NRT_CORE_DESIGN_SINGLETON_H
37 
38 namespace nrt
39 {
40  //! A generic singleton class to enforce a single instance of a class.
41  /*! The Singleton class should be inherited by any class which needs:
42  -# To have only one instance
43  -# To be globally accessible
44 
45  Note that there are currently no guarantees on the order of destruction of Singletons, so care should be taken to
46  never reference another Singleton in the destructor of a Singleton.
47 
48  This particular implementation is from:
49  http://stackoverflow.com/questions/1008019/c-singleton-design-pattern
50 
51  The following is an example use of the Singleton:
52 
53  @code
54  class MyClass : public Singleton<MyClass>
55  {
56  public:
57  void doIt() {...}
58 
59  private:
60  MyClass();
61  };
62 
63  int main()
64  {
65  ...
66  MyClass::instance().doIt();
67  ...
68  }
69  @endcode
70 
71  @tparam T The class that is being made the singleton.
72 
73  \ingroup design */
74  template <class T>
75  class Singleton
76  {
77  public:
78  //! Get the global, unique instance of the class T
79  /*! If the global, unique instance of class T has not yet been created, then this method will create it in a
80  thread-safe manner. */
81  static T & instance();
82 
83  protected:
84  //! Only classes that inherit from Singleton can construct it via its protected default constructor
85  Singleton();
86 
87  private:
88  // Prevent copy-construction and copy, only allow default construction
89  Singleton(Singleton const &) = delete;
90  void operator=(Singleton const &) = delete;
91  };
92 }
93 
94 // Include implementation details:
96 
97 #endif // INCLUDE_NRT_CORE_DESIGN_SINGLETON_H