Skip to content

Commit 4a5a9e5

Browse files
committed
quicklog(serialize): modify encode signature
1 parent 04e02c7 commit 4a5a9e5

File tree

7 files changed

+33
-36
lines changed

7 files changed

+33
-36
lines changed

quicklog/benches/logger_benchmark.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ struct Nested {
2525
}
2626

2727
impl Serialize for BigStruct {
28-
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> Store<'buf> {
29-
let (chunk, _) = write_buf.split_at_mut(self.buffer_size_required());
28+
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> (Store<'buf>, &'buf mut [u8]) {
29+
let (chunk, rest) = write_buf.split_at_mut(self.buffer_size_required());
3030

3131
let elm_size = std::mem::size_of::<i32>();
3232
let (vec_chunk, str_chunk) = chunk.split_at_mut(self.vec.len() * elm_size);
@@ -38,7 +38,7 @@ impl Serialize for BigStruct {
3838

3939
_ = self.some.encode(str_chunk);
4040

41-
Store::new(Self::decode, chunk)
41+
(Store::new(Self::decode, chunk), rest)
4242
}
4343

4444
fn decode(buf: &[u8]) -> (String, &[u8]) {

quicklog/examples/macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl std::fmt::Display for S {
1717
}
1818

1919
impl Serialize for S {
20-
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> Store<'buf> {
20+
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> (Store<'buf>, &'buf mut [u8]) {
2121
self.i.encode(write_buf)
2222
}
2323

quicklog/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
//! }
8989
//!
9090
//! impl Serialize for SomeStruct {
91-
//! fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> Store<'buf> { /* some impl */ }
91+
//! fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> (Store<'buf>, &'buf mut[u8]) { /* some impl */ }
9292
//! fn decode(read_buf: &[u8]) -> (String, &[u8]) { /* some impl */ }
9393
//! fn buffer_size_required(&self) -> usize { /* some impl */ }
9494
//! }

quicklog/src/macros.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,10 @@ macro_rules! is_level_enabled {
7676
macro_rules! make_store {
7777
($serializable:expr) => {{
7878
use $crate::serialize::Serialize;
79-
$serializable
80-
.encode($crate::logger().get_chunk_as_mut($serializable.buffer_size_required()))
79+
let (store, _) = $serializable
80+
.encode($crate::logger().get_chunk_as_mut($serializable.buffer_size_required()));
81+
82+
store
8183
}};
8284
}
8385

quicklog/src/serialize/mod.rs

+18-23
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pub mod buffer;
66
/// Additionally, this stores the contents serialized into a buffer, which does
77
/// not require allocation and could speed things up.
88
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]);
1010
fn decode(read_buf: &[u8]) -> (String, &[u8]);
1111
fn buffer_size_required(&self) -> usize;
1212
}
@@ -45,13 +45,12 @@ impl Display for Store<'_> {
4545
macro_rules! gen_serialize {
4646
($primitive:ty) => {
4747
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);
5351
x.copy_from_slice(&self.to_le_bytes());
54-
Store::new(Self::decode, x)
52+
53+
(Store::new(Self::decode, x), rest)
5554
}
5655

5756
fn decode(read_buf: &[u8]) -> (String, &[u8]) {
@@ -78,15 +77,15 @@ gen_serialize!(u64);
7877
gen_serialize!(usize);
7978

8079
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]) {
8281
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);
8483
let (len_chunk, str_chunk) = chunk.split_at_mut(SIZE_LENGTH);
8584

8685
len_chunk.copy_from_slice(&str_len.to_le_bytes());
8786
str_chunk.copy_from_slice(self.as_bytes());
8887

89-
Store::new(Self::decode, chunk)
88+
(Store::new(Self::decode, chunk), rest)
9089
}
9190

9291
fn decode(read_buf: &[u8]) -> (String, &[u8]) {
@@ -105,16 +104,16 @@ impl Serialize for &str {
105104
}
106105

107106
/// 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]) {
109108
let val_string = format!("{:?}", val);
110109
let str_len = val_string.len();
111110

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);
113112
let (len_chunk, str_chunk) = chunk.split_at_mut(SIZE_LENGTH);
114113
len_chunk.copy_from_slice(&str_len.to_le_bytes());
115114
str_chunk.copy_from_slice(val_string.as_bytes());
116115

