/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2015. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #ifndef NT_LOG_H_ #define NT_LOG_H_ #include #include #include #include "atomic_static.h" #include "ntcore_c.h" namespace nt { class Logger { public: static Logger& GetInstance() { ATOMIC_STATIC(Logger, instance); return instance; } ~Logger(); typedef std::function LogFunc; void SetLogger(LogFunc func) { m_func = func; } void set_min_level(unsigned int level) { m_min_level = level; } unsigned int min_level() const { return m_min_level; } void Log(unsigned int level, const char* file, unsigned int line, const char* msg) { if (!m_func || level < m_min_level) return; m_func(level, file, line, msg); } bool HasLogger() const { return m_func != nullptr; } private: Logger(); LogFunc m_func; unsigned int m_min_level = 20; ATOMIC_STATIC_DECL(Logger) }; #define LOG(level, x) \ do { \ nt::Logger& logger = nt::Logger::GetInstance(); \ if (logger.min_level() <= level && logger.HasLogger()) { \ std::ostringstream oss; \ oss << x; \ logger.Log(level, __FILE__, __LINE__, oss.str().c_str()); \ } \ } while (0) #undef ERROR #define ERROR(x) LOG(NT_LOG_ERROR, x) #define WARNING(x) LOG(NT_LOG_WARNING, x) #define INFO(x) LOG(NT_LOG_INFO, x) #ifdef NDEBUG #define DEBUG(x) do {} while (0) #define DEBUG1(x) do {} while (0) #define DEBUG2(x) do {} while (0) #define DEBUG3(x) do {} while (0) #define DEBUG4(x) do {} while (0) #else #define DEBUG(x) LOG(NT_LOG_DEBUG, x) #define DEBUG1(x) LOG(NT_LOG_DEBUG1, x) #define DEBUG2(x) LOG(NT_LOG_DEBUG2, x) #define DEBUG3(x) LOG(NT_LOG_DEBUG3, x) #define DEBUG4(x) LOG(NT_LOG_DEBUG4, x) #endif } // namespace nt #endif // NT_LOG_H_