File: singleton.hh

package info (click to toggle)
dune-common 2.10.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,824 kB
  • sloc: cpp: 52,256; python: 3,979; sh: 1,658; makefile: 17
file content (79 lines) | stat: -rw-r--r-- 1,919 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
#ifndef DUNE_SINGLETON_HH
#define DUNE_SINGLETON_HH

#include <dune/common/visibility.hh>

/**
 * @file
 * @brief Useful wrapper for creating singletons.
 *
 * Inspired by the article
 * <a href="http://www.codeguru.com/cpp/cpp/cpp_mfc/singletons/article.php/c755/">CodeGuru: A Leak-Free Singleton class</a>
 */
namespace Dune
{
  /**
   * @brief An adapter to turn a class into a singleton.
   *
   * The class represented by the template parameter T must
   * have a parameterless constructor.
   *
   * Class T can be publicly derived from Singleton<T>:
   *
   * \code
   * #include<dune/common/singleton.hh>
   * class Foo : public Dune::Singleton<Foo>
   * {
   * public:
   *   Foo()
   *   {
   *     bytes = new char[1000];
   *   }
   *
   *   ~Foo()
   *   {
   *     delete[] bytes;
   *   }
   * private:
   *   char* bytes;
   * };
   * \endcode
   *
   * Or one can construct a Singleton of an existing class. Say Foo1 is a class
   * with parameterless constructor then
   * \code
   * typedef Dune::Singleton<Foo1> FooSingleton;
   * Foo1 instance& = FooSingleton::instance();
   * \endcode
   * Creates a singleton of that class and accesses its instance.
   */
  template<class T>
  class Singleton
  {
  protected:
    /* @brief Protected constructor. */
    Singleton() = default;

  public:

    Singleton(const Singleton&) = delete;
    void operator=(const Singleton&) = delete;

    /**
     * @brief Get the instance of the singleton.
     * @return The instance of the singleton.
     */
    DUNE_EXPORT static T& instance()
    {
      static T instance_;
      return instance_;
    }
  };

} // namespace Dune

#endif