fork download
  1. #define LTT_LOG_LEVEL LTT_LOG_DEBUG_LEVEL
  2. #define LTT_LOG_BREAK LTT_LOG_CRITICAL_LEVEL
  3.  
  4. #include <cstdlib>
  5. #include <iostream>
  6.  
  7. namespace LTT
  8. {
  9. class IgnoreStreamT
  10. {
  11. IgnoreStreamT(IgnoreStreamT const& Rhs);
  12. IgnoreStreamT& operator= (IgnoreStreamT const& Rhs);
  13.  
  14. public:
  15. IgnoreStreamT()
  16. {
  17. }
  18. };
  19.  
  20. IgnoreStreamT IgnoreStream;
  21.  
  22. template<typename T>
  23. IgnoreStreamT& operator<< (IgnoreStreamT& Stream, T const& Object)
  24. {
  25. return Stream;
  26. };
  27.  
  28. class AbortStreamT
  29. {
  30. AbortStreamT(AbortStreamT const& Rhs);
  31. AbortStreamT& operator= (AbortStreamT const& Rhs);
  32.  
  33. public:
  34. AbortStreamT()
  35. {
  36. }
  37. };
  38.  
  39. AbortStreamT AbortStream;
  40.  
  41. template<typename T>
  42. AbortStreamT& operator<< (AbortStreamT& Stream, T const& Object)
  43. {
  44. std::abort();
  45. return Stream;
  46. };
  47. }
  48.  
  49. #define LTT_LOG_DEBUG_LEVEL 1
  50. #define LTT_LOG_INFO_LEVEL 2
  51. #define LTT_LOG_WARNING_LEVEL 3
  52. #define LTT_LOG_ERROR_LEVEL 4
  53. #define LTT_LOG_CRITICAL_LEVEL 5
  54.  
  55. #ifndef LTT_LOG_LEVEL
  56. #define LTT_LOG_LEVEL LTT_LOG_INFO_LEVEL
  57. #endif // LTT_LOG_LEVEL
  58.  
  59. #ifndef LTT_LOG_BREAK
  60. #define LTT_LOG_BREAK LTT_LOG_CRITICAL_LEVEL
  61. #endif // LTT_LOG_BREAK
  62.  
  63. #if LTT_LOG_DEBUG_LEVEL >= LTT_LOG_BREAK
  64. #define LTT_LOG_DEBUG (LTT::AbortStream)
  65. #elif LTT_LOG_DEBUG_LEVEL >= LTT_LOG_LEVEL
  66. #define LTT_LOG_DEBUG (std::clog)
  67. #else
  68. #define LTT_LOG_DEBUG (LTT::IgnoreStream)
  69. #endif
  70.  
  71. #if LTT_LOG_INFO_LEVEL >= LTT_LOG_BREAK
  72. #define LTT_LOG_INFO (LTT::AbortStream)
  73. #elif LTT_LOG_INFO_LEVEL >= LTT_LOG_LEVEL
  74. #define LTT_LOG_INFO (std::clog)
  75. #else
  76. #define LTT_LOG_INFO (LTT::IgnoreStream)
  77. #endif
  78.  
  79. #if LTT_LOG_WARNING_LEVEL >= LTT_LOG_BREAK
  80. #define LTT_LOG_WARNING (LTT::AbortStream)
  81. #elif LTT_LOG_WARNING_LEVEL >= LTT_LOG_LEVEL
  82. #define LTT_LOG_WARNING (std::clog)
  83. #else
  84. #define LTT_LOG_WARNING (LTT::IgnoreStream)
  85. #endif
  86.  
  87. #if LTT_LOG_ERROR_LEVEL >= LTT_LOG_BREAK
  88. #define LTT_LOG_ERROR (LTT::AbortStream)
  89. #elif LTT_LOG_ERROR_LEVEL >= LTT_LOG_LEVEL
  90. #define LTT_LOG_ERROR (std::clog)
  91. #else
  92. #define LTT_LOG_ERROR (LTT::IgnoreStream)
  93. #endif
  94.  
  95. #if LTT_LOG_CRITICAL_LEVEL >= LTT_LOG_BREAK
  96. #define LTT_LOG_CRITICAL (LTT::AbortStream)
  97. #elif LTT_LOG_CRITICAL_LEVEL >= LTT_LOG_LEVEL
  98. #define LTT_LOG_CRITICAL (std::clog)
  99. #else
  100. #define LTT_LOG_CRITICAL (LTT::IgnoreStream)
  101. #endif
  102.  
  103. int main()
  104. {
  105. std::clog.rdbuf(std::cout.rdbuf());
  106.  
  107. LTT_LOG_DEBUG << "Hello Debug!\n";
  108. LTT_LOG_INFO << "Hello Info!\n";
  109. LTT_LOG_WARNING << "Hello Warning!\n";
  110. LTT_LOG_ERROR << "Hello Error!\n";
  111. // LTT_LOG_CRITICAL << "Hello Critical!\n";
  112. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
Hello Debug!
Hello Info!
Hello Warning!
Hello Error!