edelib  2.0.0
edelib/edelib-global.h
00001 /*
00002  * $Id: edelib-global.h 3140 2011-10-28 13:56:43Z karijes $
00003  *
00004  * Base defs for edelib
00005  * Copyright (c) 2005-2009 edelib authors
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public License
00018  * along with this library.  If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 
00021 #ifndef __EDELIB_EDELIB_GLOBAL_H__
00022 #define __EDELIB_EDELIB_GLOBAL_H__
00023 
00024 /* Needed so we don't have to include necessary libraries.  */
00025 #ifndef NULL
00026 # ifndef __cplusplus
00027 #  define NULL ((void*)0)
00028 # else 
00029 #  define NULL 0
00030 # endif
00031 #endif
00032 
00038 #ifndef EDELIB_NS
00039 # define EDELIB_NS edelib
00040 #endif
00041 
00042 #ifdef EDELIB_NS
00043 # define EDELIB_NS_BEGIN namespace EDELIB_NS {
00044 # define EDELIB_NS_END   }
00045 #else
00046 # define EDELIB_NS_BEGIN
00047 # define EDELIB_NS_END
00048 #endif
00049 
00065 #ifdef EDELIB_NS
00066 # define EDELIB_NS_USE using namespace EDELIB_NS;
00067 #else
00068 # define EDELIB_NS_USE
00069 #endif
00070 
00078 #ifdef EDELIB_NS
00079 # define EDELIB_NS_USING(n) using EDELIB_NS::n;
00080 #else
00081 # define EDELIB_NS_USING(n)
00082 #endif
00083 
00091 #ifdef EDELIB_NS
00092 # define EDELIB_NS_USING_AS(old_name, new_name) typedef EDELIB_NS::old_name new_name;
00093 #else
00094 # define EDELIB_NS_USING_AS(old_name, new_name) typedef old_name new_name;
00095 #endif
00096 
00102 #ifdef EDELIB_NS
00103 # define EDELIB_NS_PREPEND(n) EDELIB_NS::n
00104 #else
00105 # define EDELIB_NS_PREPEND(n) n
00106 #endif
00107 
00118 #include "for-each-macro.h"
00119 
00120 #ifdef EDELIB_FOR_EACH_FUNC
00121 # define EDELIB_FOR_EACH_FUNC_OLD__ EDELIB_FOR_EACH_FUNC
00122 #endif
00123 
00124 #define EDELIB_FOR_EACH_FUNC EDELIB_NS_USING
00125 #define EDELIB_NS_USING_LIST(n, list) EDELIB_FOR_EACH(n, list)
00126 
00127 #ifdef EDELIB_FOR_EACH_FUNC_OLD__
00128 # define EDELIB_FOR_EACH_FUNC EDELIB_FOR_EACH_FUNC_OLD__
00129 # undef EDELIB_FOR_EACH_FUNC_OLD__
00130 #endif
00131 
00143 #if __GNUC__ >= 4
00144 # define E_EXPORT __attribute__ ((visibility("default")))
00145 # define E_NO_EXPORT __attribute__ ((visibility("hidden")))
00146 #else
00147 # define E_EXPORT
00148 # define E_NO_EXPORT
00149 #endif
00150 
00151 #define EDELIB_API E_EXPORT
00152 #define EDELIB_NO_API E_NO_EXPORT
00153 
00161 #define E_DISABLE_CLASS_COPY(klass) \
00162         klass(const klass&);            \
00163         klass& operator=(klass&);
00164 
00176 #define E_CLASS_GLOBAL_DECLARE(klass) \
00177         static klass* global(void);
00178 
00186 #define E_CLASS_GLOBAL_IMPLEMENT(klass) \
00187         klass* klass::global(void) {        \
00188                 static klass obj;               \
00189                 return &obj;                    \
00190         }
00191 
00203 #define E_CLASS_GLOBAL_EXPLICIT_DECLARE(klass) \
00204         static void init(void);                    \
00205         static void shutdown(void);                \
00206         static bool inited(void);                  \
00207         static klass* global(void);
00208 
00215 #define E_CLASS_GLOBAL_EXPLICIT_IMPLEMENT(klass)                           \
00216         klass* klass##_instance = NULL;                                        \
00217                                                                            \
00218         void klass::init(void) {                                               \
00219                 if(!klass##_instance)                                              \
00220                         klass##_instance = new klass();                                \
00221         }                                                                      \
00222                                                                            \
00223         void klass::shutdown(void) {                                           \
00224                 delete klass##_instance;                                           \
00225                 klass##_instance = NULL;                                           \
00226         }                                                                      \
00227                                                                            \
00228         bool klass::inited(void) {                                             \
00229                 return (klass##_instance != NULL);                                 \
00230         }                                                                      \
00231                                                                            \
00232         klass* klass::global(void) {                                           \
00233                 E_ASSERT(klass##_instance != NULL && "Did you run init() first?"); \
00234                 return klass##_instance;                                           \
00235         }
00236                                                 
00237 
00238 #ifdef __GNUC__
00239 # define EDELIB_DEPRECATED __attribute__ ((deprecated))
00240 #else
00241 # define EDELIB_DEPRECATED
00242 #endif
00243 
00244 #ifdef HAVE_EDELIB_BASE_CONFIG_H
00245 # include "_conf.h"
00246 #endif
00247 
00248 #include "edelib-config.h"
00249 
00250 #endif