Optimized memory usage, cleaned up api.
authorSebastian Goth <seezer@roath.org>
Mon, 28 Jul 2008 10:56:32 +0000 (12:56 +0200)
committerSebastian Goth <seezer@roath.org>
Wed, 30 Jul 2008 09:25:00 +0000 (11:25 +0200)
Loggerobjects don't get copied after initialization anymore.
Removed Stream-struct; no more heap allocations made.
Thanks for teaching me so good EgS!

src/common/logger.cpp
src/common/logger.h
src/common/types.h

index 60cc98c..59efa6b 100644 (file)
 
 Logger::~Logger() {
   QDateTime date = QDateTime::currentDateTime();
 
 Logger::~Logger() {
   QDateTime date = QDateTime::currentDateTime();
-  if(_stream->logLevel == DebugLevel) _stream->buffer.prepend("Debug: ");
-  else if (_stream->logLevel == InfoLevel) _stream->buffer.prepend("Info: ");
-  else if (_stream->logLevel == WarningLevel) _stream->buffer.prepend("Warning: ");
-  else if (_stream->logLevel == ErrorLevel) _stream->buffer.prepend("Error: ");
-  _stream->buffer.prepend(date.toString("yyyy-MM-dd hh:mm:ss "));
+  if(_logLevel == DebugLevel) _buffer.prepend("Debug: ");
+  else if (_logLevel == InfoLevel) _buffer.prepend("Info: ");
+  else if (_logLevel == WarningLevel) _buffer.prepend("Warning: ");
+  else if (_logLevel == ErrorLevel) _buffer.prepend("Error: ");
+  _buffer.prepend(date.toString("yyyy-MM-dd hh:mm:ss "));
   log();
   log();
-  delete _stream;
 }
 
 void Logger::log() {
 }
 
 void Logger::log() {
@@ -44,7 +43,7 @@ void Logger::log() {
   else if (Global::parser.value("loglevel") == "Error") lvl = ErrorLevel;
   else lvl = InfoLevel;
 
   else if (Global::parser.value("loglevel") == "Error") lvl = ErrorLevel;
   else lvl = InfoLevel;
 
-  if(_stream->logLevel < lvl) return;
+  if(_logLevel < lvl) return;
 
   // if we can't open logfile we log to stdout
   QTextStream out(stdout);
 
   // if we can't open logfile we log to stdout
   QTextStream out(stdout);
@@ -53,9 +52,9 @@ void Logger::log() {
     file.setFileName(Global::parser.value("logfile"));
     if (file.open(QIODevice::Append | QIODevice::Text)) {
       out.setDevice(&file);
     file.setFileName(Global::parser.value("logfile"));
     if (file.open(QIODevice::Append | QIODevice::Text)) {
       out.setDevice(&file);
-      _stream->buffer.remove(QChar('\n'));
+      _buffer.remove(QChar('\n'));
     }
   }
     }
   }
-  out << _stream->buffer << "\n";
+  out << _buffer << endl;
   if(file.isOpen()) file.close();
 }
   if(file.isOpen()) file.close();
 }
index 708801a..c372a11 100644 (file)
@@ -36,50 +36,39 @@ class Logger {
       ErrorLevel
     };
 
       ErrorLevel
     };
 
-    inline Logger(LogLevel level) : _stream(new Stream(level)) {}
+    inline Logger(LogLevel level) : _stream(&_buffer, QIODevice::WriteOnly), _logLevel(level) {}
     ~Logger();
 
     ~Logger();
 
