pub struct BitWriter<W: Write, E: Endianness> { /* private fields */ }Expand description
For writing bit values to an underlying stream in a given endianness.
Because this only writes whole bytes to the underlying stream, it is important that output is byte-aligned before the bitstream writer’s lifetime ends. Partial bytes will be lost if the writer is disposed of before they can be written.
Implementations§
Source§impl<W: Write, E: Endianness> BitWriter<W, E>
 
impl<W: Write, E: Endianness> BitWriter<W, E>
Sourcepub fn new(writer: W) -> BitWriter<W, E>
 
pub fn new(writer: W) -> BitWriter<W, E>
Wraps a BitWriter around something that implements Write
Sourcepub fn endian(writer: W, _endian: E) -> BitWriter<W, E>
 
pub fn endian(writer: W, _endian: E) -> BitWriter<W, E>
Wraps a BitWriter around something that implements Write
with the given endianness.
Examples found in repository?
87fn main() {
88    let mut flac: Vec<u8> = Vec::new();
89
90    let mut writer = BitWriter::endian(&mut flac, BigEndian);
91
92    // stream marker
93    writer.write_bytes(b"fLaC").unwrap();
94
95    // metadata block header
96    writer
97        .build(&BlockHeader {
98            last_block: false,
99            block_type: 0,
100            block_size: 34,
101        })
102        .unwrap();
103
104    // STREAMINFO block
105    writer
106        .build(&Streaminfo {
107            minimum_block_size: 4096,
108            maximum_block_size: 4096,
109            minimum_frame_size: 1542,
110            maximum_frame_size: 8546,
111            sample_rate: 44100,
112            channels: NonZero::new(2).unwrap(),
113            bits_per_sample: NonZero::new(16).unwrap(),
114            total_samples: 304844,
115            md5: *b"\xFA\xF2\x69\x2F\xFD\xEC\x2D\x5B\x30\x01\x76\xB4\x62\x88\x7D\x92",
116        })
117        .unwrap();
118
119    let comment = VorbisComment {
120        vendor: "reference libFLAC 1.1.4 20070213".to_string(),
121        comment: vec![
122            "title=2ch 44100  16bit".to_string(),
123            "album=Test Album".to_string(),
124            "artist=Assorted".to_string(),
125            "tracknumber=1".to_string(),
126        ],
127    };
128
129    // metadata block header
130    writer
131        .build(&BlockHeader {
132            last_block: false,
133            block_type: 4,
134            block_size: comment.len().try_into().unwrap(),
135        })
136        .unwrap();
137
138    // VORBIS_COMMENT block (little endian)
139    comment
140        .write(&mut ByteWriter::new(writer.writer().unwrap()))
141        .unwrap();
142
143    assert_eq!(flac, include_bytes!("data/metadata-only.flac"));
144}Sourcepub fn into_writer(self) -> W
 
pub fn into_writer(self) -> W
Unwraps internal writer and disposes of BitWriter.
§Warning
Any unwritten partial bits are discarded.
Sourcepub fn writer(&mut self) -> Option<&mut W>
 
