11 template<typename T> struct traits;
14 struct traits<GVariant> {
15 struct delete_functor {
16 void operator()(GVariant * p) const {
24 struct traits<GError> {
25 struct delete_functor {
26 void operator()(GError * p) const {
34 struct traits<GDBusProxy> {
35 struct delete_functor {
36 void operator()(GDBusProxy * p) const {
44 struct traits<GVariantIter> {
45 struct delete_functor {
46 void operator()(GVariantIter * p) const {
48 g_variant_iter_free(p);
54 struct traits<gchar> {
55 struct delete_functor {
56 void operator()(gchar * p) const {
64 struct traits<GDBusConnection> {
65 struct delete_functor {
66 void operator()(GDBusConnection* p) const {
68 g_dbus_connection_close_sync(p, nullptr, nullptr);
73 template<typename T> using super_ptr =
74 ::std::unique_ptr<T, typename traits<T>::delete_functor>;
76 template<typename T> using gobject_ptr =
77 ::std::unique_ptr<T , std::function<void(T*)> >;
79 template<typename T> super_ptr<T> make_super(T* t)
81 return super_ptr<T>(t);
84 template<typename T> ::std::unique_ptr<T> make_unique(T* t)
86 return ::std::unique_ptr<T>(t);
89 template<typename T> ::std::shared_ptr<T> make_shared(T* t)
91 return ::std::shared_ptr<T>(t);
94 template<typename T> gobject_ptr<T> make_gobject(T* t)
96 return gobject_ptr<T>(t, [](T *ptr) { if(ptr) g_object_unref(ptr);});