|
|
@ -86,15 +86,15 @@ fn scan_usize_guaranteed_termination(
|
|
|
|
let mut ret = 0usize;
|
|
|
|
let mut ret = 0usize;
|
|
|
|
let mut stop = scanner.rounded_eq(b'\n');
|
|
|
|
let mut stop = scanner.rounded_eq(b'\n');
|
|
|
|
while !scanner.eof() & !stop {
|
|
|
|
while !scanner.eof() & !stop {
|
|
|
|
let next_byte = unsafe {
|
|
|
|
let this_byte = unsafe {
|
|
|
|
// UNSAFE(@ohsayan): loop invariant
|
|
|
|
// UNSAFE(@ohsayan): loop invariant
|
|
|
|
scanner.next_byte()
|
|
|
|
scanner.next_byte()
|
|
|
|
};
|
|
|
|
};
|
|
|
|
match ret
|
|
|
|
match ret
|
|
|
|
.checked_mul(10)
|
|
|
|
.checked_mul(10)
|
|
|
|
.map(|int| int.checked_add((next_byte & 0x0f) as usize))
|
|
|
|
.map(|int| int.checked_add((this_byte & 0x0f) as usize))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Some(Some(int)) if next_byte.is_ascii_digit() => ret = int,
|
|
|
|
Some(Some(int)) if this_byte.is_ascii_digit() => ret = int,
|
|
|
|
_ => return Err(ExchangeError::NotAsciiByteOrOverflow),
|
|
|
|
_ => return Err(ExchangeError::NotAsciiByteOrOverflow),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stop = scanner.rounded_eq(b'\n');
|
|
|
|
stop = scanner.rounded_eq(b'\n');
|
|
|
@ -357,22 +357,33 @@ impl<'a> Pipeline<'a> {
|
|
|
|
scanner: BufferedScanner::new(buf),
|
|
|
|
scanner: BufferedScanner::new(buf),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pub fn next_query(&mut self) -> Result<Option<SQuery<'a>>, ExchangeError> {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl<'a> Iterator for Pipeline<'a> {
|
|
|
|
|
|
|
|
type Item = Result<SQuery<'a>, ExchangeError>;
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
let nonzero = self.scanner.buffer_len() != 0;
|
|
|
|
let nonzero = self.scanner.buffer_len() != 0;
|
|
|
|
if self.scanner.eof() & nonzero {
|
|
|
|
if self.scanner.eof() & nonzero {
|
|
|
|
Ok(None)
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
|
|
|
|
let mut ret = || {
|
|
|
|
let query_size = scan_usize_guaranteed_termination(&mut self.scanner)?;
|
|
|
|
let query_size = scan_usize_guaranteed_termination(&mut self.scanner)?;
|
|
|
|
let param_size = scan_usize_guaranteed_termination(&mut self.scanner)?;
|
|
|
|
let param_size = scan_usize_guaranteed_termination(&mut self.scanner)?;
|
|
|
|
let (full_size, overflow) = param_size.overflowing_add(query_size);
|
|
|
|
let (full_size, overflow) = param_size.overflowing_add(query_size);
|
|
|
|
if compiler::likely(self.scanner.has_left(full_size) & !overflow) {
|
|
|
|
if compiler::likely(self.scanner.has_left(full_size) & !overflow) {
|
|
|
|
Ok(Some(SQuery {
|
|
|
|
let block = unsafe {
|
|
|
|
buf: self.scanner.current_buffer(),
|
|
|
|
// UNSAFE(@ohsayan): checked in above branch
|
|
|
|
|
|
|
|
self.scanner.next_chunk_variable(full_size)
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
Ok(SQuery {
|
|
|
|
|
|
|
|
buf: block,
|
|
|
|
q_window: query_size,
|
|
|
|
q_window: query_size,
|
|
|
|
}))
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Err(ExchangeError::IncorrectQuerySizeOrMoreBytes)
|
|
|
|
Err(ExchangeError::IncorrectQuerySizeOrMoreBytes)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
Some(ret())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|