pub fn writer(&mut self) -> Option<&mut W>
If stream is byte-aligned, provides mutable reference
to internal writer.  Otherwise returns None
Examples found in repository?
87fn main() {
88    let mut flac: Vec<u8> = Vec::new();
89
90    let mut writer = BitWriter::endian(&mut flac, BigEndian);
91
92    // stream marker
93    writer.write_bytes(b"fLaC").unwrap();
94
95    // metadata block header
96    writer
97        .build(&BlockHeader {
98            last_block: false,
99            block_type: 0,
100            block_size: 34,
101        })
102        .unwrap();
103
104    // STREAMINFO block
105    writer
106        .build(&Streaminfo {
107            minimum_block_size: 4096,
108            maximum_block_size: 4096,
109            minimum_frame_size: 1542,
110            maximum_frame_size: 8546,
111            sample_rate: 44100,
112            channels: NonZero::new(2).unwrap(),
113            bits_per_sample: NonZero::new(16).unwrap(),
114            total_samples: 304844,
115            md5: *b"\xFA\xF2\x69\x2F\xFD\xEC\x2D\x5B\x30\x01\x76\xB4\x62\x88\x7D\x92",
116        })
117        .unwrap();
118
119    let comment = VorbisComment {
120        vendor: "reference libFLAC 1.1.4 20070213".to_string(),
121        comment: vec![
122            "title=2ch 44100  16bit".to_string(),
123            "album=Test Album".to_string(),
124            "artist=Assorted".to_string(),
125            "tracknumber=1".to_string(),
126        ],
127    };
128
129    // metadata block header
130    writer
131        .build(&BlockHeader {
132            last_block: false,
133            block_type: 4,
134            block_size: comment.len().try_into().unwrap(),
135        })
136        .unwrap();
137
138    // VORBIS_COMMENT block (little endian)
139    comment
140        .write(&mut ByteWriter::new(writer.writer().unwrap()))
141        .unwrap();
142
143    assert_eq!(flac, include_bytes!("data/metadata-only.flac"));
144}Sourcepub fn aligned_writer(&mut self) -> Result<&mut W>
 
pub fn aligned_writer(&mut self) -> Result<&mut W>
Returns byte-aligned mutable reference to internal writer.
Bytes aligns stream if it is not already aligned.
§Errors
Passes along any I/O error from the underlying stream.
Sourcepub fn into_bytewriter(self) -> ByteWriter<W, E>
 
pub fn into_bytewriter(self) -> ByteWriter<W, E>
Converts BitWriter to ByteWriter in the same endianness.
§Warning
Any written partial bits are discarded.
Sourcepub fn bytewriter(&mut self) -> Option<ByteWriter<&mut W, E>>
 
pub fn bytewriter(&mut self) -> Option<ByteWriter<&mut W, E>>
If stream is byte-aligned, provides temporary ByteWriter
in the same endianness.  Otherwise returns None
§Warning
Any unwritten bits left over when ByteWriter is dropped are lost.
Trait Implementations§
Source§impl<W: Write, E: Endianness> BitWrite for BitWriter<W, E>
 
impl<W: Write, E: Endianness> BitWrite for BitWriter<W, E>
Source§fn write_unsigned<const BITS: u32, U>(&mut self, value: U) -> Result<()>where
    U: UnsignedInteger,
 
fn write_unsigned<const BITS: u32, U>(&mut self, value: U) -> Result<()>where
    U: UnsignedInteger,
Source§fn write_unsigned_counted<const BITS: u32, U>(
    &mut self,
    count: BitCount<BITS>,
    value: U,
) -> Result<()>where
    U: UnsignedInteger,
 
fn write_unsigned_counted<const BITS: u32, U>(
    &mut self,
    count: BitCount<BITS>,
    value: U,
) -> Result<()>where
    U: UnsignedInteger,
Source§fn write_signed_counted<const BITS: u32, S>(
    &mut self,
    bits: impl TryInto<SignedBitCount<BITS>>,
    value: S,
) -> Result<()>where
    S: SignedInteger,
 
fn write_signed_counted<const BITS: u32, S>(
    &mut self,
    bits: impl TryInto<SignedBitCount<BITS>>,
    value: S,
) -> Result<()>where
    S: SignedInteger,
Source§fn write_signed<const BITS: u32, S>(&mut self, value: S) -> Result<()>where
    S: SignedInteger,
 
fn write_signed<const BITS: u32, S>(&mut self, value: S) -> Result<()>where
    S: SignedInteger,
Source§fn write_from<V>(&mut self, value: V) -> Result<()>where
    V: Primitive,
 
fn write_from<V>(&mut self, value: V) -> Result<()>where
    V: Primitive,
Source§fn write_as_from<F, V>(&mut self, value: V) -> Result<()>where
    F: Endianness,
    V: Primitive,
 
fn write_as_from<F, V>(&mut self, value: V) -> Result<()>where
    F: Endianness,
    V: Primitive,
