X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcommon_stub.hpp;fp=src%2Fcommon_stub.hpp;h=bfacdace195ea46944cf6b9cbf884b5db95743af;hb=ff13d22656fdbdffb2d909192bd17ba135606224;hp=0000000000000000000000000000000000000000;hpb=d7e793e387b3a59877765e15c54649a9d74d137e;p=SXSI%2Fxpathcomp.git diff --git a/src/common_stub.hpp b/src/common_stub.hpp new file mode 100644 index 0000000..bfacdac --- /dev/null +++ b/src/common_stub.hpp @@ -0,0 +1,58 @@ +#ifndef COMMON_STUB_H_ +#define COMMON_STUB_H_ + +extern "C" { +#define CAML_NAME_SPACE +#include +#include +#include +#include +#include +#include +#include +#include +#include +} +#include +#include + +void register_custom_(char* name, + size_t size, + void (*finalize)(value v)); + +value alloc_custom_(char* name); + + +template void sxsi_finalize_custom(value v) +{ + X * obj = * ((X **) Data_custom_val(v)); + std::cerr << "Finalizing object: " << typeid(X).name() << std::endl; + std::cerr.flush(); + delete obj; +} + +template value sxsi_alloc_custom() +{ + char * name = const_cast(typeid(X).name()); + value v = alloc_custom_(name); + if (v == Val_unit) { + register_custom_(name, sizeof(X*), sxsi_finalize_custom); + v = alloc_custom_(name); + }; + return v; +} + +template X*& Obj_val(value v) +{ + //Cannot use Data_custom_val here, it is not a correct lvalue. :-( + return (X*&) Field(v,1); +} + +void sxsi_raise_msg(char * msg); + +extern "C" { +value sxsi_cpp_init(value unit); +} + + +#endif