-    inline Logger &operator<<(const char* t) { _stream->internalStream << QString::fromAscii(t); return *this; }
-    inline Logger &operator<<(QChar t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(bool t) { _stream->internalStream << (t ? "true" : "false"); return *this; }
-    inline Logger &operator<<(char t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(signed short t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(unsigned short t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(signed int t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(unsigned int t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(signed long t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(unsigned long t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(qint64 t) { _stream->internalStream << QString::number(t); return *this; }
-    inline Logger &operator<<(quint64 t) { _stream->internalStream << QString::number(t); return *this; }
-    inline Logger &operator<<(float t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(double t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(const QString & t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(const QLatin1String &t) { _stream->internalStream << t.latin1(); return *this; }
-    inline Logger &operator<<(const QByteArray & t) { _stream->internalStream << t ; return *this; }
-    inline Logger &operator<<(const void * t) { _stream->internalStream << t; return *this; }
-    inline Logger &operator<<(const QStringList & t) { _stream->internalStream << t.join(" "); return *this; }
-    inline Logger &operator<<(const BufferId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
-    inline Logger &operator<<(const NetworkId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
-    inline Logger &operator<<(const UserId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
-    inline Logger &operator<<(const MsgId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
-    inline Logger &operator<<(const IdentityId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
-    inline Logger &operator<<(const AccountId & t) { _stream->internalStream << QVariant::fromValue(t).toInt(); return *this; }
+    template<typename T>
+    inline Logger &operator<<(const T &value) { _stream << value; return *this; }
+    inline Logger &operator<<(const QStringList & t) { _stream << t.join(" "); return *this; }
+    inline Logger &operator<<(const char* t) { _stream << QString::fromLocal8Bit(t); return *this; }
+    inline Logger &operator<<(bool t) { _stream << (t ? "true" : "false"); return *this; }
 
 
-    void log();
   private:
   private:
-    struct Stream {
-      Stream(LogLevel level)
-      : internalStream(&buffer, QIODevice::WriteOnly),
-        logLevel(level) {}
-      QTextStream internalStream;
-      QString buffer;
-      LogLevel logLevel;
-    } *_stream;
+    void log();
+    QTextStream _stream;
+    QString _buffer;
+    LogLevel _logLevel;
+};
+
+class quDebug : public Logger {
+  public:
+    inline quDebug() : Logger(Logger::DebugLevel) {}
+};
+
+class quInfo : public Logger {
+  public:
+    inline quInfo() : Logger(Logger::InfoLevel) {}
 };
 
 };
 
-inline Logger quDebug() { return Logger(Logger::DebugLevel); }
-inline Logger quInfo() { return Logger(Logger::InfoLevel); }
-inline Logger quWarning() { return Logger(Logger::WarningLevel); }
-inline Logger quError() { return Logger(Logger::ErrorLevel); }
+class quWarning : public Logger {
+  public:
+    inline quWarning() : Logger(Logger::WarningLevel) {}
+};
 
 
+class quError : public Logger {
+  public:
+    inline quError() : Logger(Logger::ErrorLevel) {}
+};
 #endif
 #endif
index 0154247..c6a4bb1 100644 (file)
@@ -24,6 +24,7 @@
 #include <QDebug>
 #include <QString>
 #include <QVariant>
 #include <QDebug>
 #include <QString>
 #include <QVariant>
+#include <QTextStream>
 
 class SignedId {
   protected:
 
 class SignedId {
   protected:
@@ -54,6 +55,7 @@ class SignedId {
 
 inline QDataStream &operator<<(QDataStream &out, const SignedId &signedId) { out << signedId.toInt(); return out; }
 inline QDataStream &operator>>(QDataStream &in, SignedId &signedId) { in >> signedId.id; return in; }
 
 inline QDataStream &operator<<(QDataStream &out, const SignedId &signedId) { out << signedId.toInt(); return out; }
 inline QDataStream &operator>>(QDataStream &in, SignedId &signedId) { in >> signedId.id; return in; }
+inline QTextStream &operator<<(QTextStream &out, const SignedId &signedId) { out << QString::number(signedId.toInt()); return out; }
 inline QDebug operator<<(QDebug dbg, const SignedId &signedId) { dbg.space() << signedId.toInt(); return dbg; }
 inline uint qHash(const SignedId &id) { return qHash(id.toInt()); }
 
 inline QDebug operator<<(QDebug dbg, const SignedId &signedId) { dbg.space() << signedId.toInt(); return dbg; }
 inline uint qHash(const SignedId &id) { return qHash(id.toInt()); }