| Directory: | ./ |
|---|---|
| File: | include/sot/core/debug.hh |
| Date: | 2025-05-13 12:28:21 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 6 | 7 | 85.7% |
| Branches: | 6 | 12 | 50.0% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright 2010, | ||
| 3 | * François Bleibel, | ||
| 4 | * Olivier Stasse, | ||
| 5 | * | ||
| 6 | * CNRS/AIST | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef SOT_CORE_DEBUG_HH | ||
| 11 | #define SOT_CORE_DEBUG_HH | ||
| 12 | #include <cstdarg> | ||
| 13 | #include <cstdio> | ||
| 14 | #include <fstream> | ||
| 15 | #include <sstream> | ||
| 16 | |||
| 17 | #include "sot/core/api.hh" | ||
| 18 | |||
| 19 | #ifndef VP_DEBUG_MODE | ||
| 20 | #define VP_DEBUG_MODE 0 | ||
| 21 | #endif //! VP_DEBUG_MODE | ||
| 22 | |||
| 23 | #ifndef VP_TEMPLATE_DEBUG_MODE | ||
| 24 | #define VP_TEMPLATE_DEBUG_MODE 0 | ||
| 25 | #endif //! VP_TEMPLATE_DEBUG_MODE | ||
| 26 | |||
| 27 | #define SOT_COMMON_TRACES \ | ||
| 28 | do { \ | ||
| 29 | va_list arg; \ | ||
| 30 | va_start(arg, format); \ | ||
| 31 | vsnprintf(charbuffer, SIZE, format, arg); \ | ||
| 32 | va_end(arg); \ | ||
| 33 | outputbuffer << tmpbuffer.str() << charbuffer << std::endl; \ | ||
| 34 | } while (0) | ||
| 35 | |||
| 36 | namespace dynamicgraph { | ||
| 37 | namespace sot { | ||
| 38 | class SOT_CORE_EXPORT DebugTrace { | ||
| 39 | public: | ||
| 40 | static const int SIZE = 512; | ||
| 41 | |||
| 42 | std::stringstream tmpbuffer; | ||
| 43 | std::ostream &outputbuffer; | ||
| 44 | char charbuffer[SIZE + 1]; | ||
| 45 | int traceLevel; | ||
| 46 | int traceLevelTemplate; | ||
| 47 | |||
| 48 | 46 | DebugTrace(std::ostream &os) : outputbuffer(os) {} | |
| 49 | |||
| 50 | inline void trace(const int level, const char *format, ...) { | ||
| 51 | if (level <= traceLevel) SOT_COMMON_TRACES; | ||
| 52 | tmpbuffer.str(""); | ||
| 53 | } | ||
| 54 | |||
| 55 | 1 | inline void trace(const char *format, ...) { | |
| 56 |
4/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | SOT_COMMON_TRACES; |
| 57 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | tmpbuffer.str(""); |
| 58 | 1 | } | |
| 59 | |||
| 60 | inline void trace(const int level = -1) { | ||
| 61 | if (level <= traceLevel) outputbuffer << tmpbuffer.str(); | ||
| 62 | tmpbuffer.str(""); | ||
| 63 | } | ||
| 64 | |||
| 65 | inline void traceTemplate(const int level, const char *format, ...) { | ||
| 66 | if (level <= traceLevelTemplate) SOT_COMMON_TRACES; | ||
| 67 | tmpbuffer.str(""); | ||
| 68 | } | ||
| 69 | |||
| 70 | inline void traceTemplate(const char *format, ...) { | ||
| 71 | SOT_COMMON_TRACES; | ||
| 72 | tmpbuffer.str(""); | ||
| 73 | } | ||
| 74 | |||
| 75 | inline DebugTrace &pre(const std::ostream &) { return *this; } | ||
| 76 | |||
| 77 | inline DebugTrace &pre(const std::ostream &, int level) { | ||
| 78 | traceLevel = level; | ||
| 79 | return *this; | ||
| 80 | } | ||
| 81 | |||
| 82 | static const char *DEBUG_FILENAME_DEFAULT; | ||
| 83 | static void openFile(const char *filename = DEBUG_FILENAME_DEFAULT); | ||
| 84 | static void closeFile(const char *filename = DEBUG_FILENAME_DEFAULT); | ||
| 85 | }; | ||
| 86 | |||
| 87 | SOT_CORE_EXPORT extern DebugTrace sotDEBUGFLOW; | ||
| 88 | SOT_CORE_EXPORT extern DebugTrace sotERRORFLOW; | ||
| 89 | } // namespace sot | ||
| 90 | } // namespace dynamicgraph | ||
| 91 | |||
| 92 | #ifdef VP_DEBUG | ||
| 93 | #define sotPREDEBUG \ | ||
| 94 | __FILE__ << ": " << __FUNCTION__ << "(#" << __LINE__ << ") :" | ||
| 95 | |||
| 96 | #define sotPREERROR \ | ||
| 97 | "\t!! " << __FILE__ << ": " << __FUNCTION__ << "(#" << __LINE__ << ") :" | ||
| 98 | |||
| 99 | #define sotDEBUG(level) \ | ||
| 100 | if ((level > VP_DEBUG_MODE) || \ | ||
| 101 | (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good())) \ | ||
| 102 | ; \ | ||
| 103 | else \ | ||
| 104 | dynamicgraph::sot::sotDEBUGFLOW.outputbuffer << sotPREDEBUG | ||
| 105 | |||
| 106 | #define sotDEBUGMUTE(level) \ | ||
| 107 | if ((level > VP_DEBUG_MODE) || \ | ||
| 108 | (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good())) \ | ||
| 109 | ; \ | ||
| 110 | else \ | ||
| 111 | dynamicgraph::sot::sotDEBUGFLOW.outputbuffer | ||
| 112 | |||
| 113 | #define sotERROR \ | ||
| 114 | if (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good()) \ | ||
| 115 | ; \ | ||
| 116 | else \ | ||
| 117 | dynamicgraph::sot::sotERRORFLOW.outputbuffer << sotPREERROR | ||
| 118 | |||
| 119 | #define sotDEBUGF \ | ||
| 120 | if (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good()) \ | ||
| 121 | ; \ | ||
| 122 | else \ | ||
| 123 | dynamicgraph::sot::sotDEBUGFLOW \ | ||
| 124 | .pre(dynamicgraph::sot::sotDEBUGFLOW.tmpbuffer << sotPREDEBUG, \ | ||
| 125 | VP_DEBUG_MODE) \ | ||
| 126 | .trace | ||
| 127 | |||
| 128 | #define sotERRORF \ | ||
| 129 | if (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good()) \ | ||
| 130 | ; \ | ||
| 131 | else \ | ||
| 132 | sot::sotERRORFLOW.pre(sot::sotERRORFLOW.tmpbuffer << sotPREERROR).trace | ||
| 133 | |||
| 134 | // TEMPLATE | ||
| 135 | #define sotTDEBUG(level) \ | ||
| 136 | if ((level > VP_TEMPLATE_DEBUG_MODE) || \ | ||
| 137 | (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good())) \ | ||
| 138 | ; \ | ||
| 139 | else \ | ||
| 140 | dynamicgraph::sot::sotDEBUGFLOW.outputbuffer << sotPREDEBUG | ||
| 141 | |||
| 142 | #define sotTDEBUGF \ | ||
| 143 | if (!dynamicgraph::sot::sotDEBUGFLOW.outputbuffer.good()) \ | ||
| 144 | ; \ | ||
| 145 | else \ | ||
| 146 | dynamicgraph::sot::sotDEBUGFLOW \ | ||
| 147 | .pre(dynamicgraph::sot::sotDEBUGFLOW.tmpbuffer << sotPREDEBUG, \ | ||
| 148 | VP_TEMPLATE_DEBUG_MODE) \ | ||
| 149 | .trace | ||
| 150 | |||
| 151 | namespace dynamicgraph { | ||
| 152 | namespace sot { | ||
| 153 | inline bool sotDEBUG_ENABLE(const int &level) { return level <= VP_DEBUG_MODE; } | ||
| 154 | |||
| 155 | inline bool sotTDEBUG_ENABLE(const int &level) { | ||
| 156 | return level <= VP_TEMPLATE_DEBUG_MODE; | ||
| 157 | } | ||
| 158 | } // namespace sot | ||
| 159 | } // namespace dynamicgraph | ||
| 160 | |||
| 161 | /* -------------------------------------------------------------------------- */ | ||
| 162 | #else // VP_DEBUG | ||
| 163 | #define sotPREERROR \ | ||
| 164 | "\t!! " << __FILE__ << ": " << __FUNCTION__ << "(#" << __LINE__ << ") :" | ||
| 165 | #define sotDEBUG(level) \ | ||
| 166 | if (1) \ | ||
| 167 | ; \ | ||
| 168 | else \ | ||
| 169 | ::dynamicgraph::sot::__null_stream() | ||
| 170 | #define sotDEBUGMUTE(level) \ | ||
| 171 | if (1) \ | ||
| 172 | ; \ | ||
| 173 | else \ | ||
| 174 | ::dynamicgraph::sot::__null_stream() | ||
| 175 | #define sotERROR sotERRORFLOW.outputbuffer << sotPREERROR | ||
| 176 | |||
| 177 | namespace dynamicgraph { | ||
| 178 | namespace sot { | ||
| 179 | ✗ | inline void sotDEBUGF(const int, const char *, ...) {} | |
| 180 | 6 | inline void sotDEBUGF(const char *, ...) {} | |
| 181 | inline void sotERRORF(const int, const char *, ...) {} | ||
| 182 | inline void sotERRORF(const char *, ...) {} | ||
| 183 | inline std::ostream &__null_stream() { | ||
| 184 | // This function should never be called. With -O3, | ||
| 185 | // it should not appear in the generated binary. | ||
| 186 | static std::ostream os(NULL); | ||
| 187 | return os; | ||
| 188 | } | ||
| 189 | } // namespace sot | ||
| 190 | } // namespace dynamicgraph | ||
| 191 | |||
| 192 | // TEMPLATE | ||
| 193 | #define sotTDEBUG(level) \ | ||
| 194 | if (1) \ | ||
| 195 | ; \ | ||
| 196 | else \ | ||
| 197 | ::dynamicgraph::sot::__null_stream() | ||
| 198 | |||
| 199 | namespace dynamicgraph { | ||
| 200 | namespace sot { | ||
| 201 | inline void sotTDEBUGF(const int, const char *, ...) {} | ||
| 202 | inline void sotTDEBUGF(const char *, ...) {} | ||
| 203 | } // namespace sot | ||
| 204 | } // namespace dynamicgraph | ||
| 205 | |||
| 206 | #define sotDEBUG_ENABLE(level) false | ||
| 207 | #define sotTDEBUG_ENABLE(level) false | ||
| 208 | |||
| 209 | #endif // VP_DEBUG | ||
| 210 | |||
| 211 | #define sotDEBUGIN(level) sotDEBUG(level) << "# In {" << std::endl | ||
| 212 | #define sotDEBUGOUT(level) sotDEBUG(level) << "# Out }" << std::endl | ||
| 213 | #define sotDEBUGINOUT(level) sotDEBUG(level) << "# In/Out { }" << std::endl | ||
| 214 | |||
| 215 | #define sotTDEBUGIN(level) sotTDEBUG(level) << "# In {" << std::endl | ||
| 216 | #define sotTDEBUGOUT(level) sotTDEBUG(level) << "# Out }" << std::endl | ||
| 217 | #define sotTDEBUGINOUT(level) sotTDEBUG(level) << "# In/Out { }" << std::endl | ||
| 218 | |||
| 219 | #endif //! #ifdef SOT_CORE_DEBUG_HH | ||
| 220 | |||
| 221 | // Local variables: | ||
| 222 | // c-basic-offset: 2 | ||
| 223 | // End: | ||
| 224 |