117-
Store::new(<&str as Serialize>::decode, chunk)
116+
(Store::new(<&str as Serialize>::decode, chunk), rest)
118117
}
119118

120119
#[cfg(test)]
@@ -129,7 +128,7 @@ mod tests {
129128
let mut buf = [0u8; BUF_SIZE];
130129

131130
let x: $primitive = $val;
132-
let x_store = x.encode(&mut buf);
131+
let (x_store, _) = x.encode(&mut buf);
133132
assert_eq!(format!("{}", x), format!("{}", x_store));
134133
}};
135134
}
@@ -153,13 +152,9 @@ mod tests {
153152
let b: u32 = 999;
154153
let c: usize = 100000;
155154

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);
163158

164159
assert_eq!(
165160
format!("{} {} {}", a, b, c),
@@ -171,7 +166,7 @@ mod tests {
171166
fn serialize_str() {
172167
let mut buf = [0; 128];
173168
let s = "hello world";
174-
let store = s.encode(&mut buf);
169+
let (store, _) = s.encode(&mut buf);
175170

176171
assert_eq!(s, format!("{}", store).as_str())
177172
}
@@ -186,7 +181,7 @@ mod tests {
186181

187182
let mut buf = [0; 128];
188183
let s = DebugStruct { s: "Hello World" };
189-
let store = encode_debug(&s, &mut buf);
184+
let (store, _) = encode_debug(&s, &mut buf);
190185

191186
assert_eq!(format!("{:?}", s), format!("{}", store))
192187
}

quicklog/tests/common/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ pub(crate) struct SerializeStruct {
105105
}
106106

107107
impl Serialize for SerializeStruct {
108-
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> Store<'buf> {
108+
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> (Store<'buf>, &'buf mut [u8]) {
109109
self.symbol.as_str().encode(write_buf)
110110
}
111111

@@ -125,8 +125,8 @@ pub(crate) struct BigStruct {
125125
}
126126

127127
impl Serialize for BigStruct {
128-
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> Store<'buf> {
129-
let (chunk, _) = write_buf.split_at_mut(self.buffer_size_required());
128+
fn encode<'buf>(&self, write_buf: &'buf mut [u8]) -> (Store<'buf>, &'buf mut [u8]) {
129+
let (chunk, rest) = write_buf.split_at_mut(self.buffer_size_required());
130130

131131
let elm_size = std::mem::size_of::<i32>();
132132
let (vec_chunk, str_chunk) = chunk.split_at_mut(self.vec.len() * elm_size);
@@ -138,7 +138,7 @@ impl Serialize for BigStruct {
138138

139139
_ = self.some.encode(str_chunk);
140140

141-
Store::new(Self::decode, chunk)
141+
(Store::new(Self::decode, chunk), rest)
142142
}
143143

144144
fn decode(buf: &[u8]) -> (String, &[u8]) {

quicklog/tests/failures/struct_missing_display.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ error[E0599]: no method named `encode` found for struct `Something` in the curre
4141
help: one of the expressions' fields has a method of the same name
4242
--> src/macros.rs
4343
|
44-
| .some_str.encode($crate::logger().get_chunk_as_mut($serializable.buffer_size_required()))
44+
| .some_str.encode($crate::logger().get_chunk_as_mut($serializable.buffer_size_required()));
4545
| +++++++++
4646

4747
error[E0599]: no method named `buffer_size_required` found for struct `Something` in the current scope
@@ -62,5 +62,5 @@ error[E0599]: no method named `buffer_size_required` found for struct `Something
6262
help: one of the expressions' fields has a method of the same name
6363
--> src/macros.rs
6464
|
65-
| .encode($crate::logger().get_chunk_as_mut($serializable.some_str.buffer_size_required()))
65+
| .encode($crate::logger().get_chunk_as_mut($serializable.some_str.buffer_size_required()));
6666
| +++++++++

0 commit comments

Comments
 (0)