Last active
March 17, 2016 23:20
-
-
Save bqv/84c8ac50d4df001a89e8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Program received signal SIGSEGV, Segmentation fault. | |
| 0x00007ffff7b68fb9 in std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | |
| #0 0x00007ffff7b68fb9 in std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | |
| #1 0x000000000040170a in log::operator<< (log=..., f=@0x400d00: {std::ostream &(std::ostream &)} 0x400d00 <std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)@plt>) at logger.cpp:47 | |
| #2 0x0000000000401846 in log::endl (log=...) at logger.cpp:71 | |
| #3 0x0000000000401819 in log::done (log=...) at logger.cpp:64 | |
| #4 0x00000000004016e1 in log::operator<< (log=..., f=@0x401801: {log::Logger &(log::Logger &)} 0x401801 <log::done(log::Logger&)>) at logger.cpp:42 | |
| #5 0x0000000000400ee6 in main (argc=1, argv=0x7fffffffe5a8) at main.cpp:16 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "logger.hpp" | |
| namespace log | |
| { | |
| Log fatal = Log(std::cerr, 00, "FATAL"); | |
| Log error = Log(std::cerr, 10, "ERROR"); | |
| Log warn = Log(std::cerr, 20, "WARN"); | |
| Log info = Log(std::cout, 30, "INFO"); | |
| Log debug = Log(std::cerr, 40, "DEBUG"); | |
| std::vector<std::shared_ptr<std::ostream>> Logger::os; | |
| std::mutex Logger::mutex; | |
| Logger::Logger(std::ostream& console) | |
| : console(console) | |
| { | |
| } | |
| Logger::~Logger() | |
| { | |
| } | |
| void Logger::tee(std::vector<std::shared_ptr<std::ostream>> targets) | |
| { | |
| for (auto os : targets) | |
| Logger::os.push_back(os); | |
| } | |
| Log::Log(std::ostream& console, short int num, const char* str) | |
| : Logger(console) | |
| , str(str) | |
| , num(num) | |
| { | |
| } | |
| Log::~Log() | |
| { | |
| } | |
| Logger& operator<< (Logger& log, Logger& (&f)(Logger&)) | |
| { | |
| return f(log); | |
| } | |
| Logger& operator<< (Logger& log, std::ostream& (&f)(std::ostream&)) | |
| { | |
| log.console << f; | |
| for (const std::shared_ptr<std::ostream>& out : log.os) | |
| *out << f; | |
| return log; | |
| } | |
| Logger& operator<< (Log& loglvl, Logger& (&f)(Logger&)) | |
| { | |
| Log::mutex.lock(); | |
| Logger log = loglvl; | |
| return log << f; | |
| } | |
| Logger& done(Logger& log) | |
| { | |
| endl(log); | |
| Logger::mutex.unlock(); | |
| return log; | |
| } | |
| Logger& endl(Logger& log) | |
| { | |
| return log << std::endl; | |
| } | |
| }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #ifndef _LOGGER_HPP_ | |
| #define _LOGGER_HPP_ | |
| #include <iostream> | |
| #include <memory> | |
| #include <vector> | |
| #include <mutex> | |
| namespace log | |
| { | |
| class Logger | |
| { | |
| protected: | |
| Logger(std::ostream& console); | |
| static std::vector<std::shared_ptr<std::ostream>> os; | |
| static std::mutex mutex; | |
| std::ostream& console; | |
| public: | |
| virtual ~Logger(); | |
| static void tee(const std::vector<std::shared_ptr<std::ostream>> targets); | |
| template <typename T> | |
| friend Logger& operator<< (Logger& log, T val); | |
| friend Logger& operator<< (Logger& log, Logger& (&f)(Logger&)); | |
| friend Logger& operator<< (Logger& log, std::ostream& (&f)(std::ostream&)); | |
| friend Logger& done(Logger& log); | |
| friend Logger& endl(Logger& log); | |
| }; | |
| class Log : public Logger | |
| { | |
| protected: | |
| char const* str; | |
| short int num; | |
| public: | |
| Log(std::ostream& console, short int num, const char* str); | |
| virtual ~Log(); | |
| template <typename T> | |
| friend Logger& operator<< (Log& log, T val); | |
| friend Logger& operator<< (Log& log, Logger& (&f)(Logger&)); | |
| friend Logger& operator<< (Log& log, std::ostream& (&f)(std::ostream&)); | |
| }; | |
| extern Logger& done(Logger& log); | |
| extern Logger& endl(Logger& log); | |
| extern Log fatal, error, warn, info, debug; | |
| }; | |
| #include "logger.ipp" | |
| #endif /*LOGGER_HPP*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| namespace log | |
| { | |
| template <typename T> | |
| Logger& operator<< (Logger& log, T val) | |
| { | |
| log.console << val; | |
| for (const std::shared_ptr<std::ostream>& out : log.os) | |
| *out << val; | |
| return log; | |
| } | |
| template <typename T> | |
| Logger& operator<< (Log& loglvl, T val) | |
| { | |
| Log::mutex.lock(); | |
| Logger log = loglvl; | |
| // Todo: timestamp | |
| log << '+' << loglvl.num << ' ' << loglvl.str << ' '; | |
| return log << val; | |
| } | |
| }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "logger.hpp" | |
| #include <iostream> | |
| int main(int argc, char *argv[]) | |
| { | |
| log::info << "Starting..." << log::done; | |
| return EXIT_SUCCESS; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment