00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017 #ifndef header_cl_assert
00018 #define header_cl_assert
00019
00020 #include <list>
00021
00022 enum ErrorChannels
00023 {
00024 info_display = 1,
00025 info_sound = 2,
00026 info_input = 4,
00027 info_network = 8
00028 };
00029
00030 #ifndef __PRETTY_FUNCTION__
00031 #define __PRETTY_FUNCTION__ NULL
00032 #endif
00033
00034 #ifndef __STRING
00035 #define cl_assert(a) CL_Assert::die(a, __FILE__, __LINE__, __PRETTY_FUNCTION__, #a);
00036 #else
00037 #define cl_assert(a) CL_Assert::die(a, __FILE__, __LINE__, __PRETTY_FUNCTION__, __STRING(a));
00038 #endif
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #define cl_info(errchannel, message) \
00053 CL_Assert::info(errchannel, message, __FILE__, __LINE__);
00054
00055 #ifdef DEBUG
00056 #define cl_assert_debug(a) cl_assert(a)
00057 #define cl_info_debug(a,b) cl_info(a,b)
00058 #else
00059 #define cl_assert_debug(a)
00060 #define cl_info_debug(a,b)
00061 #endif
00062
00063
00064 class CL_AssertListener;
00065 class CL_Assert
00066
00067
00068
00069
00070 {
00071 static std::list<CL_AssertListener*> listeners;
00072 public:
00073 static void enable_channels(int channel_mask);
00074
00075
00076
00078
00079 static void die(bool a, const char *file, int line, const char *func, const char *assert_str);
00080
00081
00087
00088 static void info(int channel, const char *text, const char *file, int line);
00089
00090
00095
00096 static void add_listener(CL_AssertListener *listener);
00097
00098
00100
00101 static void remove_listener(CL_AssertListener *listener);
00102
00104
00105
00106 class CL_AssertListener
00107
00108 {
00109 public:
00110 virtual ~CL_AssertListener() {;}
00111
00112 virtual void assert_occoured(const char *file, int line)=0;
00113
00114
00117
00118
00119 #endif