// SPDX-License-Identifier: GPL-2.0 // Collection of objects that will be deleted on application exit. // This feature is needed because many Qt-objects crash if freed // after the application has exited. #ifndef GLOBALS_H #define GLOBALS_H #include <memory> #include <utility> template <typename T, class... Args> T *make_global(Args &&...args); // construct a global object of type T. template <typename T> T *register_global(T *); // register an already constructed object. returns input. void free_globals(); // call on application exit. frees all global objects. // Implementation // A class with a virtual destructor that will be used to destruct the objects. struct GlobalObjectBase { virtual ~GlobalObjectBase() { } }; template <typename T> struct GlobalObject : T, GlobalObjectBase { using T::T; // Inherit constructor from actual object. }; void register_global_internal(GlobalObjectBase *); template <typename T, class... Args> T *make_global(Args &&...args) { GlobalObject<T> *res = new GlobalObject<T>(std::forward<Args>(args)...); register_global_internal(res); return res; } template <typename T> T *register_global(T *o) { make_global<std::unique_ptr<T>>(o); return o; } #endif