///|
priv struct PrefixCodeRange {
  offset : Int
  nbits : Int
}

///|
let kBlockLengthPrefixCode : FixedArray[PrefixCodeRange] = [
  { offset: 1, nbits: 2 },
  { offset: 5, nbits: 2 },
  { offset: 9, nbits: 2 },
  { offset: 13, nbits: 2 },
  { offset: 17, nbits: 3 },
  { offset: 25, nbits: 3 },
  { offset: 33, nbits: 3 },
  { offset: 41, nbits: 3 },
  { offset: 49, nbits: 4 },
  { offset: 65, nbits: 4 },
  { offset: 81, nbits: 4 },
  { offset: 97, nbits: 4 },
  { offset: 113, nbits: 5 },
  { offset: 145, nbits: 5 },
  { offset: 177, nbits: 5 },
  { offset: 209, nbits: 5 },
  { offset: 241, nbits: 6 },
  { offset: 305, nbits: 6 },
  { offset: 369, nbits: 7 },
  { offset: 497, nbits: 8 },
  { offset: 753, nbits: 9 },
  { offset: 1265, nbits: 10 },
  { offset: 2289, nbits: 11 },
  { offset: 4337, nbits: 12 },
  { offset: 8433, nbits: 13 },
  { offset: 16625, nbits: 24 },
]

///|
let kInsertLengthPrefixCode : FixedArray[PrefixCodeRange] = [
  { offset: 0, nbits: 0 },
  { offset: 1, nbits: 0 },
  { offset: 2, nbits: 0 },
  { offset: 3, nbits: 0 },
  { offset: 4, nbits: 0 },
  { offset: 5, nbits: 0 },
  { offset: 6, nbits: 1 },
  { offset: 8, nbits: 1 },
  { offset: 10, nbits: 2 },
  { offset: 14, nbits: 2 },
  { offset: 18, nbits: 3 },
  { offset: 26, nbits: 3 },
  { offset: 34, nbits: 4 },
  { offset: 50, nbits: 4 },
  { offset: 66, nbits: 5 },
  { offset: 98, nbits: 5 },
  { offset: 130, nbits: 6 },
  { offset: 194, nbits: 7 },
  { offset: 322, nbits: 8 },
  { offset: 578, nbits: 9 },
  { offset: 1090, nbits: 10 },
  { offset: 2114, nbits: 12 },
  { offset: 6210, nbits: 14 },
  { offset: 22594, nbits: 24 },
]

///|
let kCopyLengthPrefixCode : FixedArray[PrefixCodeRange] = [
  { offset: 2, nbits: 0 },
  { offset: 3, nbits: 0 },
  { offset: 4, nbits: 0 },
  { offset: 5, nbits: 0 },
  { offset: 6, nbits: 0 },
  { offset: 7, nbits: 0 },
  { offset: 8, nbits: 0 },
  { offset: 9, nbits: 0 },
  { offset: 10, nbits: 1 },
  { offset: 12, nbits: 1 },
  { offset: 14, nbits: 2 },
  { offset: 18, nbits: 2 },
  { offset: 22, nbits: 3 },
  { offset: 30, nbits: 3 },
  { offset: 38, nbits: 4 },
  { offset: 54, nbits: 4 },
  { offset: 70, nbits: 5 },
  { offset: 102, nbits: 5 },
  { offset: 134, nbits: 6 },
  { offset: 198, nbits: 7 },
  { offset: 326, nbits: 8 },
  { offset: 582, nbits: 9 },
  { offset: 1094, nbits: 10 },
  { offset: 2118, nbits: 24 },
]

///|
let kInsertRangeLut : FixedArray[Int] = [0, 0, 8, 8, 0, 16, 8, 16, 16]

///|
let kCopyRangeLut : FixedArray[Int] = [0, 8, 0, 8, 16, 0, 16, 8, 16]

///|
/// Maps (insert_high * 3 + copy_high) to the base command range index.
let kRangeLookup : FixedArray[Int] = [0, 1, 4, 2, 3, 6, 5, 7, 8]