2018-02-26 09:09:21 +01:00
|
|
|
/******************************************************************************
|
|
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
|
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#include "QskGlobal.h"
|
|
|
|
#include "QskMetaCall.h"
|
|
|
|
#include "QskMetaFunction.h"
|
|
|
|
|
|
|
|
QskMetaFunction::QskMetaFunction():
|
|
|
|
m_invokable( nullptr ),
|
|
|
|
m_parameterTypes( nullptr )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QskMetaFunction::QskMetaFunction( const QskMetaFunction& other ):
|
|
|
|
m_invokable( other.m_invokable ),
|
|
|
|
m_parameterTypes( other.m_parameterTypes )
|
|
|
|
{
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->ref();
|
|
|
|
}
|
|
|
|
|
|
|
|
QskMetaFunction::QskMetaFunction( QskMetaFunction&& other ):
|
|
|
|
m_invokable( other.m_invokable ),
|
|
|
|
m_parameterTypes( other.m_parameterTypes )
|
|
|
|
{
|
|
|
|
other.m_invokable = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
QskMetaFunction::~QskMetaFunction()
|
|
|
|
{
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->destroyIfLastRef();
|
|
|
|
}
|
|
|
|
|
|
|
|
QskMetaFunction& QskMetaFunction::operator=( QskMetaFunction&& other )
|
|
|
|
{
|
|
|
|
if ( m_invokable != other.m_invokable )
|
|
|
|
{
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->destroyIfLastRef();
|
|
|
|
|
|
|
|
m_invokable = other.m_invokable;
|
|
|
|
other.m_invokable = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_parameterTypes = other.m_parameterTypes;
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
QskMetaFunction& QskMetaFunction::operator=( const QskMetaFunction& other )
|
|
|
|
{
|
|
|
|
if ( m_invokable != other.m_invokable )
|
|
|
|
{
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->destroyIfLastRef();
|
|
|
|
|
|
|
|
m_invokable = other.m_invokable;
|
|
|
|
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->ref();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_parameterTypes = other.m_parameterTypes;
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2018-02-27 17:47:23 +01:00
|
|
|
void QskMetaFunction::init( QskMetaCall::Invokable* invokable,
|
|
|
|
const int* parameterTypes )
|
|
|
|
{
|
|
|
|
m_invokable = invokable;
|
|
|
|
#if 0
|
|
|
|
if ( m_invokable )
|
|
|
|
m_invokable->ref();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
m_parameterTypes = parameterTypes;
|
|
|
|
}
|
|
|
|
|
2018-02-26 09:09:21 +01:00
|
|
|
const int* QskMetaFunction::parameterTypes() const
|
|
|
|
{
|
|
|
|
return m_parameterTypes;
|
|
|
|
}
|
|
|
|
|
2018-02-27 17:47:23 +01:00
|
|
|
size_t QskMetaFunction::parameterCount() const
|
|
|
|
{
|
|
|
|
if ( m_parameterTypes )
|
|
|
|
{
|
|
|
|
for ( int i = 1; ; i++ )
|
|
|
|
{
|
|
|
|
if ( m_parameterTypes[ i ] == QMetaType::UnknownType )
|
|
|
|
return i + 1; // including the return type
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1; // we always have a return type
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-26 09:09:21 +01:00
|
|
|
QskMetaFunction::Type QskMetaFunction::functionType() const
|
|
|
|
{
|
|
|
|
if ( m_invokable == nullptr )
|
|
|
|
return Invalid;
|
|
|
|
|
|
|
|
return static_cast< QskMetaFunction::Type >( m_invokable->typeInfo() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void QskMetaFunction::invoke(
|
2018-02-27 17:47:23 +01:00
|
|
|
QObject* object, void* argv[], Qt::ConnectionType connectionType )
|
2018-02-26 09:09:21 +01:00
|
|
|
{
|
|
|
|
if ( m_invokable )
|
2018-02-27 17:47:23 +01:00
|
|
|
{
|
|
|
|
QskMetaCall::invoke( object, *m_invokable,
|
|
|
|
parameterCount(), parameterTypes(), argv, connectionType );
|
|
|
|
}
|
2018-02-26 09:09:21 +01:00
|
|
|
}
|