@@ -12,118 +12,14 @@ use std::ptr;
1212// Encoder
1313// -----------------------------------------------------------------------------
1414
15- pub struct MemEncoder {
16- pub data : Vec < u8 > ,
17- }
18-
19- impl MemEncoder {
20- pub fn new ( ) -> MemEncoder {
21- MemEncoder { data : vec ! [ ] }
22- }
23-
24- #[ inline]
25- pub fn position ( & self ) -> usize {
26- self . data . len ( )
27- }
28-
29- pub fn finish ( self ) -> Vec < u8 > {
30- self . data
31- }
32- }
33-
34- macro_rules! write_leb128 {
35- ( $enc: expr, $value: expr, $int_ty: ty, $fun: ident) => { {
36- const MAX_ENCODED_LEN : usize = $crate:: leb128:: max_leb128_len:: <$int_ty>( ) ;
37- let old_len = $enc. data. len( ) ;
38-
39- if MAX_ENCODED_LEN > $enc. data. capacity( ) - old_len {
40- $enc. data. reserve( MAX_ENCODED_LEN ) ;
41- }
42-
43- // SAFETY: The above check and `reserve` ensures that there is enough
44- // room to write the encoded value to the vector's internal buffer.
45- unsafe {
46- let buf = & mut * ( $enc. data. as_mut_ptr( ) . add( old_len)
47- as * mut [ MaybeUninit <u8 >; MAX_ENCODED_LEN ] ) ;
48- let encoded = leb128:: $fun( buf, $value) ;
49- $enc. data. set_len( old_len + encoded. len( ) ) ;
50- }
51- } } ;
52- }
53-
54- impl Encoder for MemEncoder {
55- #[ inline]
56- fn emit_usize ( & mut self , v : usize ) {
57- write_leb128 ! ( self , v, usize , write_usize_leb128)
58- }
59-
60- #[ inline]
61- fn emit_u128 ( & mut self , v : u128 ) {
62- write_leb128 ! ( self , v, u128 , write_u128_leb128) ;
63- }
64-
65- #[ inline]
66- fn emit_u64 ( & mut self , v : u64 ) {
67- write_leb128 ! ( self , v, u64 , write_u64_leb128) ;
68- }
69-
70- #[ inline]
71- fn emit_u32 ( & mut self , v : u32 ) {
72- write_leb128 ! ( self , v, u32 , write_u32_leb128) ;
73- }
74-
75- #[ inline]
76- fn emit_u16 ( & mut self , v : u16 ) {
77- self . data . extend_from_slice ( & v. to_le_bytes ( ) ) ;
78- }
79-
80- #[ inline]
81- fn emit_u8 ( & mut self , v : u8 ) {
82- self . data . push ( v) ;
83- }
84-
85- #[ inline]
86- fn emit_isize ( & mut self , v : isize ) {
87- write_leb128 ! ( self , v, isize , write_isize_leb128)
88- }
89-
90- #[ inline]
91- fn emit_i128 ( & mut self , v : i128 ) {
92- write_leb128 ! ( self , v, i128 , write_i128_leb128)
93- }
94-
95- #[ inline]
96- fn emit_i64 ( & mut self , v : i64 ) {
97- write_leb128 ! ( self , v, i64 , write_i64_leb128)
98- }
99-
100- #[ inline]
101- fn emit_i32 ( & mut self , v : i32 ) {
102- write_leb128 ! ( self , v, i32 , write_i32_leb128)
103- }
104-
105- #[ inline]
106- fn emit_i16 ( & mut self , v : i16 ) {
107- self . data . extend_from_slice ( & v. to_le_bytes ( ) ) ;
108- }
109-
110- #[ inline]
111- fn emit_raw_bytes ( & mut self , s : & [ u8 ] ) {
112- self . data . extend_from_slice ( s) ;
113- }
114- }
115-
11615pub type FileEncodeResult = Result < usize , io:: Error > ;
11716
11817/// `FileEncoder` encodes data to file via fixed-size buffer.
11918///
120- /// When encoding large amounts of data to a file, using `FileEncoder` may be
121- /// preferred over using `MemEncoder` to encode to a `Vec`, and then writing the
122- /// `Vec` to file, as the latter uses as much memory as there is encoded data,
123- /// while the former uses the fixed amount of memory allocated to the buffer.
124- /// `FileEncoder` also has the advantage of not needing to reallocate as data
125- /// is appended to it, but the disadvantage of requiring more error handling,
126- /// which has some runtime overhead.
19+ /// There used to be a `MemEncoder` type that encoded all the data into a
20+ /// `Vec`. `FileEncoder` is better because its memory use is determined by the
21+ /// size of the buffer, rather than the full length of the encoded data, and
22+ /// because it doesn't need to reallocate memory along the way.
12723pub struct FileEncoder {
12824 /// The input buffer. For adequate performance, we need more control over
12925 /// buffering than `BufWriter` offers. If `BufWriter` ever offers a raw
@@ -645,13 +541,6 @@ impl<'a> Decoder for MemDecoder<'a> {
645541
646542// Specialize encoding byte slices. This specialization also applies to encoding `Vec<u8>`s, etc.,
647543// since the default implementations call `encode` on their slices internally.
648- impl Encodable < MemEncoder > for [ u8 ] {
649- fn encode ( & self , e : & mut MemEncoder ) {
650- Encoder :: emit_usize ( e, self . len ( ) ) ;
651- e. emit_raw_bytes ( self ) ;
652- }
653- }
654-
655544impl Encodable < FileEncoder > for [ u8 ] {
656545 fn encode ( & self , e : & mut FileEncoder ) {
657546 Encoder :: emit_usize ( e, self . len ( ) ) ;
@@ -675,16 +564,6 @@ impl IntEncodedWithFixedSize {
675564 pub const ENCODED_SIZE : usize = 8 ;
676565}
677566
678- impl Encodable < MemEncoder > for IntEncodedWithFixedSize {
679- #[ inline]
680- fn encode ( & self , e : & mut MemEncoder ) {
681- let _start_pos = e. position ( ) ;
682- e. emit_raw_bytes ( & self . 0 . to_le_bytes ( ) ) ;
683- let _end_pos = e. position ( ) ;
684- debug_assert_eq ! ( ( _end_pos - _start_pos) , IntEncodedWithFixedSize :: ENCODED_SIZE ) ;
685- }
686- }
687-
688567impl Encodable < FileEncoder > for IntEncodedWithFixedSize {
689568 #[ inline]
690569 fn encode ( & self , e : & mut FileEncoder ) {
0 commit comments