/**************************************************************************** ** ** Copyright (C) 2016 Jochen Becher ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** 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. ** ****************************************************************************/ #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 = 0; 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 = 0; 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) = 0; 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 = 0; void (U::*m_setter)(V) = 0; 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 &) = 0; 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) = 0; 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 &) = 0; void (*m_setFunc)(U &, V) = 0; 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