[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Mauricio Fernandez <mfp@a...> |
| Subject: | Re: [Caml-list] wrapping external classes |
On Wed, Dec 10, 2008 at 09:20:41PM -0500, Alexy Khrabrov wrote:
> I'm wrapping a C++ library in ocaml bindings. Originally I wrote an
> in-C++ object pool handler returning integer handles, and wrapped the
> constructor, destructor, and the main compute function in my
> lmclient.ml file as create, destroy, and compute functions, then
> declared in OCaml as
>
> external create : string -> int -> int = "lmclient_create"
> external destroy : int -> int = "lmclient_destroy"
> external compute : int -> string -> string = "lmclient_compute"
>
> I can call them as Lmclient.create, etc. The create returns an integer
> handle which is then used by others to compute and destroy the
> corresponding C++ object inside my pool manager.
>
> Now I want to avoid the explicit destroy, and want to add more methods,
> so I'd like to wrap these three and more into an OCaml object. How do I
> glue the external definitions to object methods? Apparently method
> external or external method doesn't parse...
(* an abstract type is better than int --- no change needed in the
* C/C++ bindings *)
type handle
external create : string -> int -> handle = "lmclient_create"
external destroy : handle -> unit = "lmclient_destroy"
external compute : handle -> string -> string = "lmclient_compute"
class foo s n =
object(self)
val handle = create s n
method compute = compute handle
initializer
(* use a destroy method explicitly if you need to make sure the destructor
* is called --- Gc.finalise doesn't guarantee this (e.g. the program might
* terminate before the finalisation function is executed) *)
Gc.finalise destroy handle
end
--
Mauricio Fernandez - http://eigenclass.org