Use functions instead of macros for MOO_INITIALIZE/FINALIZE_PRIVATE

master
Yevgen Muntyan 2015-12-30 22:41:16 -08:00
parent 7d4b3c1230
commit 095455caff
3 changed files with 25 additions and 28 deletions

View File

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

View File

@ -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())

View File

@ -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);
}