]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/generic/static.cpp
Merge remote-tracking branch 'ttimo/master'
[xonotic/netradiant.git] / libs / generic / static.cpp
1 /*
2    Copyright (C) 2001-2006, William Joseph.
3    All Rights Reserved.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #include "static.h"
23
24 #if defined( _DEBUG ) || defined( DOXYGEN )
25
26 namespace ExampleStatic
27 {
28 // Static example
29 // ---- myclass.h
30 class MyClass
31 {
32 public:
33 int value;
34 MyClass() : value( 3 ){
35 }
36 };
37
38 typedef Static<MyClass> StaticMyClass;
39
40 // ---- main.cpp
41 class DynamicInitialisation
42 {
43 public:
44 DynamicInitialisation(){
45         // StaticMyClass::instance() may be invalid here because construction order is undefined
46 }
47 };
48
49 DynamicInitialisation g_dynamicInitialisation;
50
51 void duringMain(){
52         int bar = StaticMyClass::instance().value;
53 }
54 // end example
55 }
56
57 namespace ExampleLazyStatic
58 {
59 // LazyStatic example
60 // ---- myclass.h
61 class MyClass
62 {
63 public:
64 int value;
65 MyClass() : value( 3 ){
66 }
67 // destructor will never be called
68 };
69
70 typedef LazyStatic<MyClass> StaticMyClass;
71
72 // ---- main.cpp
73 class DynamicInitialisation
74 {
75 public:
76 DynamicInitialisation(){
77         int bar = StaticMyClass::instance().value;
78 }
79 };
80
81 DynamicInitialisation g_dynamicInitialisation;
82
83 void duringMain(){
84         int bar = StaticMyClass::instance().value;
85 }
86 // end example
87 }
88
89 namespace ExampleSmartStatic
90 {
91 // SmartStatic example
92 // ---- myclass.h
93 class MyClass
94 {
95 public:
96 int value;
97 MyClass() : value( 3 ){
98 }
99 };
100
101 typedef CountedStatic<MyClass> StaticMyClass;
102
103 // ---- main.cpp
104 class DynamicInitialisation
105 {
106 public:
107 DynamicInitialisation(){
108         // StaticMyClass::instance() is invalid before the ref is constructed
109         SmartStatic<MyClass> ref;
110         int bar = ref.instance().value;
111
112         SmartStatic<MyClass> ref2;   // any number of instances are allowed.
113 }
114 };
115
116 DynamicInitialisation g_dynamicInitialisation;
117
118 void duringMain(){
119         int bar = SmartStatic<MyClass>().instance().value; // an instance can be a temporary
120 }
121 // end example
122 }
123
124 #endif