1
0
Fork 0
forked from wry/wry
wry/src/utils/double_buffered.rs
2024-09-09 11:14:39 +02:00

36 lines
695 B
Rust

use std::{cell::Cell, ops::Deref};
#[derive(Default)]
pub struct DoubleBuffered<T> {
bufs: [T; 2],
front: Cell<usize>,
}
impl<T> DoubleBuffered<T> {
pub fn new(bufs: [T; 2]) -> Self {
Self {
bufs,
front: Cell::new(0),
}
}
pub fn front(&self) -> &T {
unsafe { self.bufs.get_unchecked(self.front.get()) }
}
pub fn back(&self) -> &T {
unsafe { self.bufs.get_unchecked(1 - self.front.get()) }
}
pub fn flip(&self) {
self.front.set(1 - self.front.get());
}
}
impl<T> Deref for DoubleBuffered<T> {
type Target = [T; 2];
fn deref(&self) -> &Self::Target {
&self.bufs
}
}