1 /* Logger.h */
2
3 /* Copyright (C) 2011-2020 Michael Lugmair (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 <QMetaType>
29
30 /**
31 * @brief The Log enum
32 * @ingroup Helper
33 */
34 class QString;
35 class QStringList;
36 class QByteArray;
37 class QPoint;
38 class QChar;
39 class LogListener;
40 class QRegion;
41 class QMargins;
42 class QSize;
43 class QRect;
44
45 enum class Log : unsigned char
46 {
47 Warning=0,
48 Error,
49 Info,
50 Debug,
51 Develop,
52 Crazy,
53 Always
54 };
55
56
57 /**
58 * @brief The Logger class
59 * @ingroup Helper
60 */
61 class Logger
62 {
63
64 private:
65 struct Private;
66 Private* m=nullptr;
67
68 public:
69 explicit Logger(const Log& type, const QString& class_name);
70
71 ~Logger();
72
73 static void registerLogListener(LogListener* logListener);
74
75 Logger& operator << (const QString& msg);
76 Logger& operator << (const QChar& c);
77 Logger& operator << (const QStringList& lst);
78 Logger& operator << (const QByteArray& arr);
79 Logger& operator << (const QPoint& point);
80 Logger& operator << (const QSize& size);
81 Logger& operator << (const QRect& size);
82 Logger& operator << (const char* str);
83 Logger& operator << (const std::string& str);
84 Logger& operator << (const Log& log_type);
85
86 template<typename T>
87 typename std::enable_if< std::is_floating_point<T>::value, Logger&>::type
88 operator << (const T& val){
89
90 (*this) << std::to_string(val);
91
92 return *this;
93 }
94
95 template<typename T>
96 typename std::enable_if< std::is_integral<T>::value, Logger&>::type
97 operator << (const T& val){
98
99 (*this) << std::to_string(val);
100
101 return *this;
102 }
103
104 template<typename T, template <typename ELEM> class CONT>
105 Logger& operator << (const CONT<T> list){
106 for(const T& item : list){
107 (*this) << std::to_string(item) << ", ";
108 }
109
110 return *this;
111 }
112 };
113
114 Logger spLog(const Log& type, const std::string& data);
115 Logger spLog(const Log& type, const char* data);
116
117 template<typename T>
118 typename std::enable_if< std::is_class<T>::value, Logger>::type
spLog(const Log & type,const T *)119 spLog(const Log& type, const T*)
120 {
121 return spLog(type, typeid(T).name());
122 }
123
124 Q_DECLARE_METATYPE(Log)
125
126 #endif // LOGGER_H
127