GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
Record.h
Go to the documentation of this file.
1 #pragma once
2 #include <plog/Severity.h>
3 #include <plog/Util.h>
4 
5 #ifdef __cplusplus_cli
6 #include <vcclr.h> // For PtrToStringChars
7 #endif
8 
9 namespace plog
10 {
11  namespace detail
12  {
14  // Stream output operators as free functions
15 
16  inline void operator<<(util::nostringstream& stream, const char* data)
17  {
18  data = data ? data : "(null)";
19 
20 #if defined(_WIN32) && defined(__BORLANDC__)
21  stream << util::toWide(data);
22 #elif defined(_WIN32)
23  std::operator<<(stream, util::toWide(data));
24 #else
25  std::operator<<(stream, data);
26 #endif
27  }
28 
29  inline void operator<<(util::nostringstream& stream, const std::string& data)
30  {
31  plog::detail::operator<<(stream, data.c_str());
32  }
33 
34 #if PLOG_ENABLE_WCHAR_INPUT
35  inline void operator<<(util::nostringstream& stream, const wchar_t* data)
36  {
37  data = data ? data : L"(null)";
38 
39 # ifdef _WIN32
40  std::operator<<(stream, data);
41 # else
42  std::operator<<(stream, util::toNarrow(data));
43 # endif
44  }
45 
46  inline void operator<<(util::nostringstream& stream, const std::wstring& data)
47  {
48  plog::detail::operator<<(stream, data.c_str());
49  }
50 #endif
51 
52 #ifdef _WIN32
53  namespace meta
54  {
55  template<class T, class Stream>
56  inline char operator<<(Stream&, const T&);
57 
58  template <class T, class Stream>
59  struct isStreamable
60  {
61 #ifdef __INTEL_COMPILER
62 # pragma warning(suppress: 327) // NULL reference is not allowed
63 #endif
64  enum { value = sizeof(operator<<(*reinterpret_cast<Stream*>(0), *reinterpret_cast<const T*>(0))) != sizeof(char) };
65  };
66 
67  template <class Stream>
68  struct isStreamable<std::ios_base& (std::ios_base&), Stream>
69  {
70  enum { value = true };
71  };
72 
73  template <class Stream, size_t N>
74  struct isStreamable<wchar_t[N], Stream>
75  {
76  enum { value = false };
77  };
78 
79  template <class Stream, size_t N>
80  struct isStreamable<const wchar_t[N], Stream>
81  {
82  enum { value = false };
83  };
84 
85  template<bool B, class T = void>
86  struct enableIf {};
87 
88  template<class T>
89  struct enableIf<true, T> { typedef T type; };
90  }
91 
92  template<class T>
93  inline typename meta::enableIf<meta::isStreamable<T, std::ostream>::value && !meta::isStreamable<T, std::wostream>::value, void>::type operator<<(std::wostringstream& stream, const T& data)
94  {
95  std::ostringstream ss;
96  ss << data;
97  stream << ss.str();
98  }
99 #endif
100  }
101 
102  class Record
103  {
104  public:
105  Record(Severity severity, const char* func, size_t line, const char* file, const void* object)
106  : m_severity(severity), m_tid(util::gettid()), m_object(object), m_line(line), m_func(func), m_file(file)
107  {
108  util::ftime(&m_time);
109  }
110 
112  {
113  return *this;
114  }
115 
117  // Stream output operators
118 
119  Record& operator<<(char data)
120  {
121  char str[] = { data, 0 };
122  return *this << str;
123  }
124 
125 #if PLOG_ENABLE_WCHAR_INPUT
126  Record& operator<<(wchar_t data)
127  {
128  wchar_t str[] = { data, 0 };
129  return *this << str;
130  }
131 #endif
132 
133 #ifdef _WIN32
134  Record& operator<<(std::wostream& (*data)(std::wostream&))
135 #else
136  Record& operator<<(std::ostream& (*data)(std::ostream&))
137 #endif
138  {
139  m_message << data;
140  return *this;
141  }
142 
143 #ifdef QT_VERSION
144  Record& operator<<(const QString& data)
145  {
146 # ifdef _WIN32
147  return *this << data.toStdWString();
148 # else
149  return *this << data.toStdString();
150 # endif
151  }
152 
153  Record& operator<<(const QStringRef& data)
154  {
155  QString qstr;
156  return *this << qstr.append(data);
157  }
158 #endif
159 
160 #ifdef __cplusplus_cli
161  Record& operator<<(System::String^ data)
162  {
163  cli::pin_ptr<const System::Char> ptr = PtrToStringChars(data);
164  return *this << static_cast<const wchar_t*>(ptr);
165  }
166 #endif
167 
168  template<typename T>
169  Record& operator<<(const T& data)
170  {
171  using namespace plog::detail;
172 
173  m_message << data;
174  return *this;
175  }
176 
178  // Getters
179 
180  virtual const util::Time& getTime() const
181  {
182  return m_time;
183  }
184 
185  virtual Severity getSeverity() const
186  {
187  return m_severity;
188  }
189 
190  virtual unsigned int getTid() const
191  {
192  return m_tid;
193  }
194 
195  virtual const void* getObject() const
196  {
197  return m_object;
198  }
199 
200  virtual size_t getLine() const
201  {
202  return m_line;
203  }
204 
205  virtual const util::nchar* getMessage() const
206  {
207  m_messageStr = m_message.str();
208  return m_messageStr.c_str();
209  }
210 
211  virtual const char* getFunc() const
212  {
213  m_funcStr = util::processFuncName(m_func);
214  return m_funcStr.c_str();
215  }
216 
217  virtual const char* getFile() const
218  {
219  return m_file;
220  }
221 
222  virtual ~Record() // virtual destructor to satisfy -Wnon-virtual-dtor warning
223  {
224  }
225 
226  private:
227  util::Time m_time;
228  const Severity m_severity;
229  const unsigned int m_tid;
230  const void* const m_object;
231  const size_t m_line;
232  util::nostringstream m_message;
233  const char* const m_func;
234  const char* const m_file;
235  mutable std::string m_funcStr;
236  mutable util::nstring m_messageStr;
237  };
238 }
Definition: AndroidAppender.h:5
Record & operator<<(char data)
Definition: Record.h:119
virtual ~Record()
Definition: Record.h:222
std::string processFuncName(const char *func)
Definition: Util.h:184
Definition: Record.h:11
char nchar
Definition: Util.h:59
virtual const char * getFunc() const
Definition: Record.h:211
virtual const void * getObject() const
Definition: Record.h:195
virtual const util::Time & getTime() const
Definition: Record.h:180
virtual const char * getFile() const
Definition: Record.h:217
std::ostringstream nostringstream
Definition: Util.h:57
virtual size_t getLine() const
Definition: Record.h:200
Record & operator<<(std::ostream &(*data)(std::ostream &))
Definition: Record.h:136
virtual Severity getSeverity() const
Definition: Record.h:185
std::string nstring
Definition: Util.h:56
void operator<<(util::nostringstream &stream, const char *data)
Definition: Record.h:16
Definition: Record.h:102
Record & ref()
Definition: Record.h:111
unsigned int gettid()
Definition: Util.h:112
void operator<<(util::nostringstream &stream, const std::string &data)
Definition: Record.h:29
Definition: Util.h:96
Record & operator<<(const T &data)
Definition: Record.h:169
Record(Severity severity, const char *func, size_t line, const char *file, const void *object)
Definition: Record.h:105
virtual unsigned int getTid() const
Definition: Record.h:190
void ftime(Time *t)
Definition: Util.h:102
virtual const util::nchar * getMessage() const
Definition: Record.h:205
Severity
Definition: Severity.h:5