aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Common/je_singleton.hpp
blob: d7f52c9585fdd8bffc97940e830f4da2d150fe76 (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
#ifndef __JE_SINGLETON_H__
#define __JE_SINGLETON_H__

namespace JinEngine
{

    ///
    /// Singleton base class.
    ///
    template<class T>
    class Singleton
    {
    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() {};

        ///
        /// 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;

    ///
    /// Singleton notation.
    ///
    #define singleton(T) friend Singleton<T>

} // namespace JinEngine

#endif // __JE_SINGLETON_H__