Source§fn write_checked<C: Checkable>(&mut self, value: C) -> Result<()>
 
fn write_checked<C: Checkable>(&mut self, value: C) -> Result<()>
Source§fn write_bytes(&mut self, buf: &[u8]) -> Result<()>
 
fn write_bytes(&mut self, buf: &[u8]) -> Result<()>
Source§fn byte_aligned(&self) -> bool
 
fn byte_aligned(&self) -> bool
Source§fn write<const BITS: u32, I>(&mut self, value: I) -> Result<()>where
    I: Integer,
 
fn write<const BITS: u32, I>(&mut self, value: I) -> Result<()>where
    I: Integer,
Source§fn write_var<I>(&mut self, bits: u32, value: I) -> Result<()>where
    I: Integer,
 
fn write_var<I>(&mut self, bits: u32, value: I) -> Result<()>where
    I: Integer,
Source§fn write_unsigned_var<U>(&mut self, bits: u32, value: U) -> Result<()>where
    U: UnsignedInteger,
 
fn write_unsigned_var<U>(&mut self, bits: u32, value: U) -> Result<()>where
    U: UnsignedInteger,
Source§fn write_signed_var<S>(&mut self, bits: u32, value: S) -> Result<()>where
    S: SignedInteger,
 
fn write_signed_var<S>(&mut self, bits: u32, value: S) -> Result<()>where
    S: SignedInteger,
Source§fn write_count<const MAX: u32>(&mut self, _: BitCount<MAX>) -> Result<()>
 
fn write_count<const MAX: u32>(&mut self, _: BitCount<MAX>) -> Result<()>
Source§fn write_counted<const MAX: u32, I>(
    &mut self,
    bits: BitCount<MAX>,
    value: I,
) -> Result<()>
 
fn write_counted<const MAX: u32, I>( &mut self, bits: BitCount<MAX>, value: I, ) -> Result<()>
Source§fn write_const<const BITS: u32, const VALUE: u32>(&mut self) -> Result<()>
 
fn write_const<const BITS: u32, const VALUE: u32>(&mut self) -> Result<()>
Source§fn pad(&mut self, bits: u32) -> Result<()>
 
fn pad(&mut self, bits: u32) -> Result<()>
Source§fn write_unary<const STOP_BIT: u8>(&mut self, value: u32) -> Result<()>
 
fn write_unary<const STOP_BIT: u8>(&mut self, value: u32) -> Result<()>
value number of non STOP_BIT bits to the stream
and then writes a STOP_BIT.  This field is variably-sized.
STOP_BIT must be 0 or 1. Read moreSource§fn build<T: ToBitStream>(&mut self, build: &T) -> Result<(), T::Error>
 
fn build<T: ToBitStream>(&mut self, build: &T) -> Result<(), T::Error>
Source§fn build_with<'a, T: ToBitStreamWith<'a>>(
    &mut self,
    build: &T,
    context: &T::Context,
) -> Result<(), T::Error>
 
fn build_with<'a, T: ToBitStreamWith<'a>>( &mut self, build: &T, context: &T::Context, ) -> Result<(), T::Error>
Source§fn build_using<T: ToBitStreamUsing>(
    &mut self,
    build: &T,
    context: T::Context,
) -> Result<(), T::Error>
 
fn build_using<T: ToBitStreamUsing>( &mut self, build: &T, context: T::Context, ) -> Result<(), T::Error>
Source§fn byte_align(&mut self) -> Result<()>
 
fn byte_align(&mut self) -> Result<()>
Source§fn write_huffman<T>(&mut self, value: T::Symbol) -> Result<()>where
    T: ToBits,
 
fn write_huffman<T>(&mut self, value: T::Symbol) -> Result<()>where
    T: ToBits,
Source§fn write_unsigned_vbr<const FIELD_SIZE: u32, U: UnsignedInteger>(
    &mut self,
    value: U,
) -> Result<()>
 
