USER_OBJECT_ toRPointer(void *val, const char *typeName) { USER_OBJECT_ ans, klass = NULL; GType type = 0; if(val == NULL) return(NULL_USER_OBJECT); PROTECT(ans = R_MakeExternalPtr(val, Rf_install(typeName), NULL_USER_OBJECT)); if (typeName) type = g_type_from_name(typeName); if(type) { if (G_TYPE_IS_INSTANTIATABLE(type) || G_TYPE_IS_INTERFACE(type)) type = G_TYPE_FROM_INSTANCE(val); if (G_TYPE_IS_DERIVED(type)) { setAttrib(ans, install("interfaces"), R_internal_getInterfaces(type)); PROTECT(klass = R_internal_getGTypeHierarchy(type)); } } if (!klass && typeName) { PROTECT(klass = asRString(typeName)); } if(klass) { SET_CLASS(ans, klass); UNPROTECT(1); } UNPROTECT(1); return(ans); }
USER_OBJECT_ toRPointerWithFinalizer(gconstpointer val, const gchar *typeName, RPointerFinalizer finalizer) { USER_OBJECT_ ans; USER_OBJECT_ r_finalizer = NULL_USER_OBJECT; USER_OBJECT_ klass = NULL, rgtk_class; int i = 0; GType type = 0; if(!val) return(NULL_USER_OBJECT); if (finalizer) { PROTECT(r_finalizer = R_MakeExternalPtr(finalizer, NULL_USER_OBJECT, NULL_USER_OBJECT)); } PROTECT(ans = R_MakeExternalPtr((gpointer)val, r_finalizer, NULL_USER_OBJECT)); if (finalizer) { R_RegisterCFinalizer(ans, RGtk_finalizer); } if (typeName) type = g_type_from_name(typeName); if(type) { if (G_TYPE_IS_INSTANTIATABLE(type) || G_TYPE_IS_INTERFACE(type)) type = G_TYPE_FROM_INSTANCE(val); if (G_TYPE_IS_DERIVED(type)) { setAttrib(ans, install("interfaces"), R_internal_getInterfaces(type)); PROTECT(klass = R_internal_getGTypeAncestors(type)); } } if (!klass && typeName) { PROTECT(klass = asRString(typeName)); } if (klass) { /* so much trouble just to add "RGtkObject" onto the end */ PROTECT(rgtk_class = NEW_CHARACTER(GET_LENGTH(klass)+1)); for (i = 0; i < GET_LENGTH(klass); i++) SET_STRING_ELT(rgtk_class, i, STRING_ELT(klass, i)); } else { PROTECT(rgtk_class = NEW_CHARACTER(1)); } SET_STRING_ELT(rgtk_class, i, COPY_TO_USER_STRING("RGtkObject")); SET_CLASS(ans, rgtk_class); if (g_type_is_a(type, S_TYPE_G_OBJECT)) { USER_OBJECT_ public_sym = install(".public"); setAttrib(ans, public_sym, findVar(public_sym, S_GOBJECT_GET_ENV(val))); } if (klass) UNPROTECT(1); if (finalizer) UNPROTECT(1); UNPROTECT(2); return(ans); }
/* Help function to dump a GType */ void my_dump_type(GType type_id) { printf("Type id: %d\n", type_id); printf("Type name: %s\n", g_type_name(type_id)); printf("Is fundamental? %s\n", G_TYPE_IS_FUNDAMENTAL(type_id) ? "yes" : "no"); printf("Is derived? %s\n", G_TYPE_IS_DERIVED(type_id) ? "yes" : "no"); printf("Is interface? %s\n", G_TYPE_IS_INTERFACE(type_id) ? "yes" : "no"); printf("Is classed? %s\n", G_TYPE_IS_CLASSED(type_id) ? "yes" : "no"); printf("Is instantiatable? %s\n", G_TYPE_IS_INSTANTIATABLE(type_id) ? "yes" : "no"); printf("Is derivable? %s\n", G_TYPE_IS_DERIVABLE(type_id) ? "yes" : "no"); printf("Is deep derivable? %s\n", G_TYPE_IS_DEEP_DERIVABLE(type_id) ? "yes" : "no"); printf("Is abstract? %s\n", G_TYPE_IS_ABSTRACT(type_id) ? "yes" : "no"); printf("Is value abstract? %s\n", G_TYPE_IS_VALUE_ABSTRACT(type_id) ? "yes" : "no"); printf("Is value type: %s\n", G_TYPE_IS_VALUE_TYPE(type_id) ? "yes" : "no"); printf("Has value table: %s\n", G_TYPE_HAS_VALUE_TABLE(type_id) ? "yes" : "no"); }
static VALUE rg_derived_p(VALUE self) { return CBOOL2RVAL(G_TYPE_IS_DERIVED(rbgobj_gtype_get(self))); }