#ifndef SCIQLOP_METATYPES_H #define SCIQLOP_METATYPES_H #include /** * Struct used to create an instance that registers a type in Qt for signals / slots mechanism * @tparam T the type to register */ template struct MetaTypeRegistry { explicit MetaTypeRegistry() { qRegisterMetaType(); } }; /** * This macro can be used to : * - declare a type as a Qt meta type * - and register it (through a static instance) at the launch of SciQlop, so it can be passed in * Qt signals/slots * * It can be used both in .h or in .cpp files * * @param NAME name of the instance under which the type will be registered (in uppercase) * @param TYPE type to register * * Example: * ~~~cpp * // The following macro : * // - declares std::shared_ptr as a Qt meta type * // - registers it through an instance named VAR_SHARED_PTR * SCIQLOP_REGISTER_META_TYPE(VAR_SHARED_PTR, std::shared_ptr) * * // The following macro : * // - declares a raw pointer of Variable as a Qt meta type * // - registers it through an instance named VAR_RAW_PTR * SCIQLOP_REGISTER_META_TYPE(VAR_RAW_PTR, Variable*) * ~~~ * */ // clang-format off #define SCIQLOP_REGISTER_META_TYPE(NAME, TYPE) \ Q_DECLARE_METATYPE(TYPE) \ const auto NAME = MetaTypeRegistry{}; \ // clang-format on #endif // SCIQLOP_METATYPES_H