// Description: Log class
// Detail: Outputs logging information to a set of Logger's.
// Documentation: logging.txt
#ifndef PASTELSYS_LOG_H
#define PASTELSYS_LOG_H
#include "pastel/sys/mytypes.h"
#include "pastel/sys/logging/logger_fwd.h"
#include "pastel/sys/printable/printable_concept.h"
#include <set>
namespace Pastel
{
    class Log
        : public Logger
    {
    public:
        // Using default constructor.
        // Using default copy constructor.
        ~Log();
        void swap(Log& that);
        Log& operator=(const Log& that);
        void addLogger(Logger* logger);
        void removeLogger(Logger* logger);
        void removeLoggers();
        // Virtual since Log is a Logger.
        virtual Log& operator<<(const std::string& value);
        virtual void finalize();
        template <
            typename Type,
            Requires<Models<Type, Printable_Concept>> = 0
        >
        Log& operator<<(const Type& value);
        Log& operator<<(void (*function)(Log&));
    private:
        using LoggerSet = std::set<Logger*>;
        using Logger_Iterator = LoggerSet::iterator;
        using Logger_ConstIterator = LoggerSet::const_iterator;
        LoggerSet loggerSet_;
    };
    inline void logNewLine(Log& log)
    {
        log << "\n";
    }
}
namespace Pastel
{
    inline Log& log()
    {
        static Log theLog;
        return theLog;
    }
}
#include "pastel/sys/logging/log.hpp"
#include "pastel/sys/logging/logger.h"
#endif