summaryrefslogtreecommitdiffstats
path: root/src/dm/systems/Qt3DSDMSignalStructImpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/dm/systems/Qt3DSDMSignalStructImpl.h')
-rw-r--r--src/dm/systems/Qt3DSDMSignalStructImpl.h305
1 files changed, 305 insertions, 0 deletions
diff --git a/src/dm/systems/Qt3DSDMSignalStructImpl.h b/src/dm/systems/Qt3DSDMSignalStructImpl.h
new file mode 100644
index 0000000..9664566
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignalStructImpl.h
@@ -0,0 +1,305 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SIGNAL_STRUCT_IMPL_H
+#define QT3DSDM_SIGNAL_STRUCT_IMPL_H
+#include "Qt3DSDMSignalStructs.h"
+
+namespace qt3dsdm {
+
+struct SSignalDataStruct0
+{
+ typedef SSignalDataStruct0 TThisType;
+ typedef std::function<void()> TFunType;
+ static void Send(ISignalSystem &system, void *sender, const char *sigName)
+ {
+ system.Signal(sender, sigName, NULL, 0);
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == 0)
+ inHandler();
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(std::function<void()> inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT0(name) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void()> inHandler) \
+ { \
+ typedef SSignalDataStruct0 TBase; \
+ return TBase::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender) \
+ { \
+ typedef SSignalDataStruct0 TBase; \
+ TBase::Send(system, sender, #name); \
+ }
+
+template <typename TData1>
+struct SSignalDataStruct1
+{
+ typedef SSignalDataStruct1<TData1> TThisType;
+ TData1 m_Data1;
+ typedef std::function<void(TData1)> TFunType;
+ SSignalDataStruct1(TData1 d1)
+ : m_Data1(d1)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1)
+ {
+ TThisType theData(d1);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT1(name, d1) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1)> inHandler) \
+ { \
+ typedef SSignalDataStruct1<d1> TBase; \
+ return TBase::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg) \
+ { \
+ typedef SSignalDataStruct1<d1> TBase; \
+ TBase::Send(system, sender, #name, arg); \
+ }
+
+template <typename TData1, typename TData2>
+struct SSignalDataStruct2
+{
+ typedef SSignalDataStruct2<TData1, TData2> TThisType;
+ typedef std::function<void(TData1, TData2)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ SSignalDataStruct2(TData1 d1, TData2 d2)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2)
+ {
+ TThisType theData(d1, d2);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT2(name, d1, d2) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2)> inHandler) \
+ { \
+ return SSignalDataStruct2<d1, d2>::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2) \
+ { \
+ SSignalDataStruct2<d1, d2>::Send(system, sender, #name, arg1, arg2); \
+ }
+
+template <typename TData1, typename TData2, typename TData3>
+struct SSignalDataStruct3
+{
+ typedef SSignalDataStruct3<TData1, TData2, TData3> TThisType;
+ typedef std::function<void(TData1, TData2, TData3)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ TData3 m_Data3;
+ SSignalDataStruct3(const TData1 &d1, const TData2 &d2, const TData3 &d3)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ , m_Data3(d3)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2, const TData3 &d3)
+ {
+ TThisType theData(d1, d2, d3);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT3(name, d1, d2, d3) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3)> inHandler) \
+ { \
+ return SSignalDataStruct3<d1, d2, d3>::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3) \
+ { \
+ SSignalDataStruct3<d1, d2, d3>::Send(system, sender, #name, arg1, arg2, arg3); \
+ }
+
+template <typename TData1, typename TData2, typename TData3, typename TData4>
+struct SSignalDataStruct4
+{
+ typedef SSignalDataStruct4<TData1, TData2, TData3, TData4> TThisType;
+ typedef std::function<void(TData1, TData2, TData3, TData4)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ TData3 m_Data3;
+ TData4 m_Data4;
+ SSignalDataStruct4(const TData1 &d1, const TData2 &d2, const TData3 &d3, const TData4 &d4)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ , m_Data3(d3)
+ , m_Data4(d4)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2, const TData3 &d3, const TData4 &d4)
+ {
+ TThisType theData(d1, d2, d3, d4);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2, theData->m_Data4);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT4(name, d1, d2, d3, d4) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3, d4)> inHandler) \
+ { \
+ return SSignalDataStruct4<d1, d2, d3, d4>::AddListener(inSystem, inSender, #name, \
+ inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3, const d4 &arg4) \
+ { \
+ SSignalDataStruct4<d1, d2, d3, d4>::Send(system, sender, #name, arg1, arg2, arg3, arg4); \
+ }
+}
+#endif