From 80310f4c0de755c6cb4795a04ba8ba35571fecbc Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sun, 8 Sep 2024 09:23:02 +0200 Subject: [PATCH] utils: add DoubleBuffered --- src/utils.rs | 1 + src/utils/double_buffered.rs | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/utils/double_buffered.rs diff --git a/src/utils.rs b/src/utils.rs index 9aed5327..a5c94ee7 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -12,6 +12,7 @@ pub mod clone3; pub mod clonecell; pub mod copyhashmap; pub mod debug_fn; +pub mod double_buffered; pub mod double_click_state; pub mod errorfmt; pub mod event_listener; diff --git a/src/utils/double_buffered.rs b/src/utils/double_buffered.rs new file mode 100644 index 00000000..6a60f783 --- /dev/null +++ b/src/utils/double_buffered.rs @@ -0,0 +1,40 @@ +use std::{cell::Cell, ops::Deref}; + +#[derive(Default)] +pub struct DoubleBuffered { + bufs: [T; 2], + front: Cell, +} + +impl DoubleBuffered { + #[expect(dead_code)] + pub fn new(bufs: [T; 2]) -> Self { + Self { + bufs, + front: Cell::new(0), + } + } + + #[expect(dead_code)] + pub fn front(&self) -> &T { + unsafe { self.bufs.get_unchecked(self.front.get()) } + } + + #[expect(dead_code)] + pub fn back(&self) -> &T { + unsafe { self.bufs.get_unchecked(1 - self.front.get()) } + } + + #[expect(dead_code)] + pub fn flip(&self) { + self.front.set(1 - self.front.get()); + } +} + +impl Deref for DoubleBuffered { + type Target = [T; 2]; + + fn deref(&self) -> &Self::Target { + &self.bufs + } +}