// Copyright (C) 2016 Jochen Becher // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "parameters.h" #include namespace qark { template class Ref { public: Ref(const QString &qualifiedName, T *value) : m_qualifiedName(qualifiedName), m_value(value) { } Ref(const QString &qualifiedName, T *value, const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_value(value), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } T *value() const { return m_value; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; T *m_value = nullptr; Parameters m_parameters; }; template Ref ref(const QString &qualifiedName, T * const &value) { return Ref(qualifiedName, &value); } template Ref ref(const QString &qualifiedName, T * const &value, const Parameters ¶meters) { return Ref(qualifiedName, &value, parameters); } template Ref ref(const QString &qualifiedName, T *&value) { return Ref(qualifiedName, &value); } template Ref ref(const QString &qualifiedName, T *&value, const Parameters ¶meters) { return Ref(qualifiedName, &value, parameters); } template class GetterRef { public: GetterRef(const QString &qualifiedName, const U &u, T (U::*getter)() const) : m_qualifiedName(qualifiedName), m_u(u), m_getter(getter) { } GetterRef(const QString &qualifiedName, const U &u, T (U::*getter)() const, const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_getter(getter), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } const U &object() const { return m_u; } T (U::*getter() const)() const { return m_getter; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; const U &m_u; T (U::*m_getter)() const = nullptr; Parameters m_parameters; }; template GetterRef ref(const QString &qualifiedName, const U &u, T *(U::*getter)() const) { return GetterRef(qualifiedName, u, getter); } template GetterRef ref(const QString &qualifiedName, const U &u, T *(U::*getter)() const, const Parameters ¶meters) { return GetterRef(qualifiedName, u, getter, parameters); } template class SetterRef { public: SetterRef(const QString &qualifiedName, U &u, void (U::*setter)(T)) : m_qualifiedName(qualifiedName), m_u(u), m_setter(setter) { } SetterRef(const QString &qualifiedName, U &u, void (U::*setter)(T), const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_setter(setter), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } U &object() const { return m_u; } void (U::*setter() const)(T) { return m_setter; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; U &m_u; void (U::*m_setter)(T) = nullptr; Parameters m_parameters; }; template SetterRef ref(const QString &qualifiedName, U &u, void (U::*setter)(T *)) { return SetterRef(qualifiedName, u, setter); } template SetterRef ref(const QString &qualifiedName, U &u, void (U::*setter)(T *), const Parameters ¶meters) { return SetterRef(qualifiedName, u, setter, parameters); } template SetterRef ref(const QString &qualifiedName, U &u, void (U::*setter)(T * const &)) { return SetterRef(qualifiedName, u, setter); } template SetterRef ref(const QString &qualifiedName, U &u, void (U::*setter)(T * const &), const Parameters ¶meters) { return SetterRef(qualifiedName, u, setter, parameters); } template class GetterSetterRef { public: GetterSetterRef(const QString &qualifiedName, U &u, T (U::*getter)() const, void (U::*setter)(V)) : m_qualifiedName(qualifiedName), m_u(u), m_getter(getter), m_setter(setter) { } GetterSetterRef(const QString &qualifiedName, U &u, T (U::*getter)() const, void (U::*setter)(V), const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_getter(getter), m_setter(setter), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } U &object() const { return m_u; } T (U::*getter() const)() const { return m_getter; } void (U::*setter() const)(V) { return m_setter; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; U &m_u; T (U::*m_getter)() const = nullptr; void (U::*m_setter)(V) = nullptr; Parameters m_parameters; }; template GetterSetterRef ref(const QString &qualifiedName, U &u, T *(U::*getter)() const, void (U::*setter)(V *)) { return GetterSetterRef(qualifiedName, u, getter, setter); } template GetterSetterRef ref(const QString &qualifiedName, U &u, T *(U::*getter)() const, void (U::*setter)(V *), const Parameters ¶meters) { return GetterSetterRef(qualifiedName, u, getter, setter, parameters); } template GetterSetterRef ref(const QString &qualifiedName, U &u, T *(U::*getter)() const, void (U::*setter)(V * const &)) { return GetterSetterRef(qualifiedName, u, getter, setter); } template GetterSetterRef ref(const QString &qualifiedName, U &u, T *(U::*getter)() const, void (U::*setter)(V * const &), const Parameters ¶meters) { return GetterSetterRef(qualifiedName, u, getter, setter, parameters); } template class GetFuncRef { public: GetFuncRef(const QString &qualifiedName, const U &u, T (*func)(const U &)) : m_qualifiedName(qualifiedName), m_u(u), m_getFunc(func) { } GetFuncRef(const QString &qualifiedName, const U &u, T (*func)(const U &), const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_getFunc(func), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } const U &object() const { return m_u; } T (*getterFunc() const)(const U &) { return m_getFunc; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; const U &m_u; T (*m_getFunc)(const U &) = nullptr; Parameters m_parameters; }; template GetFuncRef ref(const QString &qualifiedName, const U &u, T *(*func)(const U &)) { return GetFuncRef(qualifiedName, u, func); } template GetFuncRef ref(const QString &qualifiedName, const U &u, T *(*func)(const U &), const Parameters ¶meters) { return GetFuncRef(qualifiedName, u, func, parameters); } template class SetFuncRef { public: SetFuncRef(const QString &qualifiedName, U &u, void (*setFunc)(U &, T)) : m_qualifiedName(qualifiedName), m_u(u), m_setFunc(setFunc) { } SetFuncRef(const QString &qualifiedName, U &u, void (*setFunc)(U &, T), const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_setFunc(setFunc), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } U &object() const { return m_u; } void (*setterFunc() const)(U &, T) { return m_setFunc; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; U &m_u; void (*m_setFunc)(U &, T) = nullptr; Parameters m_parameters; }; template SetFuncRef ref(const QString &qualifiedName, U &u, void (*setFunc)(U &, T *)) { return SetFuncRef(qualifiedName, u, setFunc); } template SetFuncRef ref(const QString &qualifiedName, U &u, void (*setFunc)(U &, T *), const Parameters ¶meters) { return SetFuncRef(qualifiedName, u, setFunc, parameters); } template SetFuncRef ref(const QString &qualifiedName, U &u, void (*setFunc)(U &, T * const &)) { return SetFuncRef(qualifiedName, u, setFunc); } template SetFuncRef ref(const QString &qualifiedName, U &u, void (*setFunc)(U &, T * const &), const Parameters ¶meters) { return SetFuncRef(qualifiedName, u, setFunc, parameters); } template class GetSetFuncRef { public: GetSetFuncRef(const QString &qualifiedName, U &u, T (*func)(const U &), void (*setFunc)(U &, V)) : m_qualifiedName(qualifiedName), m_u(u), m_getFunc(func), m_setFunc(setFunc) { } GetSetFuncRef(const QString &qualifiedName, U &u, T (*func)(const U &), void (*setFunc)(U &, V), const Parameters ¶meters) : m_qualifiedName(qualifiedName), m_u(u), m_getFunc(func), m_setFunc(setFunc), m_parameters(parameters) { } const QString &qualifiedName() const { return m_qualifiedName; } U &object() const { return m_u; } T (*getterFunc() const)(const U &) { return m_getFunc; } void (*setterFunc() const)(U &, V) { return m_setFunc; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; U &m_u; T (*m_getFunc)(const U &) = nullptr; void (*m_setFunc)(U &, V) = nullptr; Parameters m_parameters; }; template GetSetFuncRef ref(const QString &qualifiedName, U &u, T *(*func)(const U &), void (*setFunc)(U &, V *)) { return GetSetFuncRef(qualifiedName, u, func, setFunc); } template GetSetFuncRef ref(const QString &qualifiedName, U &u, T *(*func)(const U &), void (*setFunc)(U &, V *), const Parameters ¶meters) { return GetSetFuncRef(qualifiedName, u, func, setFunc, parameters); } template GetSetFuncRef ref(const QString &qualifiedName, U &u, T *(*func)(const U &), void (*setFunc)(U &, V * const &)) { return GetSetFuncRef(qualifiedName, u, func, setFunc); } template GetSetFuncRef ref(const QString &qualifiedName, U &u, T *(*func)(const U &), void (*setFunc)(U &, V * const &), const Parameters ¶meters) { return GetSetFuncRef(qualifiedName, u, func, setFunc, parameters); } } // namespace qark