SignalProxy::ExtendedMetaObject cleanup
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 13 Aug 2009 20:01:45 +0000 (22:01 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 24 Aug 2009 19:54:06 +0000 (21:54 +0200)
src/common/signalproxy.cpp
src/common/signalproxy.h

index d7d2c5c..764223e 100644 (file)
@@ -1179,42 +1179,15 @@ void SignalProxy::updateSecureState() {
 // ==================================================
 SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
   : _meta(meta),
-    _updatedRemotelyId(-1)
+    _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
 {
 }
 
-const QList<int> &SignalProxy::ExtendedMetaObject::argTypes(int methodId) {
-  if(!_argTypes.contains(methodId)) {
-    QList<QByteArray> paramTypes = _meta->method(methodId).parameterTypes();
-    QList<int> argTypes;
-    for(int i = 0; i < paramTypes.count(); i++) {
-      argTypes.append(QMetaType::type(paramTypes[i]));
-    }
-    _argTypes[methodId] = argTypes;
-  }
-  return _argTypes[methodId];
-}
-
-int SignalProxy::ExtendedMetaObject::returnType(int methodId) {
-  if(!_returnType.contains(methodId)) {
-    _returnType[methodId] = QMetaType::type(_meta->method(methodId).typeName());
-  }
-  return _returnType[methodId];
-}
-
-int SignalProxy::ExtendedMetaObject::minArgCount(int methodId) {
-  if(!_minArgCount.contains(methodId)) {
-    QString signature(_meta->method(methodId).signature());
-    _minArgCount[methodId] = _meta->method(methodId).parameterTypes().count() - signature.count("=");
-  }
-  return _minArgCount[methodId];
-}
-
-const QByteArray &SignalProxy::ExtendedMetaObject::methodName(int methodId) {
-  if(!_methodNames.contains(methodId)) {
-    _methodNames[methodId] = methodName(_meta->method(methodId));
+const SignalProxy::ExtendedMetaObject::MethodDescriptor &SignalProxy::ExtendedMetaObject::methodDescriptor(int methodId) {
+  if(!_methods.contains(methodId)) {
+    _methods[methodId] = MethodDescriptor(_meta->method(methodId));
   }
-  return _methodNames[methodId];
+  return _methods[methodId];
 }
 
 int SignalProxy::ExtendedMetaObject::methodId(const QByteArray &methodName) {
@@ -1333,13 +1306,6 @@ const QHash<int, int> &SignalProxy::ExtendedMetaObject::receiveMap() {
   return _receiveMap;
 }
 
-int SignalProxy::ExtendedMetaObject::updatedRemotelyId() {
-  if(_updatedRemotelyId == -1) {
-    _updatedRemotelyId = _meta->indexOfSignal("updatedRemotely()");
-  }
-  return _updatedRemotelyId;
-}
-
 QByteArray SignalProxy::ExtendedMetaObject::methodName(const QMetaMethod &method) {
   QByteArray sig(method.signature());
   return sig.left(sig.indexOf("("));
@@ -1392,3 +1358,20 @@ QString SignalProxy::ExtendedMetaObject::methodBaseName(const QMetaMethod &metho
   return methodname;
 }
 
+SignalProxy::ExtendedMetaObject::MethodDescriptor::MethodDescriptor(const QMetaMethod &method)
+  : _methodName(SignalProxy::ExtendedMetaObject::methodName(method)),
+    _returnType(QMetaType::type(method.typeName()))
+{
+  // determine argTypes
+  QList<QByteArray> paramTypes = method.parameterTypes();
+  QList<int> argTypes;
+  for(int i = 0; i < paramTypes.count(); i++) {
+    argTypes.append(QMetaType::type(paramTypes[i]));
+  }
+  _argTypes = argTypes;
+
+  // determine minArgCount
+  QString signature(method.signature());
+  _minArgCount = method.parameterTypes().count() - signature.count("=");
+}
+
index 4cbaf22..b630fe4 100644 (file)
@@ -211,17 +211,36 @@ private:
 //  ExtendedMetaObject
 // ==================================================
 class SignalProxy::ExtendedMetaObject {
+  class MethodDescriptor {
+  public:
+    MethodDescriptor(const QMetaMethod &method);
+    MethodDescriptor() : _returnType(-1), _minArgCount(-1) {}
+
+    inline const QByteArray &methodName() const { return _methodName; }
+    inline const QList<int> &argTypes() const { return _argTypes; }
+    inline int returnType() const { return _returnType; }
+    inline int minArgCount() const { return _minArgCount; }
+
+  private:
+    QByteArray _methodName;
+    QList<int> _argTypes;
+    int _returnType;
+    int _minArgCount;
+  };
+
 public:
   ExtendedMetaObject(const QMetaObject *meta);
 
-  const QList<int> &argTypes(int methodId);
-  int returnType(int methodId);
-  int minArgCount(int methodId);
-  const QByteArray &methodName(int methodId);
+  inline const QByteArray &methodName(int methodId) { return methodDescriptor(methodId).methodName(); }
+  inline const QList<int> &argTypes(int methodId) { return methodDescriptor(methodId).argTypes(); }
+  inline int returnType(int methodId) { return methodDescriptor(methodId).returnType(); }
+  inline int minArgCount(int methodId) { return methodDescriptor(methodId).minArgCount(); }
+
+  inline int updatedRemotelyId() { return _updatedRemotelyId; }
+  
   int methodId(const QByteArray &methodName);
   const QHash<QByteArray, int> &syncMap();
   const QHash<int, int> &receiveMap();
-  int updatedRemotelyId();
 
   const QMetaObject *metaObject() const { return _meta; }
 
@@ -230,17 +249,14 @@ public:
   static QString methodBaseName(const QMetaMethod &method);
 
 private:
-  typedef QHash<int, QList<int> > ArgHash;
-  typedef QHash<int, QByteArray> MethodNameHash;
-  typedef QHash<QByteArray, int> MethodIdHash;
+  const MethodDescriptor &methodDescriptor(int methodId);
 
   const QMetaObject *_meta;
-  ArgHash _argTypes;
-  QHash<int, int> _returnType;
-  QHash<int, int> _minArgCount;
-  MethodNameHash _methodNames;
-  MethodIdHash _methodIds;
+  QHash<int, MethodDescriptor> _methods;
+  QHash<QByteArray, int> _methodIds;
+
   int _updatedRemotelyId; // id of the updatedRemotely() signal - makes things faster
+
   QHash<QByteArray, int> _syncMap;
   QHash<int, int> _receiveMap;
 };