///|
/// 有界游标保证嵌套长度不会跨越父记录边界。
priv struct Cursor {
data : Bytes
mut pos : Int
end : Int
}
///|
fn Cursor::new(data : Bytes) -> Cursor {
{ data, pos: 0, end: data.length(), }
}
///|
fn Cursor::remaining(self : Cursor) -> Int {
self.end - self.pos
}
///|
fn Cursor::require(self : Cursor, n : Int) -> Unit raise ParseError {
if n < 0 || n > self.remaining() {
raise Invalid(self.pos, "截断或无效长度")
}
}
///|
fn Cursor::u8(self : Cursor) -> Int raise ParseError {
self.require(1)
let value = self.data[self.pos].to_int()
self.pos += 1
value
}
///|
fn Cursor::u16(self : Cursor) -> Int raise ParseError {
let a = self.u8()
let b = self.u8()
(a << 8) | b
}
///|
fn Cursor::u32(self : Cursor) -> UInt raise ParseError {
let a = self.u16().reinterpret_as_uint()
let b = self.u16().reinterpret_as_uint()
(a << 16) | b
}
///|
fn Cursor::take(self : Cursor, n : Int) -> Cursor raise ParseError {
self.require(n)
let child = { data: self.data, pos: self.pos, end: self.pos + n, }
self.pos += n
child
}
///|
fn Cursor::bytes(self : Cursor, n : Int) -> Bytes raise ParseError {
let child = self.take(n)
child.data[child.pos:child.end].to_owned()
}
///|
fn Cursor::finish(self : Cursor) -> Unit raise ParseError {
if self.remaining() != 0 {
raise Invalid(self.pos, "存在未消费的尾部数据")
}
}