vstd/
vstd.rs

1//! The "standard library" for [Verus](https://github.com/verus-lang/verus).
2//! Contains various utilities and datatypes for proofs,
3//! as well as runtime functionality with specifications.
4//! For an introduction to Verus, see [the tutorial](https://verus-lang.github.io/verus/guide/).
5#![cfg_attr(not(feature = "std"), no_std)]
6#![allow(unused_parens)]
7#![allow(unused_imports)]
8#![allow(dead_code)]
9#![allow(unused_attributes)]
10#![allow(rustdoc::invalid_rust_codeblocks)]
11#![cfg_attr(verus_keep_ghost, feature(core_intrinsics))]
12#![cfg_attr(any(verus_keep_ghost, feature = "allocator"), feature(allocator_api))]
13#![cfg_attr(verus_keep_ghost, feature(step_trait))]
14#![cfg_attr(verus_keep_ghost, feature(ptr_metadata))]
15#![cfg_attr(verus_keep_ghost, feature(sized_hierarchy))]
16#![cfg_attr(verus_keep_ghost, feature(freeze))]
17#![cfg_attr(verus_keep_ghost, feature(derive_clone_copy_internals))]
18#![cfg_attr(verus_keep_ghost, feature(derive_eq_internals))]
19#![cfg_attr(verus_keep_ghost, verifier::deprecated_postcondition_mut_ref_style(true))]
20#![cfg_attr(all(feature = "alloc", verus_keep_ghost), feature(liballoc_internals))]
21#![cfg_attr(verus_keep_ghost, feature(new_range_api))]
22
23#[cfg(feature = "alloc")]
24extern crate alloc;
25
26pub mod arithmetic;
27pub mod array;
28pub mod atomic;
29pub mod atomic_ghost;
30pub mod bits;
31pub mod bytes;
32pub mod calc_macro;
33pub mod cell;
34pub mod compute;
35pub mod contrib;
36pub mod endian;
37pub mod float;
38pub mod function;
39#[cfg(all(feature = "alloc", feature = "std"))]
40pub mod hash_map;
41#[cfg(all(feature = "alloc", feature = "std"))]
42pub mod hash_set;
43pub mod invariant;
44#[cfg(verus_keep_ghost)]
45pub mod laws_cmp;
46#[cfg(verus_keep_ghost)]
47pub mod laws_eq;
48pub mod layout;
49pub mod logatom;
50pub mod map;
51pub mod map_lib;
52pub mod math;
53pub mod modes;
54pub mod multiset;
55pub mod multiset_lib;
56pub mod pcm;
57pub mod pcm_lib;
58pub mod pervasive;
59pub mod predicate;
60pub mod proph;
61pub mod raw_ptr;
62pub mod relations;
63pub mod rwlock;
64pub mod seq;
65pub mod seq_lib;
66pub mod set;
67pub mod set_lib;
68pub mod shared;
69#[cfg(feature = "alloc")]
70pub mod simple_pptr;
71pub mod slice;
72pub mod state_machine_internal;
73pub mod storage_protocol;
74pub mod string;
75#[cfg(feature = "std")]
76pub mod thread;
77pub mod tokens;
78pub mod utf8;
79pub mod view;
80pub mod wrapping;
81
82#[cfg(verus_keep_ghost)]
83pub mod std_specs;
84
85// Re-exports all vstd types, traits, and functions that are commonly used or replace
86// regular `core` or `std` definitions.
87pub mod prelude;
88
89use prelude::*;
90
91verus! {
92
93#[cfg_attr(verus_keep_ghost, verifier::broadcast_use_by_default_when_this_crate_is_imported)]
94pub broadcast group group_vstd_default {
95    //
96    // basic Verus math, types, and features
97    //
98    seq::group_seq_axioms,
99    seq_lib::group_seq_lib_default,
100    map::group_map_axioms,
101    set::group_set_axioms,
102    set_lib::group_set_lib_default,
103    multiset::group_multiset_axioms,
104    compute::all_spec_ensures,
105    function::group_function_axioms,
106    laws_eq::group_laws_eq,
107    laws_cmp::group_laws_cmp,
108    //
109    // Rust types
110    //
111    slice::group_slice_axioms,
112    array::group_array_axioms,
113    #[cfg(not(verus_verify_core))]
114    string::group_string_axioms,
115    raw_ptr::group_raw_ptr_axioms,
116    layout::group_layout_axioms,
117    //
118    // core std_specs
119    //
120    std_specs::range::group_range_axioms,
121    std_specs::bits::group_bits_axioms,
122    std_specs::control_flow::group_control_flow_axioms,
123    std_specs::slice::group_slice_axioms,
124    std_specs::manually_drop::group_manually_drop_axioms,
125    //
126    // std_specs for alloc (with or without std)
127    //
128    #[cfg(feature = "alloc")]
129    std_specs::vec::group_vec_axioms,
130    #[cfg(feature = "alloc")]
131    std_specs::vecdeque::group_vec_dequeue_axioms,
132    //
133    // std_specs for alloc + std
134    //
135    #[cfg(all(feature = "alloc", feature = "std"))]
136    std_specs::hash::group_hash_axioms,
137    #[cfg(all(feature = "alloc", feature = "std"))]
138    std_specs::btree::group_btree_axioms,
139}
140
141} // verus!
142// This allows us to use `$crate::vstd` or `crate::vstd` to refer to vstd
143// both in verus_verify_core mode (vstd is a module) and out (vstd is a crate)
144#[cfg(not(verus_verify_core))]
145#[doc(hidden)]
146pub use crate as vstd;