00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __debug_h
00009 #define __debug_h
00010
00011 #include <utility/ostream.h>
00012
00013 __BEGIN_SYS
00014
00015 class Debug {
00016 public:
00017 Debug & operator<<(int i) {
00018 kerr << i; return *this;
00019 }
00020 Debug & operator<<(short s) {
00021 return operator<<(static_cast<int>(s));
00022 }
00023 Debug & operator<<(long l) {
00024 return operator<<(static_cast<int>(l));
00025 }
00026 Debug & operator<<(long long l) {
00027 kerr << l; return *this;
00028 }
00029
00030 Debug & operator<<(unsigned int u) {
00031 kerr << u; return *this;
00032 }
00033 Debug & operator<<(unsigned short s) {
00034 return operator<<(static_cast<unsigned int>(s));
00035 }
00036 Debug & operator<<(unsigned long l) {
00037 return operator<<(static_cast<unsigned int>(l));
00038 }
00039 Debug & operator<<(unsigned long long l) {
00040 kerr << l; return *this;
00041 }
00042
00043 Debug & operator<<(const void * p) {
00044 kerr << p; return *this;
00045 }
00046
00047 Debug & operator<<(const char * s) {
00048 kerr << s; return *this;
00049 }
00050 };
00051
00052 class Null_Debug
00053 {
00054 public:
00055 template<class T>
00056 Null_Debug & operator<<(const T & o) {return *this;}
00057
00058 template<class T>
00059 Null_Debug & operator<<(const T * o) {return *this;}
00060 };
00061
00062 template <bool debugged>
00063 class Select_Debug: public Debug {};
00064
00065 template <>
00066 class Select_Debug<false> : public Null_Debug {};
00067
00068
00069 enum Debug_Error {ERR = 1};
00070
00071 template <typename T>
00072 inline Select_Debug<(Traits<T>::debugged && Traits<Debug>::error)>
00073 db(Debug_Error l)
00074 {
00075 return Select_Debug<(Traits<T>::debugged && Traits<Debug>::error)>();
00076 }
00077
00078 template <typename T1, typename T2>
00079 inline Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00080 && Traits<Debug>::error)>
00081 db(Debug_Error l)
00082 {
00083 return Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00084 && Traits<Debug>::error)>();
00085 }
00086
00087
00088 enum Debug_Warning {WRN = 2};
00089
00090 template <typename T>
00091 inline Select_Debug<(Traits<T>::debugged && Traits<Debug>::warning)>
00092 db(Debug_Warning l)
00093 {
00094 return Select_Debug<(Traits<T>::debugged && Traits<Debug>::warning)>();
00095 }
00096
00097 template <typename T1, typename T2>
00098 inline Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00099 && Traits<Debug>::warning)>
00100 db(Debug_Warning l)
00101 {
00102 return Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00103 && Traits<Debug>::warning)>();
00104 }
00105
00106
00107 enum Debug_Info {INF = 3};
00108
00109 template <typename T>
00110 inline Select_Debug<(Traits<T>::debugged && Traits<Debug>::info)>
00111 db(Debug_Info l)
00112 {
00113 return Select_Debug<(Traits<T>::debugged && Traits<Debug>::info)>();
00114 }
00115
00116 template <typename T1, typename T2>
00117 inline Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00118 && Traits<Debug>::info)>
00119 db(Debug_Info l)
00120 {
00121 return Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00122 && Traits<Debug>::info)>();
00123 }
00124
00125
00126 enum Debug_Trace {TRC = 4};
00127
00128 template <typename T>
00129 inline Select_Debug<(Traits<T>::debugged && Traits<Debug>::trace)>
00130 db(Debug_Trace l)
00131 {
00132 return Select_Debug<(Traits<T>::debugged && Traits<Debug>::trace)>();
00133 }
00134
00135 template <typename T1, typename T2>
00136 inline Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00137 && Traits<Debug>::trace)>
00138 db(Debug_Trace l)
00139 {
00140 return Select_Debug<((Traits<T1>::debugged || Traits<T2>::debugged)
00141 && Traits<Debug>::trace)>();
00142 }
00143
00144 union Debug_Level
00145 {
00146 Debug_Error err;
00147 Debug_Warning wrn;
00148 Debug_Info inf;
00149 Debug_Trace trc;
00150 };
00151 __END_SYS
00152
00153 #endif
00154