Module Base_bigstringSource

String type based on Bigarray, for use in I/O and C-bindings.

Types and exceptions

include Ppx_compare_lib.Comparable.S with type t := t
Sourceval compare : t -> t -> int
include Sexplib0.Sexpable.S with type t := t
Sourceval t_of_sexp : Sexplib0.Sexp.t -> t
Sourceval sexp_of_t : t -> Sexplib0.Sexp.t
Sourcetype t_frozen = t

Type of bigstrings which support hashing. Note that mutation invalidates previous hashes.

Sourceval compare_t_frozen : t_frozen -> t_frozen -> Base.int
Sourceval sexp_of_t_frozen : t_frozen -> Sexplib0.Sexp.t
Sourceval t_frozen_of_sexp : Sexplib0.Sexp.t -> t_frozen
include Base.Equal.S with type t := t

Creation and string conversion

Sourceval create : Base.int -> t

create length

  • returns

    a new bigstring having length. Content is undefined.

Sourceval init : Base.int -> f:(Base.int -> Base.char) -> t

init n ~f creates a bigstring t of length n, with t.{i} = f i.

Sourceval of_string : ?pos:Base.int -> ?len:Base.int -> Base.string -> t

of_string ?pos ?len str

  • returns

    a new bigstring that is equivalent to the substring of length len in str starting at position pos.

  • parameter pos

    default = 0

  • parameter len

    default = String.length str - pos

Sourceval of_bytes : ?pos:Base.int -> ?len:Base.int -> Base.bytes -> t

of_bytes ?pos ?len str

  • returns

    a new bigstring that is equivalent to the subbytes of length len in str starting at position pos.

  • parameter pos

    default = 0

  • parameter len

    default = Bytes.length str - pos

Sourceval to_string : ?pos:Base.int -> ?len:Base.int -> t -> Base.string

to_string ?pos ?len bstr

  • returns

    a new string that is equivalent to the substring of length len in bstr starting at position pos.

  • parameter pos

    default = 0

  • parameter len

    default = length bstr - pos

Sourceval to_bytes : ?pos:Base.int -> ?len:Base.int -> t -> Base.bytes

to_bytes ?pos ?len bstr

  • returns

    a new byte sequence that is equivalent to the substring of length len in bstr starting at position pos.

  • parameter pos

    default = 0

  • parameter len

    default = length bstr - pos

Sourceval concat : ?sep:t -> t Base.list -> t

concat ?sep list returns the concatenation of list with sep in between each.

Checking

Sourceval check_args : loc:Base.string -> pos:Base.int -> len:Base.int -> t -> Base.unit

check_args ~loc ~pos ~len bstr checks the position and length arguments pos and len for bigstrings bstr.

  • raises

    Invalid_argument if these arguments are illegal for the given bigstring using loc to indicate the calling context.

Sourceval get_opt_len : t -> pos:Base.int -> Base.int Base.option -> Base.int

get_opt_len bstr ~pos opt_len

  • returns

    the length of a subbigstring in bstr starting at position pos and given optional length opt_len. This function does not check the validity of its arguments. Use check_args for that purpose.

Accessors

Sourceval length : t -> Base.int

length bstr

  • returns

    the length of bigstring bstr.

Sourceval get : t -> Base.int -> Base.char

get t pos returns the character at pos

Sourceval unsafe_get : t -> Base.int -> Base.char

unsafe_get t pos returns the character at pos, without bounds checks.

Sourceval set : t -> Base.int -> Base.char -> Base.unit

set t pos sets the character at pos

Sourceval unsafe_set : t -> Base.int -> Base.char -> Base.unit

unsafe_set t pos sets the character at pos, without bounds checks.

Sourceval is_mmapped : t -> Base.bool

is_mmapped bstr

  • returns

    whether the bigstring bstr is memory-mapped.

Blitting

blit ~src ?src_pos ?src_len ~dst ?dst_pos () blits src_len characters from src starting at position src_pos to dst at position dst_pos.

