clone_cell provides a Cell implementation that works with types whose Clone
implementations are guaranteed not to mutate the Cell content through the &self
reference. This is enforced with the provided PureClone trait, which is a subtrait
of Clone (and a logical supertrait of Copy). It is only implemented for types
with compliant clone methods.
The Cell implementation provided by this crate is intended to be a drop-in
replacement of std::cell::Cell. It can work with types that behave like values,
such as Rc<T>, Weak<T> (shared pointers themselves are like values; it is the
pointees that behave like references), Option<T: PureClone>, and more. Some
motivating use cases include implementing the observer pattern and combining Cell
with clone-on-write or immutable collections to enable efficient sharing of data
structures.
PureClone is currently implemented for the following types:
- All primitives such as i32, usize, f64, etc;
- Rc<T> and Weak<T>;
- Option<T: PureClone>; and
- Tuples: (A: PureClone, ...).
See [PureClone] for a complete list.
In this example below, we store an Rc<T> in a Cell and later retrieve a copy of it.
```rust
let x = Cell::new(Rc::new(0));
x.set(Rc::new(42));
assert_eq!(*x.get(), 42); ```
See the documentation for [Cell] for more.
std::cell::Cell, this Cell is !Sync.PureClone is currently only implemented for some types from the standard library. I hope to support user types as well with a proc macro so that one can automatically derive PureClone for types when they only contain fields that are PureClone:
```rust
// Not supported yet!
struct Foo { x: i32, }
let f = Cell::new(Foo { x: 0 }); f.set(Foo { x: 42 });
assert_eq!(f.get().x, 42); ```
I believe this is sound, because PureClone is unsafe to implement. This trait is implemented for:
- Copy types;
- Types that perform a shallow clone such as Rc and Weak; and
- Types whose clone methods are otherwise known to be safe, such as compound types that only contain PureClone types.
See the [documentation] for more information. Please let me know if you find any soundness issues!
Pull requests are welcome and any feedback is appreciated!