00001 #ifndef DEBUG_HPP
00002 #define DEBUG_HPP
00003
00004
00005 #include <assert.h>
00006 #include <stdio.h>
00007 #include <string>
00008
00009
00010 #if defined(_DEBUG) || defined(DEBUG)
00011
00012 class Log {
00013 public:
00014 static void Write(const char* str);
00015 static void IncrementIndent() { ++indent_count; }
00016 static void DecrementIndent() { --indent_count; }
00017
00018 private:
00019 static void EnsureOpen();
00020 static void Close();
00021
00022 private:
00023 static FILE* handle;
00024 static int indent_count;
00025 };
00026
00027
00028 class Guard {
00029 public:
00030 Guard(const char* label)
00031 : m_label(label) {
00032 Write("+");
00033 Log::IncrementIndent();
00034 }
00035
00036 ~Guard() {
00037 Log::DecrementIndent();
00038 Write("-");
00039 }
00040
00041 void Write(const char* prefix) {
00042 Log::Write((prefix + m_label).c_str());
00043 }
00044
00045 private:
00046 std::string m_label;
00047 };
00048
00049
00050 #define ADR_GUARD(label) Guard guard_obj__(label)
00051 #define ADR_LOG(label) (Log::Write(label))
00052 #define ADR_IF_DEBUG if (true)
00053
00054 #ifdef _MSC_VER
00055 #define ADR_ASSERT(condition, label) if (!(condition)) { __asm int 3 }
00056 #else // assume x86 gcc
00057 #define ADR_ASSERT(condition, label) assert(condition && label);
00058 #endif
00059
00060 #else
00061
00062 #define ADR_GUARD(label)
00063 #define ADR_LOG(label)
00064 #define ADR_IF_DEBUG if (false)
00065 #define ADR_ASSERT(condition, label)
00066
00067 #endif
00068
00069
00070 #endif