12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "ruby.h"
- #include "caml/callback.h"
-
- void initcaml(void) {
- char *dummy_argv[] = {0};
- caml_startup(dummy_argv);
- }
- VALUE OcamlMatrix = Qnil; // set up the Ruby namespace
-
- void Init_ocamlmatrix();
- VALUE singleton_matrix_new(VALUE class, VALUE width, VALUE height);
- void method_assign(VALUE self, VALUE x, VALUE y, VALUE item);
- VALUE method_retrieve(VALUE self, VALUE x, VALUE y);
- VALUE method_matrix_mul(VALUE self, VALUE b);
- void Init_ocamlmatrix() {
- OcamlMatrix = rb_define_module("OcamlMatrix");
- rb_define_singleton_method(OcamlMatrix, "w_new_matrix", singleton_matrix_new, 2);
- rb_define_method(OcamlMatrix, "w_matrix_assign", method_assign, 3);
- rb_define_method(OcamlMatrix, "w_matrix_retrieve", method_retrieve, 2);
- rb_define_method(OcamlMatrix, "w_matrix_mul", method_matrix_mul, 1);
- initcaml();
- }
- VALUE singleton_matrix_new(VALUE class, VALUE width, VALUE height) {
- CAMLparam0 ();
- CAMLlocal1 (ocaml_m);
- ocaml_m = ocaml_new_matrix(Val_long(NUM2LONG(width)), Val_long(NUM2LONG(height)));
- VALUE my_m = Data_Wrap_Struct(class, 0, 0, ocaml_m);
- rb_obj_call_init(my_m, 0, NULL);
- CAMLreturnT (VALUE, my_m);
- }
- void method_assign(VALUE self, VALUE x, VALUE y, VALUE item) {
- CAMLparam0 ();
- CAMLlocal1 (ocaml_m);
- Data_Get_Struct(self, value, ocaml_m);
- ocaml_matrix_assign(ocaml_m, Val_long(NUM2LONG(x)), Val_long(NUM2LONG(y)), Val_long(NUM2LONG(item)));
- CAMLreturn0;
- }
- VALUE method_retrieve(VALUE self, VALUE x, VALUE y) {
- CAMLparam0 ();
- CAMLlocal1 (ocaml_m);
- Data_Get_Struct(self, value, ocaml_m);
- VALUE retval = LONG2NUM(Long_val(ocaml_matrix_retrieve(ocaml_m,
- Val_long(NUM2LONG(x)),
- Val_long(NUM2LONG(y)))
- ));
- CAMLreturnT (VALUE, retval);
- }
- VALUE method_matrix_mul(VALUE self, VALUE b) {
- CAMLparam0 ();
- CAMLlocal3 (ocaml_m1, ocaml_m2, ocaml_m3);
- Data_Get_Struct(self, value, ocaml_m1);
- Data_Get_Struct(b, value, ocaml_m2);
- ocaml_m3 = ocaml_matrix_mul(ocaml_m1, ocaml_m2);
- VALUE my_m = Data_Wrap_Struct(class, 0, 0, ocaml_m);
- rb_obj_call_init(my_m, 0, NULL);
- CAMLreturnT (VALUE, my_m);
- }
|