[270] | 1 | /*
|
---|
| 2 | ** mruby/data.h - Data class
|
---|
| 3 | **
|
---|
| 4 | ** See Copyright Notice in mruby.h
|
---|
| 5 | */
|
---|
| 6 |
|
---|
| 7 | #ifndef MRUBY_DATA_H
|
---|
| 8 | #define MRUBY_DATA_H
|
---|
| 9 |
|
---|
| 10 | #include "mruby/common.h"
|
---|
| 11 |
|
---|
| 12 | /**
|
---|
| 13 | * Custom C wrapped data.
|
---|
| 14 | *
|
---|
| 15 | * Defining Ruby wrappers around native objects.
|
---|
| 16 | */
|
---|
| 17 | MRB_BEGIN_DECL
|
---|
| 18 |
|
---|
| 19 | /**
|
---|
| 20 | * Custom data type description.
|
---|
| 21 | */
|
---|
| 22 | typedef struct mrb_data_type {
|
---|
| 23 | /** data type name */
|
---|
| 24 | const char *struct_name;
|
---|
| 25 |
|
---|
| 26 | /** data type release function pointer */
|
---|
| 27 | void (*dfree)(mrb_state *mrb, void*);
|
---|
| 28 | } mrb_data_type;
|
---|
| 29 |
|
---|
| 30 | struct RData {
|
---|
| 31 | MRB_OBJECT_HEADER;
|
---|
| 32 | struct iv_tbl *iv;
|
---|
| 33 | const mrb_data_type *type;
|
---|
| 34 | void *data;
|
---|
| 35 | };
|
---|
| 36 |
|
---|
| 37 | MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
|
---|
| 38 |
|
---|
| 39 | #define Data_Wrap_Struct(mrb,klass,type,ptr)\
|
---|
| 40 | mrb_data_object_alloc(mrb,klass,ptr,type)
|
---|
| 41 |
|
---|
| 42 | #define Data_Make_Struct(mrb,klass,strct,type,sval,data) do { \
|
---|
| 43 | sval = mrb_malloc(mrb, sizeof(strct)); \
|
---|
| 44 | { static const strct zero = { 0 }; *sval = zero; };\
|
---|
| 45 | data = Data_Wrap_Struct(mrb,klass,type,sval);\
|
---|
| 46 | } while (0)
|
---|
| 47 |
|
---|
| 48 | #define RDATA(obj) ((struct RData *)(mrb_ptr(obj)))
|
---|
| 49 | #define DATA_PTR(d) (RDATA(d)->data)
|
---|
| 50 | #define DATA_TYPE(d) (RDATA(d)->type)
|
---|
| 51 | MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
---|
| 52 | MRB_API void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
---|
| 53 | #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
|
---|
| 54 | MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
---|
| 55 | #define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
|
---|
| 56 |
|
---|
| 57 | /* obsolete functions and macros */
|
---|
| 58 | #define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
|
---|
| 59 | #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
|
---|
| 60 | #define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
|
---|
| 61 | #define Data_Get_Struct(mrb,obj,type,sval) do {\
|
---|
| 62 | *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
|
---|
| 63 | } while (0)
|
---|
| 64 |
|
---|
| 65 | static inline void
|
---|
| 66 | mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
|
---|
| 67 | {
|
---|
| 68 | mrb_assert(mrb_type(v) == MRB_TT_DATA);
|
---|
| 69 | DATA_PTR(v) = ptr;
|
---|
| 70 | DATA_TYPE(v) = type;
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | MRB_END_DECL
|
---|
| 74 |
|
---|
| 75 | #endif /* MRUBY_DATA_H */
|
---|