use super::{BufWriter, File};
use std::ops::{Deref, DerefMut};
pub(super) struct BufferedWriter {
writer: Option<BufWriter<File>>,
discard_on_drop: bool,
}
impl BufferedWriter {
pub(super) fn new(capacity: usize, file: File, discard_on_drop: bool) -> Self {
Self {
writer: Some(BufWriter::with_capacity(capacity, file)),
discard_on_drop,
}
}
}
impl Deref for BufferedWriter {
type Target = BufWriter<File>;
fn deref(&self) -> &Self::Target {
self.writer
.as_ref()
.expect("descriptor writer is present until drop")
}
}
impl DerefMut for BufferedWriter {
fn deref_mut(&mut self) -> &mut Self::Target {
self.writer
.as_mut()
.expect("descriptor writer is present until drop")
}
}
impl Drop for BufferedWriter {
fn drop(&mut self) {
if self.discard_on_drop {
let writer = self.writer.take().expect("descriptor writer is present");
let (file, buffer) = writer.into_parts();
drop(buffer);
drop(file);
}
}
}
#[cfg(all(test, unix))]
mod tests;