Expand description
A generic double-buffer.
§Description
A generic double-buffer for anything that implements Clone
.
§Usage
DoubleBuffered
implements Default
so long as the type being double-buffered
does.
use dubble::DoubleBuffered;
let mut my_buf = DoubleBuffered::<i32>::default();
Otherwise, you can use a Fn() -> T
to construct the value in each buffer.
let mut my_buf = DoubleBuffered::construct_with(Vec::<i32>::new);
A longer example usage is shown below.
// creating a buffer using a closure to initialise the buffers
let mut my_buf = DoubleBuffered::construct_with(||
{
let mut s = String::new();
s.push_str("hello,");
s
});
// writing to the buffer
{
// creates a mutable reference to the write buffer
let mut wb = my_buf.write();
wb.push_str(" world!");
}
// NB: DoubleBuffer implements DerefMut, so we could also use the
// `push_str` method of `String` directly, like so.
my_buf.push_str(" Hello again!");
// reading from the buffer
// note: the read half of the buffer should not have updated yet
assert!(my_buf.read() == "hello,");
// updating the buffer
// other half of the buffer has been updated
// NB: DoubleBuffer implements Deref, so we could use the dereference operator
// here as well
my_buf.update();
assert!(*my_buf == "hello, world! Hello again!");
§Notes
§Default
DoubleBuffered
implements Default
so long as the type being buffered
implements it. For example, if you needed a double-buffered i32
:
use dubble::DoubleBuffered;
let my_buf: DoubleBuffered<i32> = DoubleBuffered::default();
§Deref
and DerefMut
An important note on the impl
s for each of these is that Deref
will
dereference to the read buffer while DerefMut
will dereference to the
write buffer. So, if you did *my_buf = 3
followed by assert(*my_buf == 3)
,
you’d find that the assertion would fail.
*my_buf = 3;
assert!(*my_buf == 3);
In other words, Deref
behaves as if you had called my_buf.read()
, and
DerefMut
behaves as if you had called my_buf.write()
.
Structs§
- Double
Buffered - Represents something that is double-buffered. The type being buffered must
be
Clone
, so that the read buffer can be updated with the contents of the write buffer during the update.