Add runtime assertion to check that values passed to Obj_val()
[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
22 void register_custom_(char* name,
23                       size_t size,
24                       void (*finalize)(value v));
25
26 value alloc_custom_(char* name);
27
28 template <class X> X& Obj_val(value v)
29 {
30   assert(Tag_val(v) == Custom_tag);
31   return * (X*) Data_custom_val(v);
32 }
33
34 template <class X> void sxsi_finalize_obj(X) {
35 }
36
37 template <class X> void sxsi_finalize_obj(X* x){
38   delete x;
39 }
40
41 template <class X> void sxsi_finalize_custom(value v)
42 {
43   sxsi_finalize_obj(Obj_val<X>(v));
44 }
45
46 template <class X> value
47 sxsi_alloc_custom(void (*finalize)(value) = sxsi_finalize_custom<X>)
48 {
49   char * name = const_cast<char*>(typeid(X).name());
50
51   value v = alloc_custom_(name);
52   if (v == Val_unit) {
53     register_custom_(name, sizeof(X), finalize);
54     v = alloc_custom_(name);
55   };
56   return v;
57 }
58
59 void sxsi_raise_msg(const char * msg);
60
61 extern "C" value sxsi_cpp_init(value unit);
62
63
64
65 #endif