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
use std::cell::{Cell, Ref, RefCell, RefMut}; pub trait CheckSet<T> { fn check_set(&self, value: T) -> bool; } pub struct CloneCell<T: Clone> { inner: RefCell<T>, } impl<T: Clone> CloneCell<T> { pub fn new(value: T) -> Self { CloneCell { inner: RefCell::new(value) } } pub fn borrow(&self) -> Ref<T> { self.inner.borrow() } pub fn borrow_mut(&self) -> RefMut<T> { self.inner.borrow_mut() } pub fn get(&self) -> T { self.inner.borrow().clone() } pub fn set(&self, value: T) { *self.inner.borrow_mut() = value; } } impl<T: Copy> CheckSet<T> for Cell<T> where T: PartialOrd { fn check_set(&self, value: T) -> bool { if value != self.get() { self.set(value); true } else { false } } } impl<T: Copy> CheckSet<T> for CloneCell<T> where T: PartialOrd { fn check_set(&self, value: T) -> bool { let mut borrow = self.inner.borrow_mut(); if value != *borrow { *borrow = value; true } else { false } } }