// ==================================================
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) {
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("("));
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("=");
+}
+
// 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; }
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;
};