@@ -12,118 +12,14 @@ use std::ptr;
12
12
// Encoder
13
13
// -----------------------------------------------------------------------------
14
14
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
-
116
15
pub type FileEncodeResult = Result < usize , io:: Error > ;
117
16
118
17
/// `FileEncoder` encodes data to file via fixed-size buffer.
119
18
///
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.
127
23
pub struct FileEncoder {
128
24
/// The input buffer. For adequate performance, we need more control over
129
25
/// buffering than `BufWriter` offers. If `BufWriter` ever offers a raw
@@ -645,13 +541,6 @@ impl<'a> Decoder for MemDecoder<'a> {
645
541
646
542
// Specialize encoding byte slices. This specialization also applies to encoding `Vec<u8>`s, etc.,
647
543
// 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
-
655
544
impl Encodable < FileEncoder > for [ u8 ] {
656
545
fn encode ( & self , e : & mut FileEncoder ) {
657
546
Encoder :: emit_usize ( e, self . len ( ) ) ;
@@ -675,16 +564,6 @@ impl IntEncodedWithFixedSize {
675
564
pub const ENCODED_SIZE : usize = 8 ;
676
565
}
677
566
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
-
688
567
impl Encodable < FileEncoder > for IntEncodedWithFixedSize {
689
568
#[ inline]
690
569
fn encode ( & self , e : & mut FileEncoder ) {
0 commit comments