fn write_unsigned_vbr<const FIELD_SIZE: u32, U: UnsignedInteger>( &mut self, value: U, ) -> Result<()>
Source§fn write_signed_vbr<const FIELD_SIZE: u32, I: SignedInteger>(
    &mut self,
    value: I,
) -> Result<()>
 
fn write_signed_vbr<const FIELD_SIZE: u32, I: SignedInteger>( &mut self, value: I, ) -> Result<()>
Auto Trait Implementations§
impl<W, E> Freeze for BitWriter<W, E>where
    W: Freeze,
impl<W, E> RefUnwindSafe for BitWriter<W, E>where
    W: RefUnwindSafe,
    E: RefUnwindSafe,
impl<W, E> Send for BitWriter<W, E>
impl<W, E> Sync for BitWriter<W, E>
impl<W, E> Unpin for BitWriter<W, E>
impl<W, E> UnwindSafe for BitWriter<W, E>where
    W: UnwindSafe,
    E: UnwindSafe,
Blanket Implementations§
Source§impl<W> BitWrite2 for Wwhere
    W: BitWrite,
 
impl<W> BitWrite2 for Wwhere
    W: BitWrite,
Source§fn write<I>(&mut self, bits: u32, value: I) -> Result<(), Error>where
    I: Integer,
 
fn write<I>(&mut self, bits: u32, value: I) -> Result<(), Error>where
    I: Integer,
Source§fn write_out<const BITS: u32, I>(&mut self, value: I) -> Result<(), Error>where
    I: Integer,
 
fn write_out<const BITS: u32, I>(&mut self, value: I) -> Result<(), Error>where
    I: Integer,
Source§fn write_unsigned<U>(&mut self, bits: u32, value: U) -> Result<(), Error>where
    U: UnsignedInteger,
 
fn write_unsigned<U>(&mut self, bits: u32, value: U) -> Result<(), Error>where
    U: UnsignedInteger,
Source§fn write_unsigned_out<const BITS: u32, U>(
    &mut self,
    value: U,
) -> Result<(), Error>where
    U: UnsignedInteger,
 
fn write_unsigned_out<const BITS: u32, U>(
    &mut self,
    value: U,
) -> Result<(), Error>where
    U: UnsignedInteger,
Source§fn write_signed<S>(&mut self, bits: u32, value: S) -> Result<(), Error>where
    S: SignedInteger,
 
fn write_signed<S>(&mut self, bits: u32, value: S) -> Result<(), Error>where
    S: SignedInteger,
Source§fn write_signed_out<const BITS: u32, S>(
    &mut self,
    value: S,
) -> Result<(), Error>where
    S: SignedInteger,
 
fn write_signed_out<const BITS: u32, S>(
    &mut self,
    value: S,
) -> Result<(), Error>where
    S: SignedInteger,
Source§fn write_from<V>(&mut self, value: V) -> Result<(), Error>where
    V: Primitive,
 
fn write_from<V>(&mut self, value: V) -> Result<(), Error>where
    V: Primitive,
Source§fn write_as_from<F, V>(&mut self, value: V) -> Result<(), Error>where
    F: Endianness,
    V: Primitive,
 
fn write_as_from<F, V>(&mut self, value: V) -> Result<(), Error>where
    F: Endianness,
    V: Primitive,
Source§fn pad(&mut self, bits: u32) -> Result<(), Error>
 
fn pad(&mut self, bits: u32) -> Result<(), Error>
Source§fn write_bytes(&mut self, buf: &[u8]) -> Result<(), Error>
 
fn write_bytes(&mut self, buf: &[u8]) -> Result<(), Error>
Source§fn write_unary0(&mut self, value: u32) -> Result<(), Error>
 
fn write_unary0(&mut self, value: u32) -> Result<(), Error>
value number of 1 bits to the stream
and then writes a 0 bit.  This field is variably-sized. Read moreSource§fn write_unary1(&mut self, value: u32) -> Result<(), Error>
 
fn write_unary1(&mut self, value: u32) -> Result<(), Error>
value number of 0 bits to the stream
and then writes a 1 bit.  This field is variably-sized. Read more