@@ -6,7 +6,7 @@ pub mod buffer;
6
6
/// Additionally, this stores the contents serialized into a buffer, which does
7
7
/// not require allocation and could speed things up.
8
8
pub trait Serialize {
9
- fn encode < ' buf > ( & self , write_buf : & ' buf mut [ u8 ] ) -> Store < ' buf > ;
9
+ fn encode < ' buf > ( & self , write_buf : & ' buf mut [ u8 ] ) -> ( Store < ' buf > , & ' buf mut [ u8 ] ) ;
10
10
fn decode ( read_buf : & [ u8 ] ) -> ( String , & [ u8 ] ) ;
11
11
fn buffer_size_required ( & self ) -> usize ;
12
12
}
@@ -45,13 +45,12 @@ impl Display for Store<'_> {
45
45
macro_rules! gen_serialize {
46
46
( $primitive: ty) => {
47
47
impl Serialize for $primitive {
48
- fn encode<' buf>( & self , write_buf: & ' buf mut [ u8 ] ) -> Store <' buf> {
49
- assert!( std:: mem:: size_of:: <$primitive>( ) == write_buf. len( ) ) ;
50
-
51
- let size = std:: mem:: size_of:: <$primitive>( ) ;
52
- let ( x, _) = write_buf. split_at_mut( size) ;
48
+ fn encode<' buf>( & self , write_buf: & ' buf mut [ u8 ] ) -> ( Store <' buf>, & ' buf mut [ u8 ] ) {
49
+ let size = self . buffer_size_required( ) ;
50
+ let ( x, rest) = write_buf. split_at_mut( size) ;
53
51
x. copy_from_slice( & self . to_le_bytes( ) ) ;
54
- Store :: new( Self :: decode, x)
52
+
53
+ ( Store :: new( Self :: decode, x) , rest)
55
54
}
56
55
57
56
fn decode( read_buf: & [ u8 ] ) -> ( String , & [ u8 ] ) {
@@ -78,15 +77,15 @@ gen_serialize!(u64);
78
77
gen_serialize ! ( usize ) ;
79
78
80
79
impl Serialize for & str {
81
- fn encode < ' buf > ( & self , write_buf : & ' buf mut [ u8 ] ) -> Store < ' buf > {
80
+ fn encode < ' buf > ( & self , write_buf : & ' buf mut [ u8 ] ) -> ( Store < ' buf > , & ' buf mut [ u8 ] ) {
82
81
let str_len = self . len ( ) ;
83
- let ( chunk, _ ) = write_buf. split_at_mut ( str_len + SIZE_LENGTH ) ;
82
+ let ( chunk, rest ) = write_buf. split_at_mut ( str_len + SIZE_LENGTH ) ;
84
83
let ( len_chunk, str_chunk) = chunk. split_at_mut ( SIZE_LENGTH ) ;
85
84
86
85
len_chunk. copy_from_slice ( & str_len. to_le_bytes ( ) ) ;
87
86
str_chunk. copy_from_slice ( self . as_bytes ( ) ) ;
88
87
89
- Store :: new ( Self :: decode, chunk)
88
+ ( Store :: new ( Self :: decode, chunk) , rest )
90
89
}
91
90
92
91
fn decode ( read_buf : & [ u8 ] ) -> ( String , & [ u8 ] ) {
@@ -105,16 +104,16 @@ impl Serialize for &str {
105
104
}
106
105
107
106
/// Eager evaluation into a String for debug structs
108
- pub fn encode_debug < T : std:: fmt:: Debug > ( val : T , write_buf : & mut [ u8 ] ) -> Store {
107
+ pub fn encode_debug < T : std:: fmt:: Debug > ( val : T , write_buf : & mut [ u8 ] ) -> ( Store , & mut [ u8 ] ) {
109
108
let val_string = format ! ( "{:?}" , val) ;
110
109
let str_len = val_string. len ( ) ;
111
110
112
- let ( chunk, _ ) = write_buf. split_at_mut ( str_len + SIZE_LENGTH ) ;
111
+ let ( chunk, rest ) = write_buf. split_at_mut ( str_len + SIZE_LENGTH ) ;
113
112
let ( len_chunk, str_chunk) = chunk. split_at_mut ( SIZE_LENGTH ) ;
114
113
len_chunk. copy_from_slice ( & str_len. to_le_bytes ( ) ) ;
115
114
str_chunk. copy_from_slice ( val_string. as_bytes ( ) ) ;
116
115
117
- Store :: new ( <& str as Serialize >:: decode, chunk)
116
+ ( Store :: new ( <& str as Serialize >:: decode, chunk) , rest )
118
117
}
119
118
120
119
#[ cfg( test) ]
@@ -129,7 +128,7 @@ mod tests {
129
128
let mut buf = [ 0u8 ; BUF_SIZE ] ;
130
129
131
130
let x: $primitive = $val;
132
- let x_store = x. encode( & mut buf) ;
131
+ let ( x_store, _ ) = x. encode( & mut buf) ;
133
132
assert_eq!( format!( "{}" , x) , format!( "{}" , x_store) ) ;
134
133
} } ;
135
134
}
@@ -153,13 +152,9 @@ mod tests {
153
152
let b: u32 = 999 ;
154
153
let c: usize = 100000 ;
155
154
156
- let ( a_chunk, chunk) = buf. split_at_mut ( a. buffer_size_required ( ) ) ;
157
- let ( b_chunk, chunk) = chunk. split_at_mut ( b. buffer_size_required ( ) ) ;
158
- let ( c_chunk, _) = chunk. split_at_mut ( c. buffer_size_required ( ) ) ;
159
-
160
- let a_store = a. encode ( a_chunk) ;
161
- let b_store = b. encode ( b_chunk) ;
162
- let c_store = c. encode ( c_chunk) ;
155
+ let ( a_store, chunk) = a. encode ( & mut buf) ;
156
+ let ( b_store, chunk) = b. encode ( chunk) ;
157
+ let ( c_store, _) = c. encode ( chunk) ;
163
158
164
159
assert_eq ! (
165
160
format!( "{} {} {}" , a, b, c) ,
@@ -171,7 +166,7 @@ mod tests {
171
166
fn serialize_str ( ) {
172
167
let mut buf = [ 0 ; 128 ] ;
173
168
let s = "hello world" ;
174
- let store = s. encode ( & mut buf) ;
169
+ let ( store, _ ) = s. encode ( & mut buf) ;
175
170
176
171
assert_eq ! ( s, format!( "{}" , store) . as_str( ) )
177
172
}
@@ -186,7 +181,7 @@ mod tests {
186
181
187
182
let mut buf = [ 0 ; 128 ] ;
188
183
let s = DebugStruct { s : "Hello World" } ;
189
- let store = encode_debug ( & s, & mut buf) ;
184
+ let ( store, _ ) = encode_debug ( & s, & mut buf) ;
190
185
191
186
assert_eq ! ( format!( "{:?}" , s) , format!( "{}" , store) )
192
187
}
0 commit comments