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 mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 09A4B7EE51 for ; Thu, 9 May 2013 15:44:56 +0200 (CEST) Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of anil@recoil.org) identity=pra; client-ip=89.16.177.154; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="anil@recoil.org"; x-sender="anil@recoil.org"; x-conformance=sidf_compatible Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of anil@recoil.org) identity=mailfrom; client-ip=89.16.177.154; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="anil@recoil.org"; x-sender="anil@recoil.org"; x-conformance=sidf_compatible Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@dark.recoil.org) identity=helo; client-ip=89.16.177.154; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="anil@recoil.org"; x-sender="postmaster@dark.recoil.org"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqECANCni1FZELGagWdsb2JhbABSgz7AB4ERDgEBFiYogh8BAQUnUhALGC5XBhMbh18DEwi1Dw2IDASMUoJWB4J0YQOXLIY5jicg X-IPAS-Result: AqECANCni1FZELGagWdsb2JhbABSgz7AB4ERDgEBFiYogh8BAQUnUhALGC5XBhMbh18DEwi1Dw2IDASMUoJWB4J0YQOXLIY5jicg X-IronPort-AV: E=Sophos;i="4.87,641,1363129200"; d="scan'208";a="16641746" Received: from recoil.dh.bytemark.co.uk (HELO dark.recoil.org) ([89.16.177.154]) by mail2-smtp-roc.national.inria.fr with SMTP; 09 May 2013 15:44:55 +0200 Received: (qmail 28014 invoked by uid 634); 9 May 2013 13:44:54 -0000 X-Spam-Level: * X-Spam-Check-By: dark.recoil.org Received: from Unknown (HELO [172.20.26.177]) (12.202.122.2) (smtp-auth username remote@recoil.org, mechanism cram-md5) by dark.recoil.org (qpsmtpd/0.84) with ESMTPA; Thu, 09 May 2013 14:44:54 +0100 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) From: Anil Madhavapeddy In-Reply-To: Date: Thu, 9 May 2013 09:44:52 -0400 Cc: caml-list Content-Transfer-Encoding: 7bit Message-Id: References: To: Tom Ridge X-Mailer: Apple Mail (2.1503) X-Virus-Checked: Checked by ClamAV on dark.recoil.org Subject: Re: [Caml-list] String, Array, Bigarray.char 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