// 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 Attr { public: Attr(const QString &qualifiedName, T *value) : m_qualifiedName(qualifiedName), m_value(value) { } Attr(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 Attr attr(const QString &qualifiedName, T * const &value) { return Attr(qualifiedName, &value); } template Attr attr(const QString &qualifiedName, T * const &value, const Parameters ¶meters) { return Attr(qualifiedName, &value, parameters); } template Attr attr(const QString &qualifiedName, T &value) { return Attr(qualifiedName, &value); } template Attr attr(const QString &qualifiedName, T &value, const Parameters ¶meters) { return Attr(qualifiedName, &value, parameters); } template class GetterAttr { public: GetterAttr(const QString &qualifiedName, const U &u, T (U::*getter)() const) : m_qualifiedName(qualifiedName), m_u(u), m_getter(getter) { } GetterAttr(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 GetterAttr attr(const QString &qualifiedName, const U &u, T (U::*getter)() const) { return GetterAttr(qualifiedName, u, getter); } template GetterAttr attr(const QString &qualifiedName, const U &u, T (U::*getter)() const, const Parameters ¶meters) { return GetterAttr(qualifiedName, u, getter, parameters); } template class SetterAttr { public: SetterAttr(const QString &qualifiedName, U &u, void (U::*setter)(T)) : m_qualifiedName(qualifiedName), m_u(u), m_setter(setter) { } SetterAttr(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 SetterAttr attr(const QString &qualifiedName, U &u, void (U::*setter)(T)) { return SetterAttr(qualifiedName, u, setter); } template SetterAttr attr(const QString &qualifiedName, U &u, void (U::*setter)(T), const Parameters ¶meters) { return SetterAttr(qualifiedName, u, setter, parameters); } template class GetterSetterAttr { public: GetterSetterAttr(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) { } GetterSetterAttr(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 GetterSetterAttr attr(const QString &qualifiedName, U &u, T (U::*getter)() const, void (U::*setter)(V)) { return GetterSetterAttr(qualifiedName, u, getter, setter); } template GetterSetterAttr attr(const QString &qualifiedName, U &u, T (U::*getter)() const, void (U::*setter)(V), const Parameters ¶meters) { return GetterSetterAttr(qualifiedName, u, getter, setter, parameters); } template class GetFuncAttr { public: GetFuncAttr(const QString &qualifiedName, U &u, T (*func)(const U &)) : m_qualifiedName(qualifiedName), m_u(u), m_getFunc(func) { } GetFuncAttr(const QString &qualifiedName, 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; } U &object() const { return m_u; } T (*getterFunc() const)(const U &) { return m_getFunc; } Parameters parameters() const { return m_parameters; } private: QString m_qualifiedName; U &m_u; T (*m_getFunc)(const U &) = nullptr; Parameters m_parameters; }; template GetFuncAttr attr(const QString &qualifiedName, const U &u, T (*func)(const U &)) { return GetFuncAttr(qualifiedName, u, func); } template GetFuncAttr attr(const QString &qualifiedName, const U &u, T (*func)(const U &), const Parameters ¶meters) { return GetFuncAttr(qualifiedName, u, func, parameters); } template class SetFuncAttr { public: SetFuncAttr(const QString &qualifiedName, U &u, void (*setFunc)(U &, T)) : m_qualifiedName(qualifiedName), m_u(u), m_setFunc(setFunc) { } SetFuncAttr(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 SetFuncAttr attr(const QString &qualifiedName, U &u, void (*setFunc)(U &, T)) { return SetFuncAttr(qualifiedName, u, setFunc); } template SetFuncAttr attr(const QString &qualifiedName, U &u, void (*setFunc)(U &, T), const Parameters ¶meters) { return SetFuncAttr(qualifiedName, u, setFunc, parameters); } template class GetSetFuncAttr { public: GetSetFuncAttr(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) { } GetSetFuncAttr(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 GetSetFuncAttr attr(const QString &qualifiedName, U &u, T (*func)(const U &), void (*setFunc)(U &, V)) { return GetSetFuncAttr(qualifiedName, u, func, setFunc); } template GetSetFuncAttr attr(const QString &qualifiedName, U &u, T (*func)(const U &), void (*setFunc)(U &, V), const Parameters ¶meters) { return GetSetFuncAttr(qualifiedName, u, func, setFunc, parameters); } } // namespace qark