From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B96067EE51 for ; Thu, 9 May 2013 16:14:30 +0200 (CEST) Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of tom.j.ridge@googlemail.com) identity=pra; client-ip=209.85.210.48; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="tom.j.ridge@googlemail.com"; x-sender="tom.j.ridge@googlemail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of tom.j.ridge@googlemail.com designates 209.85.210.48 as permitted sender) identity=mailfrom; client-ip=209.85.210.48; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="tom.j.ridge@googlemail.com"; x-sender="tom.j.ridge@googlemail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-da0-f48.google.com) identity=helo; client-ip=209.85.210.48; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="tom.j.ridge@googlemail.com"; x-sender="postmaster@mail-da0-f48.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8BANWti1HRVdIwjmdsb2JhbABSgz7AeQgWDgEBAQEHDQkJEgYkgh8BAQUnGQEBNwEPAQoLDS4iEgEFARwGExuHXgEDDwygQ4p8hD8BBYRRChknDYgKAgSMUoYyly+PUBYpgV2CWTs X-IPAS-Result: At8BANWti1HRVdIwjmdsb2JhbABSgz7AeQgWDgEBAQEHDQkJEgYkgh8BAQUnGQEBNwEPAQoLDS4iEgEFARwGExuHXgEDDwygQ4p8hD8BBYRRChknDYgKAgSMUoYyly+PUBYpgV2CWTs X-IronPort-AV: E=Sophos;i="4.87,641,1363129200"; d="scan'208";a="13714355" Received: from mail-da0-f48.google.com ([209.85.210.48]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/RC4-SHA; 09 May 2013 16:14:29 +0200 Received: by mail-da0-f48.google.com with SMTP id h32so345175dak.21 for ; Thu, 09 May 2013 07:14:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=x-received:mime-version:sender:in-reply-to:references:from:date :x-google-sender-auth:message-id:subject:to:cc:content-type; bh=MN+80bNRWOJH63rAZZ397vMi4a1ov4KUC5708R1HnwE=; b=Z1xqT9v+nWEbNw6teYx13MUNf0A9LgJQy4dWF+DFpCBONSz4p75IdGX8J2BXF44e2F D0aV16hNwVUSAk6tWLp+N0Xfaf3KNXiNI2InteKu+CxNJ3hJV0vrZvSMJTwwiPa+w82F +Qn+SpLfUOD/NBYM9Bprs4/E98jLobUW7vySO4GbkjvAAYlg4urgryE4qSUtnyXIA+Ys ILrWvB82CVqSE046WwzhrSyf+SsTPXH3+fsd8eeuWHvCoUXnAZi8I249+/nKzjt/h7w9 +c2l+B3Y2HhwFeBLExs3D+ARiGbF00RxjyAUsJOQ9lge7yMQnh791uLBNc0wOLPrxaRI rUpA== X-Received: by 10.68.232.2 with SMTP id tk2mr12577033pbc.99.1368108867910; Thu, 09 May 2013 07:14:27 -0700 (PDT) MIME-Version: 1.0 Sender: tom.j.ridge@googlemail.com Received: by 10.70.52.66 with HTTP; Thu, 9 May 2013 07:14:07 -0700 (PDT) In-Reply-To: References: From: Tom Ridge Date: Thu, 9 May 2013 15:14:07 +0100 X-Google-Sender-Auth: wtTI4blAJYoxw987u3268_gyUF0 Message-ID: To: Anil Madhavapeddy Cc: caml-list Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Caml-list] String, Array, Bigarray.char Although I see that this won't be so easy because various functions such as Unix.write have the buffer argument being of type string :( So at various points I seem to be forced to use strings. I suppose one alternative is to reimplement the functions I use (such as Unix.write) to work with arrays. Does anyone know if this has been done elsewhere? On 9 May 2013 15:07, Tom Ridge wrote: > Thanks for this information. > > I guess I will probably end up using arrays as much as possible. In > various places I have used strings as though they were immutable > arrays of byte. I guess the advantage of this approach is that strings > seem more familiar than arrays (especially Bigarrays). But it is > probably not much of a big deal to move to using arrays everywhere. > > Thanks once again > > Tom > > > On 9 May 2013 14:44, Anil Madhavapeddy wrote: >> On 9 May 2013, at 09:32, Tom Ridge wrote: >>> >>> Quick question: I am working a lot with arrays of byte, which at >>> various points I want to view as strings, and at various points I want >>> to view as arrays. The exact types involved should be discernible from >>> the code below. >>> >>> I have some conversion functions e.g.: >>> >>> type myfusebuffer = (char, Bigarray.int8_unsigned_elt, >>> Bigarray.c_layout) Bigarray.Array1.t >>> >>> module A = Bigarray.Array1 >>> >>> (* convenience only; don't use in production code *) >>> let array_of_string bs = ( >>> let arr = (Array.init (String.length bs) (String.get bs)) in >>> let contents = A.of_array Bigarray.char Bigarray.c_layout arr in >>> contents) >>> let (_:string -> myfusebuffer) = array_of_string >>> >>> This presumably takes O(n) time (where n is the length of the string >>> bs). My question is: is there functionality to move values between >>> these types at cost O(1)? Basically, I'm hoping that String is >>> implemented as A.of_array Bigarray.char Bigarray.c_layout or >>> similar... >> >> Strings are represented as normal OCaml values within the OCaml heap, >> whereas Bigarrays are simply pointers to externally allocated memory >> (via malloc). You do therefore need to copy across them in most cases. >> One quick solution is to define a subset of the String module that uses >> the Bigarray accessor functions, but this isn't ideal (especially when >> external libraries that use strings are involved). >> >> Your fusebuffer type probably means that you're working with filesystem >> data. Can you just use Bigarrays for everything, with copies to strings >> only when you absolutely need to? We haven't released this out of beta >> yet, but the cstruct camlp4 extension helps map C structures to OCaml: >> https://github.com/mirage/ocaml-cstruct >> >> -anil >> >> >>