b771f338f16c684c33d705afaa23e6e8cedde7da
[SXSI/xpathcomp.git] / src / common_stub.hpp
1 #ifndef COMMON_STUB_HPP_
2 #define COMMON_STUB_HPP_
3
4 extern "C" {
5 #define CAML_NAME_SPACE
6
7 #include <caml/mlvalues.h>
8 #include <caml/alloc.h>
9 #include <caml/memory.h>
10 #include <caml/callback.h>
11 #include <caml/fail.h>
12 #include <caml/custom.h>
13 #include <caml/bigarray.h>
14 }
15 #include <typeinfo>
16 #include <cstdio>
17 #include <cassert>
18
19 #define NoAlloc
20
21 //Must be used in front of every function that is called from OCaml.
22
23 #define ML_BINDING extern "C" __attribute__ ((force_align_arg_pointer)) 
24
25
26 void register_custom_(char* name,
27                       size_t size,
28                       void (*finalize)(value v));
29
30 value alloc_custom_(char* name);
31
32 template <class X> X& Obj_val(value v)
33 {
34   assert(Tag_val(v) == Custom_tag);
35   return * (X*) Data_custom_val(v);
36 }
37
38 template <class X> void sxsi_finalize_obj(X) {
39 }
40
41 template <class X> void sxsi_finalize_obj(X* x){
42   delete x;
43 }
44
45 template <class X> void sxsi_finalize_custom(value v)
46 {
47   sxsi_finalize_obj(Obj_val<X>(v));
48 }
49
50 template <class X> value
51 sxsi_alloc_custom(void (*finalize)(value) = sxsi_finalize_custom<X>)
52 {
53   char * name = const_cast<char*>(typeid(X).name());
54
55   value v = alloc_custom_(name);
56   if (v == Val_unit) {
57     register_custom_(name, sizeof(X), finalize);
58     v = alloc_custom_(name);
59   };
60   return v;
61 }
62
63 void sxsi_raise_msg(const char * msg);
64
65 ML_BINDING value sxsi_cpp_init(value unit);
66
67
68 #endif