summaryrefslogtreecommitdiffhomepage
path: root/src/mdata.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mdata.h')
-rw-r--r--src/mdata.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/mdata.h b/src/mdata.h
new file mode 100644
index 000000000..827f7c114
--- /dev/null
+++ b/src/mdata.h
@@ -0,0 +1,53 @@
+/**********************************************************************
+
+ mdata.h -
+
+
+ Copyright (C) 2007 Yukihiro Matsumoto
+
+**********************************************************************/
+
+#ifndef RUBY_DATA_H
+#define RUBY_DATA_H 1
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+struct mrb_data_type {
+ const char *struct_name;
+ void (*dfree)(mrb_state *mrb, void*);
+};
+
+struct RData {
+ MRUBY_OBJECT_HEADER;
+ struct kh_iv *iv;
+ struct mrb_data_type *type;
+ void *data;
+};
+
+struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const struct mrb_data_type *type);
+
+#define Data_Wrap_Struct(mrb,klass,type,ptr)\
+ mrb_data_object_alloc(mrb,klass,ptr,type)
+
+#define Data_Make_Struct(mrb,klass,strct,type,sval) (\
+ sval = mrb_malloc(mrb, sizeof(strct)),\
+ memset(sval, 0, sizeof(strct)),\
+ Data_Wrap_Struct(mrb,klass,type,sval)\
+)
+
+#define RDATA(obj) ((struct RData *)((obj).value.p))
+#define DATA_PTR(d) (RDATA(d)->data)
+#define DATA_TYPE(d) (RDATA(d)->type)
+void *mrb_check_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*);
+#define Data_Get_Struct(mrb,obj,type,sval) do {\
+ sval = mrb_check_datatype(mrb, obj, type); \
+} while (0)
+
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
+#endif /* RUBY_DATA_H */