Refactoring, 1st tier:
[SXSI/xpathcomp.git] / src / common_stub.hpp
1 #ifndef COMMON_STUB_H_
2 #define COMMON_STUB_H_
3
4 extern "C" {
5 #define CAML_NAME_SPACE
6 #include <stdlib.h>
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 #include <stdio.h>
15 }
16 #include <iostream>
17 #include <typeinfo>
18
19 void register_custom_(char* name,
20                       size_t size,
21                       void (*finalize)(value v));
22
23 value alloc_custom_(char* name);
24
25
26 template <class X> void sxsi_finalize_custom(value v)
27 {
28   X * obj = * ((X **) Data_custom_val(v));
29   std::cerr << "Finalizing object: " << typeid(X).name() << std::endl;
30   std::cerr.flush();
31   delete obj;
32 }
33
34 template <class X> value sxsi_alloc_custom()
35 {
36   char * name = const_cast<char*>(typeid(X).name());
37   value v = alloc_custom_(name);
38   if (v == Val_unit) {
39     register_custom_(name, sizeof(X*), sxsi_finalize_custom<X>);
40     v = alloc_custom_(name);
41   };
42   return v;
43 }
44
45 template <class X> X*& Obj_val(value v)
46 {
47   //Cannot use Data_custom_val here, it is not a correct lvalue. :-(
48   return (X*&) Field(v,1);
49 }
50
51 void sxsi_raise_msg(char * msg);
52
53 extern "C" {
54 value sxsi_cpp_init(value unit);
55 }
56
57
58 #endif