package matrix

  1. Overview
  2. Docs

Source file writer.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
type t = { bytes : Bytes.t; cap : int; mutable pos : int }

let make bytes = { bytes; cap = Bytes.length bytes; pos = 0 }
let make_counting () = { bytes = Bytes.create 0; cap = 0; pos = 0 }
let[@inline] len w = w.pos
let[@inline] pos w = w.pos
let[@inline] reset_pos w = w.pos <- 0
let slice w = Bytes.sub w.bytes 0 w.pos

let[@inline] write_char w c =
  if w.cap = 0 then w.pos <- w.pos + 1
  else (
    if w.pos >= w.cap then invalid_arg "Writer: buffer overflow (char)";
    Bytes.unsafe_set w.bytes w.pos c;
    w.pos <- w.pos + 1)

let[@inline] write_string w s =
  let slen = String.length s in
  if slen = 0 then ()
  else if w.cap = 0 then w.pos <- w.pos + slen
  else (
    if w.pos + slen > w.cap then invalid_arg "Writer: buffer overflow (string)";
    Bytes.blit_string s 0 w.bytes w.pos slen;
    w.pos <- w.pos + slen)

let[@inline] write_subbytes w bytes off blen =
  if blen < 0 || off < 0 || off + blen > Bytes.length bytes then
    invalid_arg "Writer: invalid slice";
  if blen = 0 then ()
  else if w.cap = 0 then w.pos <- w.pos + blen
  else (
    if w.pos + blen > w.cap then invalid_arg "Writer: buffer overflow (bytes)";
    Bytes.blit bytes off w.bytes w.pos blen;
    w.pos <- w.pos + blen)