mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers data.h Source File

data.h

00001 /*
00002 ** mruby/data.h - Data class
00003 **
00004 ** See Copyright Notice in mruby.h
00005 */
00006 
00007 #ifndef MRUBY_DATA_H
00008 #define MRUBY_DATA_H
00009 
00010 #if defined(__cplusplus)
00011 extern "C" {
00012 #endif
00013 
00014 typedef struct mrb_data_type {
00015   const char *struct_name;
00016   void (*dfree)(mrb_state *mrb, void*);
00017 } mrb_data_type;
00018 
00019 struct RData {
00020   MRB_OBJECT_HEADER;
00021   struct iv_tbl *iv;
00022   const mrb_data_type *type;
00023   void *data;
00024 };
00025 
00026 MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
00027 
00028 #define Data_Wrap_Struct(mrb,klass,type,ptr)\
00029   mrb_data_object_alloc(mrb,klass,ptr,type)
00030 
00031 #define Data_Make_Struct(mrb,klass,strct,type,sval,data) do { \
00032   sval = mrb_malloc(mrb, sizeof(strct));                     \
00033   { static const strct zero = { 0 }; *sval = zero; };\
00034   data = Data_Wrap_Struct(mrb,klass,type,sval);\
00035 } while (0)
00036 
00037 #define RDATA(obj)         ((struct RData *)(mrb_ptr(obj)))
00038 #define DATA_PTR(d)        (RDATA(d)->data)
00039 #define DATA_TYPE(d)       (RDATA(d)->type)
00040 MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
00041 MRB_API void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
00042 #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
00043 MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
00044 #define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
00045 
00046 /* obsolete functions and macros */
00047 #define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
00048 #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
00049 #define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
00050 #define Data_Get_Struct(mrb,obj,type,sval) do {\
00051   *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
00052 } while (0)
00053 
00054 static inline void
00055 mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
00056 {
00057   mrb_assert(mrb_type(v) == MRB_TT_DATA);
00058   DATA_PTR(v) = ptr;
00059   DATA_TYPE(v) = type;
00060 }
00061 
00062 #if defined(__cplusplus)
00063 }  /* extern "C" { */
00064 #endif
00065 
00066 #endif /* MRUBY_DATA_H */
00067