SpinParser  1.0
Log.hpp
Go to the documentation of this file.
1 
9 #pragma once
10 #include <iostream>
11 #include <functional>
12 #include <boost/date_time.hpp>
13 
14 
15 namespace Log
16 {
20  enum struct LogLevel
21  {
22  None = 0,
23  Error = 1,
24  Warning = 2,
25  Info = 3,
26  Debug = 4
27  };
28 
29  class Logstream;
30 
34  typedef std::function<Logstream & (Logstream &)> StructManipulator;
35 
39  typedef Logstream &(*Manipulator)(Logstream &);
40 
47  class Logstream
48  {
49  friend Logstream &endl(Logstream &ls);
50  friend StructManipulator setDisplayLogLevel(const Log::LogLevel logLevel);
51  friend StructManipulator setLogLevel(const Log::LogLevel logLevel);
52  public:
56  Logstream(std::ostream &logTarget) : _logTarget(logTarget), _constructionTime(boost::posix_time::microsec_clock::local_time())
57  {
58  _carriageReturn = true;
59  _displayLogLevel = Log::LogLevel::Info;
60  _streamLogLevel = Log::LogLevel::Info;
61  };
62 
71  template <class T> friend Logstream &operator<<(Logstream &ls, const T &rhs)
72  {
73  if (ls._displayLogLevel < ls._streamLogLevel) return ls;
74  if (ls._streamLogLevel == Log::LogLevel::Warning) ls._logTarget << "\033[31m";
75  if (ls._carriageReturn)
76  {
77  float dt = float((boost::posix_time::microsec_clock::local_time() - ls._constructionTime).total_microseconds());
78  ls._logTarget << "[" << std::fixed << std::setprecision(6) << dt / 1000000.0f << "][";
79  if (ls._streamLogLevel == LogLevel::Debug) ls._logTarget << "D";
80  else if (ls._streamLogLevel == LogLevel::Info) ls._logTarget << "I";
81  else if (ls._streamLogLevel == LogLevel::Warning) ls._logTarget << "W";
82  else if (ls._streamLogLevel == LogLevel::Error) ls._logTarget << "E";
83  ls._logTarget << "] ";
84  ls._carriageReturn = false;
85  }
86  ls._logTarget << rhs;
87  if (ls._streamLogLevel == Log::LogLevel::Warning) ls._logTarget << "\033[0m";
88 
89  return ls;
90  }
91 
99  {
100  _streamLogLevel = rhs;
101  return *this;
102  }
103 
110  Logstream &operator<<(const Manipulator &rhs)
111  {
112  return rhs(*this);
113  }
114 
122  {
123  return rhs(*this);
124  }
125 
126  private:
127  std::ostream &_logTarget;
128  boost::posix_time::ptime _constructionTime;
129 
130  bool _carriageReturn;
131  Log::LogLevel _displayLogLevel;
132  Log::LogLevel _streamLogLevel;
133  };
134 
135  #pragma region Manipulators
136 
142  inline Logstream &endl(Logstream &ls)
143  {
144  if (ls._displayLogLevel >= ls._streamLogLevel)
145  {
146  ls._logTarget << std::endl;
147  ls._carriageReturn = true;
148  }
149  return ls;
150  }
151 
159  {
160  auto manipulator = [logLevel](Logstream &ls)->Logstream &
161  {
162  ls._displayLogLevel = logLevel;
163  return ls;
164  };
165  return manipulator;
166  }
167 
175  {
176  auto manipulator = [logLevel](Logstream &ls)->Logstream &
177  {
178  ls._streamLogLevel = logLevel;
179  return ls;
180  };
181  return manipulator;
182  }
183  #pragma endregion
184 
185  extern Logstream log;
186 }
Log::Logstream::operator<<
Logstream & operator<<(const Manipulator &rhs)
Apply plain output manipulator to log stream.
Definition: Log.hpp:110
Log::setDisplayLogLevel
StructManipulator setDisplayLogLevel(const Log::LogLevel logLevel)
Generate output modifier to set the display log level filter.
Definition: Log.hpp:158
Log::log
Logstream log(std::cout)
Global Logstream instance.
Definition: Log.hpp:185
Log::Logstream
Log stream object for simple output filtering.
Definition: Log.hpp:47
SpinComponent::None
@ None
No spin component specified.
Log::Logstream::operator<<
Logstream & operator<<(const StructManipulator &rhs)
Apply structured output manipulator to log stream.
Definition: Log.hpp:121
Log::endl
Logstream & endl(Logstream &ls)
Output modifier to print new line.
Definition: Log.hpp:142
Log::Logstream::Logstream
Logstream(std::ostream &logTarget)
Construct a new Logstream object with log filtering to Log::LogLevel::Info.
Definition: Log.hpp:56
Log::setLogLevel
StructManipulator setLogLevel(const Log::LogLevel logLevel)
Generate output modifier to change the log level.
Definition: Log.hpp:174
Log::Logstream::operator<<
Logstream & operator<<(const Log::LogLevel &rhs)
Output operator for LogLevel objects to set filter level.
Definition: Log.hpp:98
Log::Logstream::setLogLevel
friend StructManipulator setLogLevel(const Log::LogLevel logLevel)
Generate output modifier to change the log level.
Definition: Log.hpp:174
Log::Logstream::operator<<
friend Logstream & operator<<(Logstream &ls, const T &rhs)
Output operator for messages of arbitrary type. Will accept any log object that implements the output...
Definition: Log.hpp:71
Log::StructManipulator
std::function< Logstream &(Logstream &)> StructManipulator
Logstream manipulator type with internal structure.
Definition: Log.hpp:29
Log::LogLevel
LogLevel
Specify log level for output filtering. Any Log level includes also output from lower output levels.
Definition: Log.hpp:20
Log::Logstream::endl
friend Logstream & endl(Logstream &ls)
Output modifier to print new line.
Definition: Log.hpp:142
Log::Logstream::setDisplayLogLevel
friend StructManipulator setDisplayLogLevel(const Log::LogLevel logLevel)
Generate output modifier to set the display log level filter.
Definition: Log.hpp:158