diff options
Diffstat (limited to 'src/util/tracker.rs')
-rw-r--r-- | src/util/tracker.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/util/tracker.rs b/src/util/tracker.rs new file mode 100644 index 0000000..66c30a9 --- /dev/null +++ b/src/util/tracker.rs @@ -0,0 +1,41 @@ +pub struct Tracker<T> { + inner: T, + dirty: bool, +} + +/// Tracks changes to an inner value T. Any change using `set` will cause the +/// tracker to be marked as dirty. +impl<T> Tracker<T> { + pub fn new(inner: T) -> Self { + Self { inner, dirty: true } + } + + pub fn get(&self) -> &T { + &self.inner + } + + pub fn get_mut(&mut self) -> &mut T { + self.dirty = true; + &mut self.inner + } + + pub fn set(&mut self, value: T) { + self.dirty = true; + self.inner = value; + } + + pub fn is_dirty(&self) -> bool { + self.dirty + } + + /// Marks the tracker as clean. + pub fn reset(&mut self) { + self.dirty = false; + } +} + +impl<T: Default> Default for Tracker<T> { + fn default() -> Self { + Self::new(T::default()) + } +} |