Use functions instead of macros for MOO_INITIALIZE/FINALIZE_PRIVATE
parent
7d4b3c1230
commit
095455caff
|
@ -16,14 +16,25 @@
|
|||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
namespace moo {
|
||||
|
||||
#define MOO_INITIALIZE_PRIVATE(_priv_, _owner_, _owner_g_type_, _priv_type_) \
|
||||
(_priv_) = G_TYPE_INSTANCE_GET_PRIVATE ((_owner_), (_owner_g_type_), _priv_type_); \
|
||||
new(_priv_) (_priv_type_)
|
||||
template<typename T, typename TPriv, typename ...Args>
|
||||
inline void init_private(TPriv*& p, T* owner, GType owner_type, Args&& ...args)
|
||||
{
|
||||
p = G_TYPE_INSTANCE_GET_PRIVATE(owner, owner_type, TPriv);
|
||||
new(p) TPriv(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
#define MOO_FINALIZE_PRIVATE(_priv_, _priv_type_) \
|
||||
_priv_->~_priv_type_()
|
||||
template<typename TPriv>
|
||||
inline void finalize_private(TPriv*& p)
|
||||
{
|
||||
if (p != nullptr)
|
||||
{
|
||||
p->~TPriv();
|
||||
p = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace moo
|
||||
|
|
|
@ -28,38 +28,24 @@ namespace moo {
|
|||
inline Flags& operator &= (Flags& f1, Flags f2) { f1 = f1 & f2; return f1; } \
|
||||
inline Flags operator ~ (Flags f) { return static_cast<Flags>(~static_cast<int>(f)); } \
|
||||
|
||||
class GMemDeleter
|
||||
struct mg_mem_deleter
|
||||
{
|
||||
public:
|
||||
void operator()(void* mem) { g_free(mem); }
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class GSliceDeleter
|
||||
struct mg_slice_deleter
|
||||
{
|
||||
public:
|
||||
void operator()(T* mem) { g_slice_free (T, mem); }
|
||||
};
|
||||
|
||||
template<typename T, typename Deleter>
|
||||
class GMemHolderBase : public std::unique_ptr<T, Deleter>
|
||||
{
|
||||
typedef std::unique_ptr<T, Deleter> unique_ptr;
|
||||
|
||||
public:
|
||||
GMemHolderBase(T *mem)
|
||||
: unique_ptr(mem)
|
||||
{
|
||||
}
|
||||
|
||||
GMemHolderBase& operator=(T* mem) { if (mem != this->get()) *this = unique_ptr(mem); return *this; }
|
||||
};
|
||||
template<typename T>
|
||||
using mg_mem_ptr = std::unique_ptr<T, mg_mem_deleter>;
|
||||
|
||||
template<typename T>
|
||||
using GMemHolder = GMemHolderBase<T, GMemDeleter>;
|
||||
using mg_slice_ptr = std::unique_ptr<T, mg_slice_deleter<T>>;
|
||||
|
||||
template<typename T>
|
||||
using GSliceHolder = GMemHolderBase<T, GSliceDeleter<T>>;
|
||||
using mg_str_holder = mg_mem_ptr<char>;
|
||||
|
||||
template<typename T, typename U>
|
||||
auto find(const std::vector<T>& vec, const U& elm) -> decltype(vec.begin())
|
||||
|
|
|
@ -153,7 +153,7 @@ static void
|
|||
moo_editor_class_init (MooEditorClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
G_GNUC_UNUSED MooWindowClass *edit_window_class;
|
||||
MooWindowClass *edit_window_class;
|
||||
|
||||
gobject_class->constructor = moo_editor_constructor;
|
||||
gobject_class->finalize = moo_editor_finalize;
|
||||
|
@ -374,7 +374,7 @@ MooEditorPrivate::~MooEditorPrivate()
|
|||
static void
|
||||
moo_editor_init (MooEditor *editor)
|
||||
{
|
||||
MOO_INITIALIZE_PRIVATE (editor->priv, editor, MOO_TYPE_EDITOR, MooEditorPrivate);
|
||||
init_private(editor->priv, editor, MOO_TYPE_EDITOR);
|
||||
}
|
||||
|
||||
static GObject *
|
||||
|
@ -500,7 +500,7 @@ moo_editor_finalize (GObject *object)
|
|||
if (editor_instance == editor)
|
||||
editor_instance = NULL;
|
||||
|
||||
MOO_FINALIZE_PRIVATE (editor->priv, MooEditorPrivate);
|
||||
finalize_private(editor->priv);
|
||||
|
||||
G_OBJECT_CLASS (moo_editor_parent_class)->finalize (object);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue