# class utils::LogWriter

## Overview

Extension to LogReader. Provide write access to the log. More…

    #include <LogWriter.h>

    class LogWriter:
        public utils::LogReader,
        public utils::DelegatedNotifier,
        public utils::DelegatedNotifier {
    public:
        // construction

        LogWriter();
        LogWriter(const LogWriter&);
        LogWriter(utils::LogWriter&&);
        ~LogWriter();

        // methods

        LogWriter& operator=(const LogWriter&);
        LogWriter& operator=(utils::LogWriter&&);
        void ResetPercentage(bool enable_percentage = true);
        void SetPercentage(float value);
        LogWriter& operator+=(const float percentage_increment);
        LogWriter& operator<<(const std::shared_ptr<LogEntry> entry);
        LogWriter& Add(const LogEntry&& entry);
        LogWriter& Add(const std::shared_ptr<LogEntry> entry);

        template <typename ... Params>
        LogWriter& AddEntry(Params&&... params);

        LogWriter& Inform(const std::string& message, const std::string& caller_name);
        LogWriter& Warn(const std::string& message, const std::string& caller_name);
        LogWriter& Fail(const std::string& message, const std::string& caller_name);
        LogWriter& Crash(const std::string& message, const std::string& caller_name);

        template <class CT>
        LogWriter& Inform(const std::string& message, const utils::NamedClass<CT>* caller);

        template <class CT>
        LogWriter& Warn(const std::string& message, const utils::NamedClass<CT>* caller);

        template <class CT>
        LogWriter& Fail(const std::string& message, const utils::NamedClass<CT>* caller);

        template <class CT>
        LogWriter& Crash(const std::string& message, const utils::NamedClass<CT>* caller);

        LogWriter& CopyUnreadEntries(const LogReader& other);
        void StartTimeMeasure(const std::string& measurement_name);
        void StopTimeMeasure();
        bool SaveToFile(const std::string& file_path);
        bool DisplayUnread(const utils::EnumFlags<utils::LogEntry::Type>& types, const std::function<void(const std::wstring&, const std::wstring&)>& ShowMessageBox = nullptr);
    };

### Inherited Members

    public:
        // typedefs

        typedef std::function<void(Args...)> CallbackType;

        // methods

        LogReader& operator=(const LogReader&);
        LogReader& operator=(LogReader&&);
        bool IsPercentageEnabled() const;
        float GetPercentage() const;
        void SetOutputStream(std::ostream* output_log_stream);
        std::ostream* GetOutputStream();
        std::vector<std::shared_ptr<LogEntry>> ViewUnread(const utils::EnumFlags<LogEntry::Type>& types = LogEntry::GetWECTypes()) const;
        std::string ViewUnreadToString(const utils::EnumFlags<LogEntry::Type>& types = LogEntry::GetIWECTypes()) const;
        std::vector<std::shared_ptr<LogEntry>> ReadUnread(const utils::EnumFlags<LogEntry::Type>& types);
        void AddCallback(CallbackType callback);
        virtual void Notify(Args... args);
        bool HasCallback() const;
        virtual void Notify(Args... args);
        virtual void SendAllNotifications();
        virtual void WaitUntilAllSent();

    protected:
        // fields

        std::ostream* output_stream_ = nullptr;
        ProgressPercentage percentage_;
        std::mutex percentage_access_;
        std::vector<std::shared_ptr<LogEntry>> log_entries_;
        std::mutex log_access_;
        std::vector<CallbackType> callbacks_;
        std::mutex notifier_access_;
        std::vector<std::tuple<Args...>> tuples_;
        std::condition_variable notifier_condition_;

## Detailed Documentation

Extension to LogReader. Provide write access to the log.

### Methods

    void ResetPercentage(bool enable_percentage = true)

Reset percentage value and disable it optionally.

    void SetPercentage(float value)

Set amount of percentage to defined value. Clamped to range <0,1>

    LogWriter& operator+=(const float percentage_increment)

Increment progress-bar value by an amount of percentage.

    LogWriter& operator<<(const std::shared_ptr<LogEntry> entry)

Add a log entry to the log. If output stream enabled, print to output stream.

    LogWriter& Add(const LogEntry&& entry)

Add an entry to the log. If output stream enabled, print to output stream.

    LogWriter& Add(const std::shared_ptr<LogEntry> entry)

Add an entry to the log. If output stream enabled, print to output stream.

    template <typename ... Params>
    LogWriter& AddEntry(Params&&... params)

Add an entry to the log. If output stream enabled, print to output stream.

    LogWriter& Inform(const std::string& message, const std::string& caller_name)

Add a Info entry to the log. If output stream enabled, print to output stream.

    LogWriter& Warn(const std::string& message, const std::string& caller_name)

Add a Warning entry to the log. If output stream enabled, print to output stream.

    LogWriter& Fail(const std::string& message, const std::string& caller_name)

Add a Error entry to the log. If output stream enabled, print to output stream.

    LogWriter& Crash(const std::string& message, const std::string& caller_name)

Add a Critical entry to the log. If output stream enabled, print to output stream.

    template <class CT>
    LogWriter& Inform(const std::string& message, const utils::NamedClass<CT>* caller)

Add a Info entry to the log. If output stream enabled, print to output stream. Pass caller to get its name.

    template <class CT>
    LogWriter& Warn(const std::string& message, const utils::NamedClass<CT>* caller)

Add a Warning entry to the log. If output stream enabled, print to output stream. Pass caller to get its name.

    template <class CT>
    LogWriter& Fail(const std::string& message, const utils::NamedClass<CT>* caller)

Add a Error entry to the log. If output stream enabled, print to output stream. Pass caller to get its name.

    template <class CT>
    LogWriter& Crash(const std::string& message, const utils::NamedClass<CT>* caller)

Add a Critical entry to the log. If output stream enabled, print to output stream. Pass caller to get its name.

    LogWriter& CopyUnreadEntries(const LogReader& other)

Copy all unread entries from another LogReader.

    void StartTimeMeasure(const std::string& measurement_name)

Start time measurement + print to log.

    void StopTimeMeasure()

End time measurements + print to log.

    bool SaveToFile(const std::string& file_path)

Save all log messages to a file.

    bool DisplayUnread(const utils::EnumFlags<utils::LogEntry::Type>& types, const std::function<void(const std::wstring&, const std::wstring&)>& ShowMessageBox = nullptr)

Read all unread messages from log with the selected types and display them supplied message dialog function.