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 B37107EE51 for ; Thu, 9 May 2013 16:29:42 +0200 (CEST) Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of markus.mottl@gmail.com) identity=pra; client-ip=74.125.82.54; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="markus.mottl@gmail.com"; x-sender="markus.mottl@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of markus.mottl@gmail.com designates 74.125.82.54 as permitted sender) identity=mailfrom; client-ip=74.125.82.54; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="markus.mottl@gmail.com"; x-sender="markus.mottl@gmail.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-wg0-f54.google.com) identity=helo; client-ip=74.125.82.54; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="markus.mottl@gmail.com"; x-sender="postmaster@mail-wg0-f54.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AugBAGexi1FKfVI2k2dsb2JhbABSgz6tbpIYcggWDgEBAQEHCwsJFAQkgh8BAQUnGQEUBxILAQMMBgULDQ0hIQEBEQEFAQoSBhMSCYdeAQMPDKBKjD2CfoRZChknAwpYhzIBBQyMRoJWB4NVA5VIgWSBJoptgz0WKYRRIA X-IPAS-Result: AugBAGexi1FKfVI2k2dsb2JhbABSgz6tbpIYcggWDgEBAQEHCwsJFAQkgh8BAQUnGQEUBxILAQMMBgULDQ0hIQEBEQEFAQoSBhMSCYdeAQMPDKBKjD2CfoRZChknAwpYhzIBBQyMRoJWB4NVA5VIgWSBJoptgz0WKYRRIA X-IronPort-AV: E=Sophos;i="4.87,641,1363129200"; d="scan'208";a="13716017" Received: from mail-wg0-f54.google.com ([74.125.82.54]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/RC4-SHA; 09 May 2013 16:29:42 +0200 Received: by mail-wg0-f54.google.com with SMTP id x12so3029977wgg.33 for ; Thu, 09 May 2013 07:29:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=x7x0oGf4Z2kQpcffy3eC74xPHGSuXBbxKkbQmq5ZtjM=; b=CxQDcCAXDVogingypD7bUYnb03vdXLsclRKK/LWhnRuB3wtECrdENLc2mv4upf5nxK K/wy7KwSOWNE7ZKqoBYkURMEZCxiNhfIFoNoCBsb9/5AcnG+3TESxvxMy6LGqYUjIB7u euBcU9Souxx0J2atsgw0z5IZdg56lvXf1MVOYopw2C1xhDRNPEsjf88Fi22fUNvUnexL EsrCdjlN8WDE/WadHWC2frsYLiPF0HBlfn38KHeAkhsNj3wM6+/NBhorT7aW/VILqAjj 5U+Q5LB5KN/HWMLjE/4n6YQeueOqYKVM6Ct6MWtqfWjRfOuiWnZ8eRWSsU9BjJuMWLDH eEZA== MIME-Version: 1.0 X-Received: by 10.180.210.225 with SMTP id mx1mr29580292wic.15.1368109781708; Thu, 09 May 2013 07:29:41 -0700 (PDT) Received: by 10.194.46.9 with HTTP; Thu, 9 May 2013 07:29:41 -0700 (PDT) In-Reply-To: References: Date: Thu, 9 May 2013 10:29:41 -0400 Message-ID: From: Markus Mottl To: Tom Ridge Cc: Anil Madhavapeddy , caml-list Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Caml-list] String, Array, Bigarray.char The Core.Std.Bigstring-module offers a large number of Unix-I/O functions for bigstrings, even for vectorized I/O (e.g. writev). I am sure you will find everything you need there. On Thu, May 9, 2013 at 10:14 AM, Tom Ridge wrote: > 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 >>> >>> >>> > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa.inria.fr/sympa/arc/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs -- Markus Mottl http://www.ocaml.info markus.mottl@gmail.com