AS
Size: a a a
AS
s
.
Т8
v
.
.
IZ
D
class SerialLogger : public ILogging, public Singleton<SerialLogger> {
public:
typedef std::ostream &(*ManipFn)(std::ostream &);
typedef std::ios_base &(*FlagsFn)(std::ios_base &);
SerialLogger();
template <class T> &operator<<(const T &output) {
lock();
_stream_buf << output;
unlock();
return *this;
}
SerialLogger &operator<<(ManipFn manip){
lock();
manip(_stream_buf);
if (manip == static_cast<ManipFn>(std::flush) ||
manip == static_cast<ManipFn>(std::endl)) {
this->flush();
}
unlock();
return *this;
}
SerialLogger &operator<<(FlagsFn manip)
{
lock();
manip(_stream_buf);
unlock();
return *this;
}
SerialLogger &operator()(TraceLevel_t e) {
lock();
_logLevel = e;
unlock();
return *this;
}
void flush();
virtual ~SerialLogger();
bool is_available(void) const override;
protected:
virtual void lock(void) { _mutex.lock(); };
virtual void unlock(void) { _mutex.unlock(); };
private:
Stream &_serial;
Mutex _mutex;
std::stringstream _stream_buf;
TraceLevel_t _logLevel;
};
v
Т8
D
std::lock_guard
v
.
IZ
IZ
s
class SerialLogger : public ILogging, public Singleton<SerialLogger> {
public:
typedef std::ostream &(*ManipFn)(std::ostream &);
typedef std::ios_base &(*FlagsFn)(std::ios_base &);
SerialLogger();
template <class T> &operator<<(const T &output) {
lock();
_stream_buf << output;
unlock();
return *this;
}
SerialLogger &operator<<(ManipFn manip){
lock();
manip(_stream_buf);
if (manip == static_cast<ManipFn>(std::flush) ||
manip == static_cast<ManipFn>(std::endl)) {
this->flush();
}
unlock();
return *this;
}
SerialLogger &operator<<(FlagsFn manip)
{
lock();
manip(_stream_buf);
unlock();
return *this;
}
SerialLogger &operator()(TraceLevel_t e) {
lock();
_logLevel = e;
unlock();
return *this;
}
void flush();
virtual ~SerialLogger();
bool is_available(void) const override;
protected:
virtual void lock(void) { _mutex.lock(); };
virtual void unlock(void) { _mutex.unlock(); };
private:
Stream &_serial;
Mutex _mutex;
std::stringstream _stream_buf;
TraceLevel_t _logLevel;
};
void SerialLogger::flush() {
if (is_available()) {
if (get_trace_level() > TraceLevel_t::NONE) {
std::cout << _stream_buf.str();
}
} _stream_buf.str(std::string()); _stream_buf.clear();
}
s
s
s