19 #ifndef LUNCHBOX_DEBUG_H 20 #define LUNCHBOX_DEBUG_H 36 LUNCHBOX_API
void abort(
bool dumpThreads =
false );
42 LUNCHBOX_API
void checkHeap();
50 LUNCHBOX_API std::ostream&
sysError( std::ostream& os );
63 LUNCHBOX_API std::string
backtrace(
const size_t skipFrames );
66 LUNCHBOX_API std::ostream&
backtrace( std::ostream& os );
68 LUNCHBOX_API std::string demangleTypeID(
const char* mangled );
71 # pragma warning( disable: 4100 ) // VS Bug 74 template<
class T >
inline std::string
className(
const T*
object )
75 {
return demangleTypeID(
typeid( *object ).name( )); }
78 template<
class T >
inline std::string
className(
const T&
object )
79 {
return demangleTypeID(
typeid(
object ).name( )); }
81 # pragma warning( default: 4100 ) 93 template<
class T >
inline std::string
format(
const T* data,
const size_t num )
95 std::ostringstream os;
96 os << num <<
" " <<
className( data ) <<
" @ " << std::hex
97 << (
const void*)data <<
": 0x";
98 for(
size_t i = 0; i < num; ++i )
101 os <<
" " << std::endl;
102 os <<
' ' << data[i];
107 template<>
inline std::string
format(
const uint8_t* data,
const size_t num )
109 std::ostringstream os;
110 os << num <<
" bytes @ " << std::hex << (
const void*)data <<
": 0x";
112 for(
size_t i = 0; i < num; ++i )
115 os <<
" " << std::endl;
116 else if( (i % 8) == 0 )
118 os <<
' ' << std::setw(2) << int( data[i] );
123 template<>
inline std::string
format(
const void* data,
const size_t num )
124 {
return format( reinterpret_cast< const uint8_t* >( data ), num ); }
126 template<
class T >
inline std::string
format(
const std::vector< T >& data )
127 {
return format< T >( &data[0], data.size( )); }
132 # ifdef LB_RELEASE_ASSERT 133 # define LBASSERT(x) \ 136 LBERROR << "##### Assert: " << #x << " #####" << std::endl \ 137 << lunchbox::forceFlush; \ 138 lunchbox::checkHeap(); \ 140 # define LBASSERTINFO(x, info) \ 143 LBERROR << "##### Assert: " << #x << " [" << info << "] #####" \ 144 << std::endl << lunchbox::forceFlush; \ 145 lunchbox::checkHeap(); \ 147 # define LBCHECK(x) { const bool eqOk = x; LBASSERTINFO( eqOk, #x ) } 150 # define LBASSERTINFO(x, info) 151 # define LBCHECK(x) { x; } 154 # define LBUNIMPLEMENTED { LBERROR << "Unimplemented code in " << __FILE__ \ 155 << ":" << __LINE__ << std::endl \ 156 << lunchbox::forceFlush; } 157 # define LBUNREACHABLE { LBERROR << "Unreachable code in " << __FILE__ \ 158 << ":" << __LINE__ << std::endl \ 159 << lunchbox::forceFlush; } 160 # define LBDONTCALL \ 161 { LBERROR << "Code is not supposed to be called in this context" \ 162 << std::endl << lunchbox::forceFlush; } 163 # define LBABORT( info ) { \ 164 LBERROR << "##### Abort: " << info << " #####" << std::endl \ 165 << lunchbox::forceFlush; } 169 # define LBASSERT(x) \ 173 LBERROR << "Assert: " << #x << " "; \ 176 lunchbox::checkHeap(); \ 178 # define LBASSERTINFO(x, info) \ 182 LBERROR << "Assert: " << #x << " [" << info << "] "; \ 185 lunchbox::checkHeap(); \ 188 # define LBUNIMPLEMENTED \ 189 { LBERROR << "Unimplemented code in " << __FILE__ << ":" << __LINE__ \ 192 # define LBUNREACHABLE \ 193 { LBERROR << "Unreachable code in " << __FILE__ << ":" << __LINE__ \ 194 << lunchbox::className( this ) \ 197 # define LBDONTCALL \ 198 { LBERROR << "Code is not supposed to be called in this context, type " \ 199 << lunchbox::className( this ) << " " ; \ 202 # define LBCHECK(x) { const bool eqOk = x; LBASSERTINFO( eqOk, #x ) } 203 # define LBABORT( info ) { \ 204 LBERROR << "Abort: " << info; \ 208 #define LBSAFECAST( to, in ) static_cast< to >( in ); \ 209 LBASSERT( in == 0 || dynamic_cast< to >( static_cast< to >( in ))) 211 #endif //LUNCHBOX_DEBUG_H std::ostream & sysError(std::ostream &os)
Print a textual description of the current system error.
std::string className(const T *object)
Print the RTTI name of the given class.
std::string format(const T *data, const size_t num)
Format the given array in a human-readable form.
Includes compile-time defines of Lunchbox.
std::string backtrace(const size_t skipFrames)
Get the current call stack.
Abstraction layer and common utilities for multi-threaded programming.
This file contains logging classes.