subsurface/core/globals.h

51 lines
1.2 KiB
C
Raw Normal View History

// 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