2 ** @file mruby/data.h - Data class
4 ** See Copyright Notice in mruby.h
13 * Custom C wrapped data.
15 * Defining Ruby wrappers around native objects.
20 * Custom data type description.
22 typedef struct mrb_data_type
{
24 const char *struct_name
;
26 /** data type release function pointer */
27 void (*dfree
)(mrb_state
*mrb
, void*);
33 const mrb_data_type
*type
;
37 MRB_API
struct RData
*mrb_data_object_alloc(mrb_state
*mrb
, struct RClass
* klass
, void *datap
, const mrb_data_type
*type
);
39 #define Data_Wrap_Struct(mrb,klass,type,ptr)\
40 mrb_data_object_alloc(mrb,klass,ptr,type)
42 #define Data_Make_Struct(mrb,klass,strct,type,sval,data_obj) do { \
43 (data_obj) = Data_Wrap_Struct(mrb,klass,type,NULL);\
44 (sval) = (strct *)mrb_malloc(mrb, sizeof(strct)); \
45 { static const strct zero = { 0 }; *(sval) = zero; };\
46 (data_obj)->data = (sval);\
49 #define RDATA(obj) ((struct RData *)(mrb_ptr(obj)))
50 #define DATA_PTR(d) (RDATA(d)->data)
51 #define DATA_TYPE(d) (RDATA(d)->type)
52 MRB_API
void mrb_data_check_type(mrb_state
*mrb
, mrb_value
, const mrb_data_type
*);
53 MRB_API
void *mrb_data_get_ptr(mrb_state
*mrb
, mrb_value
, const mrb_data_type
*);
54 #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
55 MRB_API
void *mrb_data_check_get_ptr(mrb_state
*mrb
, mrb_value
, const mrb_data_type
*);
56 #define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
58 /* obsolete functions and macros */
59 #define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
60 #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
61 #define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
62 #define Data_Get_Struct(mrb,obj,type,sval) do {\
63 *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
67 mrb_data_init(mrb_value v
, void *ptr
, const mrb_data_type
*type
)
69 mrb_assert(mrb_data_p(v
));
76 #endif /* MRUBY_DATA_H */