///
import { OBJECT, BLOCK_MAXSIZE, TOTAL_OVERHEAD } from "./rt/common";
import { compareImpl, strtol, strtod, isSpace, isAscii, isFinalSigma, toLower8, toUpper8 } from "./util/string";
import { SPECIALS_UPPER, casemap, bsearch } from "./util/casemap";
import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_UNPAIRED_SURROGATE } from "./util/error";
import { idof } from "./builtins";
import { Array } from "./array";
@final export abstract class String {
@lazy static readonly MAX_LENGTH: i32 = (BLOCK_MAXSIZE >>> alignof());
static fromCharCode(unit: i32, surr: i32 = -1): String {
let hasSur = surr > 0;
let out = changetype(__new(2 << i32(hasSur), idof()));
store(changetype(out), unit);
if (hasSur) store(changetype(out), surr, 2);
return out;
}
static fromCharCodes(units: Array): String {
let length = units.length;
let out = changetype(__new(length << 1, idof()));
let ptr = units.dataStart;
for (let i = 0; i < length; ++i) {
store(changetype(out) + (i << 1), load(ptr + (i << 2)));
}
return out;
}
static fromCodePoint(code: i32): String {
let hasSur = code > 0xFFFF;
let out = changetype(__new(2 << i32(hasSur), idof()));
if (!hasSur) {
store(changetype(out), code);
} else {
// Checks valid code point range
assert(code <= 0x10FFFF);
code -= 0x10000;
let hi = (code & 0x03FF) | 0xDC00;
let lo = code >>> 10 | 0xD800;
store(changetype(out), lo | hi << 16);
}
return out;
}
@builtin static raw(parts: TemplateStringsArray, ...args: unknown[]): string { return unreachable(); }
get length(): i32 {
return changetype