Source file intranges.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(** 64-bit packed ranges: each int = start lsl 32 lor end_exclusive. *)

type t = int array

let contains cp ranges =
  let len = Array.length ranges in
  if len = 0 then false
  else
    let lo = ref 0 in
    let hi = ref (len - 1) in
    while !lo <= !hi do
      let mid = !lo + (!hi - !lo) / 2 in
      let mid_start = ranges.(mid) lsr 32 in
      if mid_start <= cp then lo := mid + 1
      else hi := mid - 1
    done;
    if !hi >= 0 then
      let start = ranges.(!hi) lsr 32 in
      let end_ = ranges.(!hi) land 0xFFFFFFFF in
      start <= cp && cp < end_
    else false