Struct ra_ap_rustc_serialize::opaque::FileEncoder
source · pub struct FileEncoder { /* private fields */ }
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.
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
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.
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.