1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//! This library provides an implementation of `GhostCell` and its `GhostToken` as per
//! <https://plv.mpi-sws.org/rustbelt/ghostcell/> as well as some extensions.
//!
//! #   Safety
//!
//! The actual implementation of `GhostCell` is found at <https://gitlab.mpi-sws.org/FP/ghostcell/-/tree/master/ghostcell>
//! and has been proven safe. I have carefully checked that this implementation faithfully reproduces the safety
//! guarantees.
//!
//! Extensions to `GhostCell`, such as `GhostCursor`, are not proven, neither at the design nor implementation level.
//! As such, they are only available if the appropriate Cargo features are enabled.
//!
//! #   Example
//!
//! A simple self-contained example:
//!
//! ```rust
//! use ghost_cell::{GhostToken, GhostCell};
//!
//! let n = 42;
//!
//! let value = GhostToken::new(|mut token| {
//!     let cell = GhostCell::new(42);
//!
//!     let vec: Vec<_> = (0..n).map(|_| &cell).collect();
//!
//!     *vec[n / 2].borrow_mut(&mut token) = 33;
//!
//!     *cell.borrow(&token)
//! });
//!
//! assert_eq!(33, value);
//! ```

//  Generic features.
#![cfg_attr(not(test), no_std)]
//  Lints.
#![deny(missing_docs)]

pub mod ghost_cell;

pub use self::ghost_cell::{GhostCell, GhostToken};

pub mod ghost_borrow;

pub use self::ghost_borrow::GhostBorrow;

#[cfg(feature = "experimental-multiple-mutable-borrows")]
pub mod ghost_borrow_mut;

#[cfg(feature = "experimental-multiple-mutable-borrows")]
pub use self::ghost_borrow_mut::{GhostAliasingError, GhostBorrowMut};

#[cfg(feature = "experimental-ghost-cursor")]
pub mod ghost_cursor;

#[cfg(feature = "experimental-ghost-cursor")]
pub use self::ghost_cursor::GhostCursor;