include Base.Blit.S with type t := t
Sourceval blit : src:t -> src_pos:int -> dst:t -> dst_pos:int -> len:int -> unit
Sourceval blito : src:t -> ?src_pos:int -> ?src_len:int -> dst:t -> ?dst_pos:int -> unit -> unit
Sourceval unsafe_blit : src:t -> src_pos:int -> dst:t -> dst_pos:int -> len:int -> unit
Sourceval sub : t -> pos:int -> len:int -> t
Sourceval subo : ?pos:int -> ?len:int -> t -> t
Sourceval copy : t -> t
Sourcemodule To_string : sig ... end
Sourcemodule From_string : Base.Blit.S_distinct with type src := Base.string with type dst := t
Sourcemodule To_bytes : Base.Blit.S_distinct with type src := t with type dst := Base.bytes
Sourcemodule From_bytes : Base.Blit.S_distinct with type src := Base.bytes with type dst := t
Sourceval memset : t -> pos:Base.int -> len:Base.int -> Base.char -> Base.unit

memset t ~pos ~len c fills t with c within the range [pos, pos + len).

Sourceval unsafe_memset : t -> pos:Base.int -> len:Base.int -> Base.char -> Base.unit

unsafe_memset t ~pos ~len c fills t with c within the range [pos, pos + len), without bounds checks.

Memcmp

Sourceval memcmp : t -> pos1:Base.int -> t -> pos2:Base.int -> len:Base.int -> Base.int

memcmp t1 ~pos1 t2 ~pos2 ~len is like compare t1 t2 except performs the comparison on the subregions of t1 and t2 defined by pos1, pos2, and len.

Sourceval memcmp_bytes : t -> pos1:Base.int -> Base.Bytes.t -> pos2:Base.int -> len:Base.int -> Base.int

memcmp_bytes, for efficient memcmp between Bigstring and Bytes data.

Sourceval memcmp_string : t -> pos1:Base.int -> Base.string -> pos2:Base.int -> len:Base.int -> Base.int

memcmp_string, for efficient memcmp between Bigstring and string data.

Accessors for parsing binary values, analogous to Binary_packing

These are in Bigstring rather than a separate module because:

1. Existing Binary_packing requires copies and does not work with bigstrings. 2. The accessors rely on the implementation of bigstring, and hence should change should the implementation of bigstring move away from Bigarray. 3. Bigstring already has some external C functions, so it didn't require many changes to the jbuild ^_^.

In a departure from Binary_packing, the naming conventions are chosen to be close to C99 stdint types, as it's a more standard description and it is somewhat useful in making compact macros for the implementations. The accessor names contain endian-ness to allow for branch-free implementations

<accessor> ::= <unsafe><operation><type><endian> <unsafe> ::= unsafe_ | '' <operation> ::= get_ | set_ <type> ::= int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64 <endian> ::= _le | _be | ''

The unsafe_ prefix indicates that these functions do no bounds checking and silently truncate out-of-range numeric arguments.

Sourceval get_int8 : t -> pos:Base.int -> Base.int
Sourceval set_int8_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval get_uint8 : t -> pos:Base.int -> Base.int
Sourceval set_uint8_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_int8 : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_int8 : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_uint8 : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_uint8 : t -> pos:Base.int -> Base.int -> Base.unit

16-bit methods

Sourceval get_int16_le : t -> pos:Base.int -> Base.int
Sourceval get_int16_be : t -> pos:Base.int -> Base.int
Sourceval set_int16_le_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_int16_be_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_int16_le : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_int16_be : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_int16_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_int16_be : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval get_uint16_le : t -> pos:Base.int -> Base.int
Sourceval get_uint16_be : t -> pos:Base.int -> Base.int
Sourceval set_uint16_le_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_uint16_be_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_uint16_le : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_uint16_be : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_uint16_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_uint16_be : t -> pos:Base.int -> Base.int -> Base.unit

32-bit methods

