#pragma once
#include <sstream>
#include <iostream>

namespace c11log {
class log_exception :public std::exception {
public:
    log_exception() : _oss(), _msg() {
    }

    virtual ~log_exception() {
    }

    explicit log_exception(const std::string& msg) :_oss(msg, std::ostringstream::ate), _msg(msg) {
    }

    log_exception(const log_exception &other) :_oss(other._oss.str()), _msg(other._msg) {
    }

    log_exception& operator=(const log_exception& other) {
        _oss.str(other._oss.str());
        _msg = other._msg;
        return *this;
    }

    virtual const char* what() const throw () override {
        return _msg.c_str();
    }

    template<typename T>
    log_exception& operator<<(const T& what) {
        _oss << what;
        _msg = _oss.str();
        return *this;
    }

private:
    std::ostringstream _oss;
    std::string _msg;
};
}