caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Mauricio Fernandez <mfp@acm.org>
To: caml-list@inria.fr
Subject: Re: [Caml-list] wrapping external classes
Date: Thu, 11 Dec 2008 11:37:23 +0100	[thread overview]
Message-ID: <20081211103723.GE18977@NANA.localdomain> (raw)
In-Reply-To: <8119C403-2D50-4DFA-901C-FC3F8409843E@gmail.com>

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


  reply	other threads:[~2008-12-11 10:37 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-11  2:20 Alexy Khrabrov
2008-12-11 10:37 ` Mauricio Fernandez [this message]
2008-12-11 15:07   ` [Caml-list] " Alain Frisch
2008-12-11 16:21     ` Florent Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20081211103723.GE18977@NANA.localdomain \
    --to=mfp@acm.org \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).