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 369D67EE51 for ; Thu, 9 May 2013 16:07:43 +0200 (CEST) Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of tom.j.ridge@googlemail.com) identity=pra; client-ip=209.85.160.42; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="tom.j.ridge@googlemail.com"; x-sender="tom.j.ridge@googlemail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of tom.j.ridge@googlemail.com designates 209.85.160.42 as permitted sender) identity=mailfrom; client-ip=209.85.160.42; receiver=mail2-smtp-roc.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 (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-pb0-f42.google.com) identity=helo; client-ip=209.85.160.42; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="tom.j.ridge@googlemail.com"; x-sender="postmaster@mail-pb0-f42.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8BAGusi1HRVaAqk2dsb2JhbABSgz7AeggWDgEBAQEHCwsJFAQkgh8BAQUnGQEBNwEPAQoLDS4iEgEFARwGExuHXgEDDwygP4p8hD8BBYRRChknDYgKAgSMUoYyly+PUBYpgV2CWTs X-IPAS-Result: At8BAGusi1HRVaAqk2dsb2JhbABSgz7AeggWDgEBAQEHCwsJFAQkgh8BAQUnGQEBNwEPAQoLDS4iEgEFARwGExuHXgEDDwygP4p8hD8BBYRRChknDYgKAgSMUoYyly+PUBYpgV2CWTs X-IronPort-AV: E=Sophos;i="4.87,641,1363129200"; d="scan'208";a="16644262" Received: from mail-pb0-f42.google.com ([209.85.160.42]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/RC4-SHA; 09 May 2013 16:07:42 +0200 Received: by mail-pb0-f42.google.com with SMTP id up7so2012721pbc.15 for ; Thu, 09 May 2013 07:07:40 -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=vG90UuMMOVKDruHkmzH3NnEggx7hzTj/vAJPfgsmpnU=; b=YIu2h+FpzQSq6kX+2yzBzp4nYH1WmnLgEX07Xwkuh1hh9CNNyJYclsEdg5p6xT95M8 sztQC8H1R+cydha7t/K+iLoWlZ3o6H0e7CZPJDcN7pjFlMOYwY7h73VnYdhAqsuujmLz v9mn/vNL/BzcrkQd2/KQUZvDzFP6wNZVA8Gcr9O5WBTtKJOuYmFNqLUm2gen/kUHLBMA YAC0m8/Wsmp/8hqTAqxvveykSQfoElVU+3r7i7xbiX2COPQ1F+1xsv7weLdmQwsSVsRl ZMNOFmEY3+O5kuzyPEr3p2DtL6FromnQTyfYBCQ9bRPTJg5gdYZBbV2+DgufmpV3g5oY 73HQ== X-Received: by 10.66.27.197 with SMTP id v5mr13045225pag.211.1368108460869; Thu, 09 May 2013 07:07:40 -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:07:20 -0700 (PDT) In-Reply-To: References: From: Tom Ridge Date: Thu, 9 May 2013 15:07:20 +0100 X-Google-Sender-Auth: hqZn4r3iJX4CQUnJ0zo3BKSt-5s Message-ID: To: Anil Madhavapeddy Cc: caml-list Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Caml-list] String, Array, Bigarray.char 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 > > >