Source file sequence.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
(* (c) 2017 Hannes Mehnert, all rights reserved *)

(* arithmetics within the sequence number space -- 0 .. 2 ^ 32 - 1 *)

type t = int

let[@inline always] add a b = (a + b) land 0xFFFFFFFF
let[@inline always] incr a = add a 1
let zero = 0
let[@inline always] addi a i = (add[@inlined]) a i

let[@inline always] sub a b =
  let d = a - b in
  if d < 0 then d + 0x1_0000_0000 else d

let[@inline always] window a b = sub a b

(* project to 0 .. 0xffffffff, i.e. the positive part *)
let of_int32 x =
  let r = Int32.to_int x in
  if x < 0l then r + 0x1_0000_0000 else r

let to_int32 x =
  let r =
    if x >= 0x80000000 then x - 0x1_0000_0000 else x
  in
  Int32.of_int r

external ( < ) : 'a -> 'a -> bool = "%lessthan"
external ( > ) : 'a -> 'a -> bool = "%greaterthan"

let max_add = 1 lsl 31

let equal a b = a == b

let[@inline always] less a b =
  not (equal a b) &&
  (a < b && sub b a < max_add) ||
  (a > b && sub a b > max_add)

let[@inline always] less_equal a b =
  equal a b || less a b

let[@inline always] greater a b =
  not (equal a b) &&
  (a < b && sub b a > max_add) ||
  (a > b && sub a b < max_add)

let[@inline always] greater_equal a b =
  equal a b || greater a b

let[@inline always] min a b =
  if less a b then a else b

let[@inline always] max a b =
  if greater a b then a else b

let pp = Fmt.int