Struct rustc_serialize::opaque::FileEncoder
source · pub struct FileEncoder {
buf: Box<[u8; 8192]>,
buffered: usize,
flushed: usize,
file: File,
res: Result<(), Error>,
path: PathBuf,
finished: bool,
}
Expand description
FileEncoder
encodes data to file via fixed-size buffer.
There used to be a MemEncoder
type that encoded all the data into a
Vec
. FileEncoder
is better because its memory use is determined by the
size of the buffer, rather than the full length of the encoded data, and
because it doesn’t need to reallocate memory along the way.
Fields§
§buf: Box<[u8; 8192]>
§buffered: usize
§flushed: usize
§file: File
§res: Result<(), Error>
§path: PathBuf
§finished: bool
Implementations§
source§impl FileEncoder
impl FileEncoder
pub fn new<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn position(&self) -> usize
pub fn flush(&mut self)
pub fn file(&self) -> &File
pub fn path(&self) -> &Path
fn buffer_empty(&mut self) -> &mut [u8] ⓘ
fn write_all_cold_path(&mut self, buf: &[u8])
fn write_all(&mut self, buf: &[u8])
sourcepub fn write_with<const N: usize>(
&mut self,
visitor: impl FnOnce(&mut [u8; N]) -> usize,
)
pub fn write_with<const N: usize>( &mut self, visitor: impl FnOnce(&mut [u8; N]) -> usize, )
Write up to N
bytes to this encoder.
This function can be used to avoid the overhead of calling memcpy for writes that have runtime-variable length, but are small and have a small fixed upper bound.
This can be used to do in-place encoding as is done for leb128 (without this function
we would need to write to a temporary buffer then memcpy into the encoder), and it can
also be used to implement the varint scheme we use for rmeta and dep graph encoding,
where we only want to encode the first few bytes of an integer. Copying in the whole
integer then only advancing the encoder state for the few bytes we care about is more
efficient than calling FileEncoder::write_all
, because variable-size copies are
always lowered to memcpy
, which has overhead and contains a lot of logic we can bypass
with this function. Note that common architectures support fixed-size writes up to 8 bytes
with one instruction, so while this does in some sense do wasted work, we come out ahead.
fn panic_invalid_write<const N: usize>(written: usize)
sourcepub fn write_array<const N: usize>(&mut self, buf: [u8; N])
pub fn write_array<const N: usize>(&mut self, buf: [u8; N])
Helper for calls where FileEncoder::write_with
always writes the whole array.
pub fn finish(&mut self) -> FileEncodeResult
Trait Implementations§
source§impl Drop for FileEncoder
impl Drop for FileEncoder
source§impl Encodable<FileEncoder> for [u8]
impl Encodable<FileEncoder> for [u8]
fn encode(&self, e: &mut FileEncoder)
source§impl Encodable<FileEncoder> for IntEncodedWithFixedSize
impl Encodable<FileEncoder> for IntEncodedWithFixedSize
fn encode(&self, e: &mut FileEncoder)
source§impl Encoder for FileEncoder
impl Encoder for FileEncoder
fn emit_usize(&mut self, v: usize)
fn emit_u128(&mut self, v: u128)
fn emit_u64(&mut self, v: u64)
fn emit_u32(&mut self, v: u32)
fn emit_u16(&mut self, v: u16)
fn emit_u8(&mut self, v: u8)
fn emit_isize(&mut self, v: isize)
fn emit_i128(&mut self, v: i128)
fn emit_i64(&mut self, v: i64)
fn emit_i32(&mut self, v: i32)
fn emit_i16(&mut self, v: i16)
fn emit_raw_bytes(&mut self, s: &[u8])
fn emit_i8(&mut self, v: i8)
fn emit_bool(&mut self, v: bool)
fn emit_char(&mut self, v: char)
fn emit_str(&mut self, v: &str)
Auto Trait Implementations§
impl Freeze for FileEncoder
impl !RefUnwindSafe for FileEncoder
impl Send for FileEncoder
impl Sync for FileEncoder
impl Unpin for FileEncoder
impl !UnwindSafe for FileEncoder
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pointable for T
impl<T> Pointable for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 64 bytes