vstd_extra/external/
range.rs1use core::ops::{Range, RangeInclusive};
2use vstd::prelude::*;
3
4verus! {
5
6pub open spec fn range_usize_len_spec(r: &Range<usize>) -> usize {
10 if r.start < r.end {
11 (r.end - r.start) as usize
12 } else {
13 0usize
14 }
15}
16
17#[verifier::when_used_as_spec(range_usize_len_spec)]
21pub fn range_usize_len(r: &Range<usize>) -> (ret: usize)
22 ensures
23 ret == range_usize_len_spec(r),
24{
25 if r.start < r.end {
26 r.end - r.start
27 } else {
28 0
29 }
30}
31
32pub open spec fn range_usize_is_empty_spec(r: &Range<usize>) -> bool {
34 !(r.start < r.end)
35}
36
37#[verifier::when_used_as_spec(range_usize_is_empty_spec)]
41pub fn range_usize_is_empty(r: &Range<usize>) -> (ret: bool)
42 ensures
43 ret == range_usize_is_empty_spec(r),
44{
45 !(r.start < r.end)
46}
47
48pub assume_specification<Idx>[ RangeInclusive::start ](r: &RangeInclusive<Idx>) -> (ret: &Idx)
49 ensures
50 *ret == r@.start,
51;
52
53pub assume_specification<Idx>[ RangeInclusive::end ](r: &RangeInclusive<Idx>) -> (ret: &Idx)
54 ensures
55 *ret == r@.end,
56;
57
58}