aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/common/singleton.hpp
blob: 015c9b0d0aebbd03f8fc8a7f0574c4ebc797e8a7 (plain)
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
80
81
82
83
84
#ifndef __JE_SINGLETON_H__
#define __JE_SINGLETON_H__

#include "object.h"
#include "exception.h"

namespace JinEngine
{

    ///
    /// Singleton base class.
    ///
    template<class T>
    class Singleton : public Object
    {
    public:
        ///
        /// Get singleton. 
        /// 
        /// @param Singleton instance of class.
        ///
        static T* get()
        {
            if (_instance == nullptr)
                _instance = new T;
            return _instance;
        }

        ///
        /// Destroy instance of singleton.
        ///
        static void destroy()
        {
            delete _instance;
            _instance = nullptr;
        }

    protected:
        ///
        /// Singleton constructor.
        ///
        Singleton() 
        {
            // Check singleton.
            if (_instance)
                throw Exception("This is a singleton.");
        };

        ///
        /// Singleton destructor.
        ///
        virtual ~Singleton() {};

        ///
        /// Singleton instance.
        ///
        static T* _instance;

    private:
        ///
        /// Singleton copy constructor.
        ///
        /// @param singleton Singleton of class.
        ///
        Singleton(const Singleton& singleton);

        ///
        /// Singleton assignment.
        ///
        /// @param singleton Singleton of class.
        ///
        Singleton& operator = (const Singleton& singleton);

    };

    ///
    /// Singleton instance.
    ///
    template<class T> 
    T* Singleton<T>::_instance = nullptr;

} // namespace JinEngine

#endif // __JE_SINGLETON_H__