/**
 * @file
 * THis file is about judgement function.
 */

package yaml4cj.yaml

let inputRawBufferSize = 512

let inputBufferSize = inputRawBufferSize * 3

let outputBufferSize = 128

let outputRawBufferSize = (outputBufferSize * 2 + 2)

let initialStackSize = 16
let initialQueueSize = 16
let initialStringSize = 16

/**
 * The Function is isAlpha
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isAlpha(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9' || bc >= r'A' && bc <= r'Z' || bc >= r'a' && bc <= r'z' || bc == r'_' || bc == r'-'
}*/

/**
 * The Function is isAlpha
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isAlpha(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9' || bc >= r'A' && bc <= r'Z' || bc >= r'a' && bc <= r'z' || bc == r'_' || bc == r'-'
}

/**
 * The Function is isDigit
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isDigit(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9'
}*/

/**
 * The Function is isDigit
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isDigit(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9'
}

/**
 * The Function is asDigit
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Int64
 * @since 0.30.4
 */
/*@overflowWrapping
func asDigit(b: Array<UInt8>, i: Int64): Int64 {
    Int64(UInt32(b[i]) - UInt32('0'))
}*/

/**
 * The Function is asDigit
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Int64
 * @since 0.30.4
 */
@OverflowWrapping
func asDigit(b: ArrayList<UInt8>, i: Int64): Int64 {
    Int64(UInt32(b[i]) - UInt32(r'0'))
}

/**
 * The Function is isHex
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isHex(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9' || bc >= r'A' && bc <= r'F' || bc >= r'a' && bc <= r'f'
}*/

/**
 * The Function is isHex
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isHex(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc >= r'0' && bc <= r'9' || bc >= r'A' && bc <= r'F' || bc >= r'a' && bc <= r'f'
}

/**
 * The Function is asHex
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Int64
 * @since 0.30.4
 */
/*@overflowWrapping
func asHex(b: Array<UInt8>, i: Int64): Int64 {
    asHex(b[i])
}*/

/**
 * The Function is asHex
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Int64
 * @since 0.30.4
 */
@OverflowWrapping
func asHex(b: ArrayList<UInt8>, i: Int64): Int64 {
    asHex(b[i])
}

@OverflowWrapping
func asHex(bi: UInt8): Int64 {
    let bc = Rune(UInt32(bi))
    if (bc >= r'A' && bc <= r'F') {
        Int64(UInt32(bi) - UInt32(r'A') + 10)
    } else if (bc >= r'a' && bc <= r'f') {
        Int64(UInt32(bi) - UInt32(r'a') + 10)
    } else {
        Int64(UInt32(bi) - UInt32(r'0'))
    }
}

/**
 * The Function is isAscii
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isAscii(b: Array<UInt8>, i: Int64): Bool {
    b[i] <= 0x7F
}

/**
 * The Function is isAscii
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isAscii(b: ArrayList<UInt8>, i: Int64): Bool {
    b[i] <= 0x7F
}

/**
 * The Function is isPrintable
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isPrintable(b: Array<UInt8>, i: Int64): Bool {
    (b[i] == 0x0A) || (b[i] >= 0x20 && b[i] <= 0x7E) || (b[i] == 0xC2 && b[i + 1] >= 0xA0) || (b[i] > 0xC2 && b[i] < 0xED)||
        (b[i] == 0xED && b[i + 1] < 0xA0) || (b[i] == 0xEE) || (b[i] == 0xEF && !(b[i + 1] == 0xBB && b[i + 2] == 0xBF) &&
        !(b[i + 1] == 0xBF && (b[i + 2] == 0xBE || b[i + 2] == 0xBF)))
}

/**
 * The Function is isPrintable
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isPrintable(b: ArrayList<UInt8>, i: Int64): Bool {
    (b[i] == 0x0A) || (b[i] >= 0x20 && b[i] <= 0x7E) || (b[i] == 0xC2 && b[i + 1] >= 0xA0) || (b[i] > 0xC2 && b[i] < 0xED)||
        (b[i] == 0xED && b[i + 1] < 0xA0) || (b[i] == 0xEE) || (b[i] == 0xEF && !(b[i + 1] == 0xBB && b[i + 2] == 0xBF) &&
        !(b[i + 1] == 0xBF && (b[i + 2] == 0xBE || b[i + 2] == 0xBF)))
}*/

