2 releases
0.1.1 | Aug 13, 2024 |
---|---|
0.1.0 | Aug 13, 2024 |
#9 in #mutability
10KB
182 lines
Super Cell
A super (unsafe) that modifies Cell
type to be more convenient and thus introduce potentially undefined behaviour for mutable types.
Undefined behaviour possible:
- Multiple mutable references from references leading to possible race-conditions
- Concurrent modification in separate threads with no guarantee of order
- ...and probably more.
This leaves the safe-ness in the hands of the programmer, but generally in using this in my own projects, I have not come across a time when this has caused an issue.
Usage
use super_cell::*;
fn main() {
// Mutable primitive
let result = SuperCell::new(10);
*result.get_mut() = 11;
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
// Mutable Complex Struct
let result = SuperCell::new(Test {
x: 0,
list: vec![],
});
let mutable = result.get_mut();
let mut list = vec![];
mutable.x = 100;
for i in 0..100 {
mutable.list.push(i);
list.push(i);
}
assert_eq!(result.get().x, 100); // OK
assert_eq!(result.get().list, list); // OK
assert_eq!(result.get_mut().x, 100); // OK
assert_eq!(result.get_mut().list, list); // OK
// Mutable Parallel/Async
let result = SuperCell::new(10);
thread::scope(|x| {
let reference = result.get_mut();
let handle = x.spawn(|| {
sleep(Duration::from_millis(10));
*reference = 11;
});
assert_eq!(*result.get(), 10); // OK
assert_eq!(*result.get_mut(), 10); // OK
handle.join().expect("Failed to join thread!");
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
});
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
}
Dependencies
~155KB