Sourceval get_int32_le : t -> pos:Base.int -> Base.int
Sourceval get_int32_be : t -> pos:Base.int -> Base.int
Sourceval set_int32_le_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_int32_be_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_int32_le : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_int32_be : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_int32_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_int32_be : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval get_uint32_le : t -> pos:Base.int -> Base.int
Sourceval get_uint32_be : t -> pos:Base.int -> Base.int
Sourceval set_uint32_le_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_uint32_be_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_uint32_le : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_uint32_be : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_uint32_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_uint32_be : t -> pos:Base.int -> Base.int -> Base.unit

Similar to the usage in binary_packing, the below methods are treating the value being read (or written), as an ocaml immediate integer, as such it is actually 63 bits. If the user is confident that the range of values used in practice will not require 64-bit precision (i.e. Less than Max_Long), then we can avoid allocation and use an immediate. If the user is wrong, an exception will be thrown (for get).

64-bit signed values

Sourceval get_int64_le_exn : t -> pos:Base.int -> Base.int
Sourceval get_int64_be_exn : t -> pos:Base.int -> Base.int
Sourceval get_int64_le_trunc : t -> pos:Base.int -> Base.int
Sourceval get_int64_be_trunc : t -> pos:Base.int -> Base.int
Sourceval set_int64_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_int64_be : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_int64_le_exn : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_int64_be_exn : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_int64_le_trunc : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_int64_be_trunc : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_int64_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_int64_be : t -> pos:Base.int -> Base.int -> Base.unit

64-bit unsigned values

Sourceval get_uint64_be_exn : t -> pos:Base.int -> Base.int
Sourceval get_uint64_le_exn : t -> pos:Base.int -> Base.int
Sourceval set_uint64_le_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval set_uint64_be_exn : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_get_uint64_be_exn : t -> pos:Base.int -> Base.int
Sourceval unsafe_get_uint64_le_exn : t -> pos:Base.int -> Base.int
Sourceval unsafe_set_uint64_le : t -> pos:Base.int -> Base.int -> Base.unit
Sourceval unsafe_set_uint64_be : t -> pos:Base.int -> Base.int -> Base.unit

32-bit methods with full precision

Sourceval get_int32_t_le : t -> pos:Base.int -> Base.Int32.t
Sourceval get_int32_t_be : t -> pos:Base.int -> Base.Int32.t
Sourceval set_int32_t_le : t -> pos:Base.int -> Base.Int32.t -> Base.unit
Sourceval set_int32_t_be : t -> pos:Base.int -> Base.Int32.t -> Base.unit
Sourceval unsafe_get_int32_t_le : t -> pos:Base.int -> Base.Int32.t
Sourceval unsafe_get_int32_t_be : t -> pos:Base.int -> Base.Int32.t
Sourceval unsafe_set_int32_t_le : t -> pos:Base.int -> Base.Int32.t -> Base.unit
Sourceval unsafe_set_int32_t_be : t -> pos:Base.int -> Base.Int32.t -> Base.unit

64-bit methods with full precision

Sourceval get_int64_t_le : t -> pos:Base.int -> Base.Int64.t
Sourceval get_int64_t_be : t -> pos:Base.int -> Base.Int64.t
Sourceval set_int64_t_le : t -> pos:Base.int -> Base.Int64.t -> Base.unit
Sourceval set_int64_t_be : t -> pos:Base.int -> Base.Int64.t -> Base.unit
Sourceval unsafe_get_int64_t_le : t -> pos:Base.int -> Base.Int64.t
Sourceval unsafe_get_int64_t_be : t -> pos:Base.int -> Base.Int64.t
Sourceval unsafe_set_int64_t_le : t -> pos:Base.int -> Base.Int64.t -> Base.unit
Sourceval unsafe_set_int64_t_be : t -> pos:Base.int -> Base.Int64.t -> Base.unit

String methods

These are alternatives to to_string that follow the conventions of the int accessors, and in particular avoid optional arguments.

Sourceval get_string : t -> pos:Base.int -> len:Base.int -> Base.string
Sourceval unsafe_get_string : t -> pos:Base.int -> len:Base.int -> Base.string
Sourcemodule Local : sig ... end
Sourcemodule Int_repr : sig ... end
Sourcemodule Private : sig ... end