Program Listing for File Log.hpp

Return to documentation for file (engine/include/Cacao/Log.hpp)

#pragma once

#include <string>
#include <sstream>
#include <memory>

#include "DllHelper.hpp"

namespace Cacao {

    class CACAO_API Logger {
      public:
        static Logger& Get();

        Logger(const Logger&) = delete;
        Logger(Logger&&) = delete;
        Logger& operator=(const Logger&) = delete;
        Logger& operator=(Logger&&) = delete;

        enum class Level {
            Trace = 0,
            Info = 1,
            Warn = 2,
            Error = 3,
            Fatal = 4
        };

        struct LogToken {
            Level lvl;
            std::ostringstream oss;
            bool isClient;

          public:
            LogToken() = default;
            LogToken(const LogToken&) = delete;
            LogToken(LogToken&&) = default;
            LogToken& operator=(const LogToken&) = delete;
            LogToken& operator=(LogToken&&) = default;

            template<typename T>
            LogToken& operator<<(const T& value) {
                oss << value;
                return *this;
            }

            ~LogToken() {
                try {
                    Logger::Get().ImplLog(oss.str(), lvl, isClient);
                } catch(...) {}
            }
        };

        static LogToken Engine(Level level = Level::Info);

        static LogToken Client(Level level = Level::Info);

      private:
        struct Impl;
        std::unique_ptr<Impl> impl;

        void ImplLog(std::string message, Level level, bool isClient);

        friend LogToken;

        Logger();
        ~Logger();
    };
}