// Copyright 2025 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
let ll_predefined_table_log = 6

///|
let of_predefined_table_log = 5

///|
let ml_predefined_table_log = 6

///|
fn ll_predefined_entry(state : Int) -> (Int, Int, Int, Int) raise ZstdError {
  match state {
    0 => (0, 0, 4, 0)
    1 => (16, 0, 4, 0)
    2 => (32, 0, 5, 1)
    3 => (0, 0, 5, 3)
    4 => (0, 0, 5, 4)
    5 => (0, 0, 5, 6)
    6 => (0, 0, 5, 7)
    7 => (0, 0, 5, 9)
    8 => (0, 0, 5, 10)
    9 => (0, 0, 5, 12)
    10 => (0, 0, 6, 14)
    11 => (0, 1, 5, 16)
    12 => (0, 1, 5, 20)
    13 => (0, 1, 5, 22)
    14 => (0, 2, 5, 28)
    15 => (0, 3, 5, 32)
    16 => (0, 4, 5, 48)
    17 => (32, 6, 5, 64)
    18 => (0, 7, 5, 128)
    19 => (0, 8, 6, 256)
    20 => (0, 10, 6, 1024)
    21 => (0, 12, 6, 4096)
    22 => (32, 0, 4, 0)
    23 => (0, 0, 4, 1)
    24 => (0, 0, 5, 2)
    25 => (32, 0, 5, 4)
    26 => (0, 0, 5, 5)
    27 => (32, 0, 5, 7)
    28 => (0, 0, 5, 8)
    29 => (32, 0, 5, 10)
    30 => (0, 0, 5, 11)
    31 => (0, 0, 6, 13)
    32 => (32, 1, 5, 16)
    33 => (0, 1, 5, 18)
    34 => (32, 1, 5, 22)
    35 => (0, 2, 5, 24)
    36 => (32, 3, 5, 32)
    37 => (0, 3, 5, 40)
    38 => (0, 6, 4, 64)
    39 => (16, 6, 4, 64)
    40 => (32, 7, 5, 128)
    41 => (0, 9, 6, 512)
    42 => (0, 11, 6, 2048)
    43 => (48, 0, 4, 0)
    44 => (16, 0, 4, 1)
    45 => (32, 0, 5, 2)
    46 => (32, 0, 5, 3)
    47 => (32, 0, 5, 5)
    48 => (32, 0, 5, 6)
    49 => (32, 0, 5, 8)
    50 => (32, 0, 5, 9)
    51 => (32, 0, 5, 11)
    52 => (32, 0, 5, 12)
    53 => (0, 0, 6, 15)
    54 => (32, 1, 5, 18)
    55 => (32, 1, 5, 20)
    56 => (32, 2, 5, 24)
    57 => (32, 2, 5, 28)
    58 => (32, 3, 5, 40)
    59 => (32, 4, 5, 48)
    60 => (0, 16, 6, 65536)
    61 => (0, 15, 6, 32768)
    62 => (0, 14, 6, 16384)
    63 => (0, 13, 6, 8192)
    _ => raise CorruptionDetected
  }
}

///|
fn of_predefined_entry(state : Int) -> (Int, Int, Int, Int) raise ZstdError {
  match state {
    0 => (0, 0, 5, 0)
    1 => (0, 6, 4, 61)
    2 => (0, 9, 5, 509)
    3 => (0, 15, 5, 32765)
    4 => (0, 21, 5, 2097149)
    5 => (0, 3, 5, 5)
    6 => (0, 7, 4, 125)
    7 => (0, 12, 5, 4093)
    8 => (0, 18, 5, 262141)
    9 => (0, 23, 5, 8388605)
    10 => (0, 5, 5, 29)
    11 => (0, 8, 4, 253)
    12 => (0, 14, 5, 16381)
    13 => (0, 20, 5, 1048573)
    14 => (0, 2, 5, 1)
    15 => (16, 7, 4, 125)
    16 => (0, 11, 5, 2045)
    17 => (0, 17, 5, 131069)
    18 => (0, 22, 5, 4194301)
    19 => (0, 4, 5, 13)
    20 => (16, 8, 4, 253)
    21 => (0, 13, 5, 8189)
    22 => (0, 19, 5, 524285)
    23 => (0, 1, 5, 1)
    24 => (16, 6, 4, 61)
    25 => (0, 10, 5, 1021)
    26 => (0, 16, 5, 65533)
    27 => (0, 28, 5, 268435453)
    28 => (0, 27, 5, 134217725)
    29 => (0, 26, 5, 67108861)
    30 => (0, 25, 5, 33554429)
    31 => (0, 24, 5, 16777213)
    _ => raise CorruptionDetected
  }
}

///|
fn ml_predefined_entry(state : Int) -> (Int, Int, Int, Int) raise ZstdError {
  match state {
    0 => (0, 0, 6, 3)
    1 => (0, 0, 4, 4)
    2 => (32, 0, 5, 5)
    3 => (0, 0, 5, 6)
    4 => (0, 0, 5, 8)
    5 => (0, 0, 5, 9)
    6 => (0, 0, 5, 11)
    7 => (0, 0, 6, 13)
    8 => (0, 0, 6, 16)
    9 => (0, 0, 6, 19)
    10 => (0, 0, 6, 22)
    11 => (0, 0, 6, 25)
    12 => (0, 0, 6, 28)
    13 => (0, 0, 6, 31)
    14 => (0, 0, 6, 34)
    15 => (0, 1, 6, 37)
    16 => (0, 1, 6, 41)
    17 => (0, 2, 6, 47)
    18 => (0, 3, 6, 59)
    19 => (0, 4, 6, 83)
    20 => (0, 7, 6, 131)
    21 => (0, 9, 6, 515)
    22 => (16, 0, 4, 4)
    23 => (0, 0, 4, 5)
    24 => (32, 0, 5, 6)
    25 => (0, 0, 5, 7)
    26 => (32, 0, 5, 9)
    27 => (0, 0, 5, 10)
    28 => (0, 0, 6, 12)
    29 => (0, 0, 6, 15)
    30 => (0, 0, 6, 18)
    31 => (0, 0, 6, 21)
    32 => (0, 0, 6, 24)
    33 => (0, 0, 6, 27)
    34 => (0, 0, 6, 30)
    35 => (0, 0, 6, 33)
    36 => (0, 1, 6, 35)
    37 => (0, 1, 6, 39)
    38 => (0, 2, 6, 43)
    39 => (0, 3, 6, 51)
    40 => (0, 4, 6, 67)
    41 => (0, 5, 6, 99)
    42 => (0, 8, 6, 259)
    43 => (32, 0, 4, 4)
    44 => (48, 0, 4, 4)
    45 => (16, 0, 4, 5)
    46 => (32, 0, 5, 7)
    47 => (32, 0, 5, 8)
    48 => (32, 0, 5, 10)
    49 => (32, 0, 5, 11)
    50 => (0, 0, 6, 14)
    51 => (0, 0, 6, 17)
    52 => (0, 0, 6, 20)
    53 => (0, 0, 6, 23)
    54 => (0, 0, 6, 26)
    55 => (0, 0, 6, 29)
    56 => (0, 0, 6, 32)
    57 => (0, 16, 6, 65539)
    58 => (0, 15, 6, 32771)
    59 => (0, 14, 6, 16387)
    60 => (0, 13, 6, 8195)
    61 => (0, 12, 6, 4099)
    62 => (0, 11, 6, 2051)
    63 => (0, 10, 6, 1027)
    _ => raise CorruptionDetected
  }
}