use vstd::{prelude::*, slice::slice_subrange};
verus! {
pub trait InputSlice: View<V = Seq<u8>> + DeepView<V = Seq<u8>> {
proof fn deep_view_eq_view(&self)
ensures
self.deep_view() == self@,
;
}
pub trait InputBuf: InputSlice + Sized {
fn len(&self) -> (len: usize)
ensures
len == self@.len(),
;
fn subrange(&self, i: usize, j: usize) -> (sliced: Self)
requires
0 <= i as int <= j as int <= self@.len(),
ensures
sliced@ == self@[i..j],
sliced.deep_view() == sliced@,
;
fn take(&self, n: usize) -> (taken: Self)
requires
n as int <= self@.len(),
ensures
taken@ == self@[0..n],
taken.deep_view() == taken@,
{
self.subrange(0, n)
}
fn skip(&self, n: usize) -> (skipped: Self)
requires
n as int <= self@.len(),
ensures
skipped@ == self@[n..],
skipped.deep_view() == skipped@,
{
self.subrange(n, self.len())
}
}
impl<'input> InputSlice for &'input [u8] {
proof fn deep_view_eq_view(&self) {
assert(self.deep_view() == self@);
}
}
impl<'input> InputBuf for &'input [u8] {
fn len(&self) -> (len: usize) {
<[u8]>::len(self)
}
fn subrange(&self, i: usize, j: usize) -> &'input [u8] {
let sliced = slice_subrange(self, i, j);
proof {
sliced.deep_view_eq_view();
}
sliced
}
}
}