/**
 * The Function is isZ
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isZ(b: Array<UInt8>, i: Int64): Bool {
    b[i] == 0x00
}*/

/**
 * The Function is isZ
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isZ(b: ArrayList<UInt8>, i: Int64): Bool {
    b[i] == 0x00
}

/**
 * The Function is isBom
 *
 * @param b of Array<UInt8>
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBom(b: Array<UInt8>): Bool {
    b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
}

/**
 * The Function is isBom
 *
 * @param b of ArrayList<UInt8>
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBom(b: ArrayList<UInt8>): Bool {
    b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
}

/**
 * The Function is isSpace
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isSpace(b: Array<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32(r' ')
}

/**
 * The Function is isSpace
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isSpace(b: ArrayList<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32(r' ')
}

/**
 * The Function is isTab
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isTab(b: Array<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32(r'\t')
}

/**
 * The Function is isTab
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isTab(b: ArrayList<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32(r'\t')
}

/**
 * The Function is isBlank
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBlank(b: Array<UInt8>, i: Int64): Bool {
    isSpace(b, i) || isTab(b, i)
}

/**
 * The Function is isBlank
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBlank(b: ArrayList<UInt8>, i: Int64): Bool {
    isSpace(b, i) || isTab(b, i)
}

/**
 * The Function is isBreak
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBreak(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA8)||
        (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9)
}

/**
 * The Function is isBreak
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBreak(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA8)||
        (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9)
}

/**
 * The Function is isCRLF
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
/*func isCRLF(b: Array<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32('\r') && UInt32(b[i + 1]) == UInt32('\n')
}*/

/**
 * The Function is isCRLF
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isCRLF(b: ArrayList<UInt8>, i: Int64): Bool {
    UInt32(b[i]) == UInt32(r'\r') && UInt32(b[i + 1]) == UInt32(r'\n')
}

/**
 * The Function is isBreakz
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBreakz(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    (bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA8)||
        (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9) || // isZ:
    bi == 0)
}

/**
 * The Function is isBreakz
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBreakz(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    (bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA8)||
        (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9) || // isZ:
    bi == 0)
}

/**
 * The Function is isBlankz
 *
 * @param b of ArrayList<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBlankz(b: ArrayList<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc == r' ' || bc == r'\t' || bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] ==
        0x80 && b[i + 2] == 0xA8) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9) || bi == 0
}

/**
 * The Function is isBlankz
 *
 * @param b of Array<UInt8>
 * @param i of Int64
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func isBlankz(b: Array<UInt8>, i: Int64): Bool {
    let bi = b[i]
    let bc = Rune(UInt32(bi))
    bc == r' ' || bc == r'\t' || bc == r'\r' || bc == r'\n' || (bi == 0xC2 && b[i + 1] == 0x85) || (bi == 0xE2 && b[i + 1] ==
        0x80 && b[i + 2] == 0xA8) || (bi == 0xE2 && b[i + 1] == 0x80 && b[i + 2] == 0xA9) || bi == 0
}

/**
 * The Function is width
 *
 * @param b of UInt8
 *
 * @return Type of Int64
 * @since 0.30.4
 */
func width(b: UInt8): Int64 {
    if ((b & 0x80) == 0x00) {
        1
    } else if ((b & 0xE0) == 0xC0) {
        2
    } else if ((b & 0xF0) == 0xE0) {
        3
    } else if ((b & 0xF8) == 0xF0) {
        4
    } else {
        0
    }
}

/**
 * The Function is containsChinese
 *
 * @param b of Array<UInt8>
 *
 * @return Type of Bool
 * @since 0.30.4
 */
func containsChinese(b: Array<UInt8>): Bool {
    if (b.size == 0) {
        return false
    }
    let str = String.fromUtf8(b)
    let arr = str.toRuneArray()
    for (c in arr) {
        let f = UInt32(c)
        if (f >= 0x4E00 && f <= 0x9FA5) {
            return true
        }
    }
    false
}