Developer Documentation
SingletonT.hh
1
/* ========================================================================= *
2
* *
3
* OpenMesh *
4
* Copyright (c) 2001-2015, RWTH-Aachen University *
5
* Department of Computer Graphics and Multimedia *
6
* All rights reserved. *
7
* www.openmesh.org *
8
* *
9
*---------------------------------------------------------------------------*
10
* This file is part of OpenMesh. *
11
*---------------------------------------------------------------------------*
12
* *
13
* Redistribution and use in source and binary forms, with or without *
14
* modification, are permitted provided that the following conditions *
15
* are met: *
16
* *
17
* 1. Redistributions of source code must retain the above copyright notice, *
18
* this list of conditions and the following disclaimer. *
19
* *
20
* 2. Redistributions in binary form must reproduce the above copyright *
21
* notice, this list of conditions and the following disclaimer in the *
22
* documentation and/or other materials provided with the distribution. *
23
* *
24
* 3. Neither the name of the copyright holder nor the names of its *
25
* contributors may be used to endorse or promote products derived from *
26
* this software without specific prior written permission. *
27
* *
28
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39
* *
40
* ========================================================================= */
41
42
43
44
45
//=============================================================================
46
//
47
// Implements a simple singleton template
48
//
49
//=============================================================================
50
51
52
#ifndef __SINGLETON_HH__
53
#define __SINGLETON_HH__
54
55
56
//=== INCLUDES ================================================================
57
58
// OpenMesh
59
#include <
OpenMesh/Core/System/config.h
>
60
61
// STL
62
#include <stdexcept>
63
64
65
//== NAMESPACES ===============================================================
66
67
68
namespace
OpenMesh
{
69
70
71
//=== IMPLEMENTATION ==========================================================
72
73
78
template
<
typename
T>
79
class
SingletonT
80
{
81
public
:
82
89
static
T&
Instance
()
90
{
91
if
(!pInstance__)
92
{
93
// check if singleton alive
94
if
(destroyed__)
95
{
96
OnDeadReference();
97
}
98
// first time request -> initialize
99
else
100
{
101
Create();
102
}
103
}
104
return
*pInstance__;
105
}
106
107
108
private
:
109
110
// Disable constructors/assignment to enforce uniqueness
111
SingletonT
();
112
SingletonT
(
const
SingletonT
&);
113
SingletonT
& operator=(
const
SingletonT
&);
114
115
// Create a new singleton and store its pointer
116
static
void
Create()
117
{
118
static
T theInstance;
119
pInstance__ = &theInstance;
120
}
121
122
// Will be called if instance is accessed after its lifetime has expired
123
static
void
OnDeadReference()
124
{
125
throw
std::runtime_error(
"[Singelton error] - Dead reference detected!\n"
);
126
}
127
128
virtual
~
SingletonT
()
129
{
130
pInstance__ = 0;
131
destroyed__ =
true
;
132
}
133
134
static
T* pInstance__;
135
static
bool
destroyed__;
136
};
137
138
139
140
//=============================================================================
141
}
// namespace OpenMesh
142
//=============================================================================
143
#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SINGLETON_C)
144
# define OPENMESH_SINGLETON_TEMPLATES
145
# include "SingletonT_impl.hh"
146
#endif
147
//=============================================================================
148
#endif // __SINGLETON_HH__
149
//=============================================================================
OpenMesh::SingletonT
Definition:
SingletonT.hh:79
config.h
OpenMesh::SingletonT::Instance
static T & Instance()
Definition:
SingletonT.hh:89
OpenMesh
Definition:
MeshItems.hh:59
OpenFlipper
libs_required
OpenMesh
src
OpenMesh
Core
Utils
SingletonT.hh
Generated on Tue Mar 5 2019 16:53:49 for Developer Documentation by
1.8.13