Sayonara Player
Logger.h
1 /* Logger.h */
2 
3 /* Copyright (C) 2011-2017 Lucio Carreras
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef LOGGER_H
22 #define LOGGER_H
23 
24 #include <typeinfo>
25 #include <type_traits>
26 #include <string>
27 #include <QString>
28 #include <QObject>
29 
34 class QString;
35 class QStringList;
36 class QByteArray;
37 class QPoint;
38 class QChar;
39 class QObject;
40 class LogListener;
41 class QRegion;
42 class QMargins;
43 
44 enum class Log : unsigned char
45 {
46  Warning=0,
47  Error,
48  Info,
49  Debug,
50  Develop,
51  Crazy
52 };
53 
54 
59 class Logger
60 {
61 
62 private:
63  struct Private;
64  Private* m=nullptr;
65 
66 public:
67  explicit Logger(const Log& type, const QString& class_name);
68 
69  ~Logger();
70 
71  static void register_log_listener(LogListener* log_listener);
72 
73  Logger& operator << (const QString& msg);
74  Logger& operator << (const QChar& c);
75  Logger& operator << (const QStringList& lst);
76  Logger& operator << (const QByteArray& arr);
77  Logger& operator << (const QPoint& point);
78  Logger& operator << (const QSize& size);
79  Logger& operator << (const QRect& size);
80  Logger& operator << (const char* str);
81  Logger& operator << (const std::string& str);
82  Logger& operator << (const Log& log_type);
83 
84  template<typename T>
85  typename std::enable_if< std::is_floating_point<T>::value, Logger&>::type
86  operator << (const T& val){
87 
88  (*this) << std::to_string(val);
89 
90  return *this;
91  }
92 
93  template<typename T>
94  typename std::enable_if< std::is_integral<T>::value, Logger&>::type
95  operator << (const T& val){
96 
97  (*this) << std::to_string(val);
98 
99  return *this;
100  }
101 
102  template<typename T, template <typename ELEM> class CONT>
103  Logger& operator << (const CONT<T> list){
104  for(const T& item : list){
105  (*this) << std::to_string(item) << ", ";
106  }
107 
108  return *this;
109  }
110 };
111 
112 Logger sp_log(const Log& type);
113 Logger sp_log(const Log& type, const char* data);
114 
115 template<typename T>
116 typename std::enable_if< std::is_class<T>::value, Logger>::type
117 sp_log(const Log& type, const T*)
118 {
119  return sp_log(type, typeid(T).name());
120 }
121 
122 Q_DECLARE_METATYPE(Log)
123 
124 #endif // LOGGER_H
The Logger class.
Definition: Logger.h:59
Definition: LogListener.h:32