edelib  2.1.0
edelib-global.h
1 /*
2  * $Id: edelib-global.h 3328 2012-05-25 14:24:02Z karijes $
3  *
4  * Base defs for edelib
5  * Copyright (c) 2005-2009 edelib authors
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library 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 GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef __EDELIB_EDELIB_GLOBAL_H__
22 #define __EDELIB_EDELIB_GLOBAL_H__
23 
24 /* Needed so we don't have to include necessary libraries. */
25 #ifndef NULL
26 # ifndef __cplusplus
27 # define NULL ((void*)0)
28 # else
29 # define NULL 0
30 # endif
31 #endif
32 
38 #ifndef EDELIB_NS
39 # define EDELIB_NS edelib
40 #endif
41 
42 #ifdef EDELIB_NS
43 # define EDELIB_NS_BEGIN namespace EDELIB_NS {
44 # define EDELIB_NS_END }
45 #else
46 # define EDELIB_NS_BEGIN
47 # define EDELIB_NS_END
48 #endif
49 
65 #ifdef EDELIB_NS
66 # define EDELIB_NS_USE using namespace EDELIB_NS;
67 #else
68 # define EDELIB_NS_USE
69 #endif
70 
78 #ifdef EDELIB_NS
79 # define EDELIB_NS_USING(n) using EDELIB_NS::n;
80 #else
81 # define EDELIB_NS_USING(n)
82 #endif
83 
91 #ifdef EDELIB_NS
92 # define EDELIB_NS_USING_AS(old_name, new_name) typedef EDELIB_NS::old_name new_name;
93 #else
94 # define EDELIB_NS_USING_AS(old_name, new_name) typedef old_name new_name;
95 #endif
96 
102 #ifdef EDELIB_NS
103 # define EDELIB_NS_PREPEND(n) EDELIB_NS::n
104 #else
105 # define EDELIB_NS_PREPEND(n) n
106 #endif
107 
118 #include "for-each-macro.h"
119 
120 #ifdef EDELIB_FOR_EACH_FUNC
121 # define EDELIB_FOR_EACH_FUNC_OLD__ EDELIB_FOR_EACH_FUNC
122 #endif
123 
124 #define EDELIB_FOR_EACH_FUNC EDELIB_NS_USING
125 #define EDELIB_NS_USING_LIST(n, list) EDELIB_FOR_EACH(n, list)
126 
127 #ifdef EDELIB_FOR_EACH_FUNC_OLD__
128 # define EDELIB_FOR_EACH_FUNC EDELIB_FOR_EACH_FUNC_OLD__
129 # undef EDELIB_FOR_EACH_FUNC_OLD__
130 #endif
131 
143 #if __GNUC__ >= 4
144 # define E_EXPORT __attribute__ ((visibility("default")))
145 # define E_NO_EXPORT __attribute__ ((visibility("hidden")))
146 #else
147 # define E_EXPORT
148 # define E_NO_EXPORT
149 #endif
150 
151 #define EDELIB_API E_EXPORT
152 #define EDELIB_NO_API E_NO_EXPORT
153 
161 #define E_DISABLE_CLASS_COPY(klass) \
162  klass(const klass&); \
163  klass& operator=(klass&);
164 
176 #define E_CLASS_GLOBAL_DECLARE(klass) \
177  static klass* global(void);
178 
186 #define E_CLASS_GLOBAL_IMPLEMENT(klass) \
187  klass* klass::global(void) { \
188  static klass obj; \
189  return &obj; \
190  }
191 
203 #define E_CLASS_GLOBAL_EXPLICIT_DECLARE(klass) \
204  static void init(void); \
205  static void shutdown(void); \
206  static bool inited(void); \
207  static klass* global(void);
208 
215 #define E_CLASS_GLOBAL_EXPLICIT_IMPLEMENT(klass) \
216  klass* klass##_instance = NULL; \
217  \
218  void klass::init(void) { \
219  if(!klass##_instance) \
220  klass##_instance = new klass(); \
221  } \
222  \
223  void klass::shutdown(void) { \
224  delete klass##_instance; \
225  klass##_instance = NULL; \
226  } \
227  \
228  bool klass::inited(void) { \
229  return (klass##_instance != NULL); \
230  } \
231  \
232  klass* klass::global(void) { \
233  E_ASSERT(klass##_instance != NULL && "Did you run init() first?"); \
234  return klass##_instance; \
235  }
236 
237 
238 #ifdef __GNUC__
239 # define EDELIB_DEPRECATED __attribute__ ((deprecated))
240 #else
241 # define EDELIB_DEPRECATED
242 #endif
243 
244 #include "edelib-config.h"
245 #endif