membuffer/
lib.rs

1#![cfg_attr(feature = "bench", feature(test))]
2
3#[cfg(feature = "bench")]
4extern crate test;
5
6
7use byteorder::{WriteBytesExt, ReadBytesExt, NativeEndian};
8use serde::{Serialize,Deserialize};
9use serde_json;
10use std::borrow::Cow;
11
12
13///!This crate will provide a extremely fast deserialization of dynamic data structures with big
14///fields. This is very MMAP friendly since it only parses the header and does not parse the fields
15///until requested.
16///**Easy example:**
17///```rust
18///use membuffer::{MemBufferWriter,MemBufferReader};
19///
20///fn main() {
21///  //Creates a new empty MemBufferWriter
22///  let mut writer = MemBufferWriter::new();
23///  
24///  //Adds this as immutable field, no more changing after adding it
25///  //The first entry is the key and must be a type that implements Into<i32>
26///  writer.add_entry("Very long value");
27///
28///  //Creates a Vec<u8> out of all the collected data
29///  let result = writer.finalize();
30///
31///  //Try to read the created vector. Will return an error if the CRC32 does not fit
32///  //or if the header is not terminated. Will panic if the memory is corrupted beyond recognition
33///  let reader = MemBufferReader::new(&result).unwrap();
34///
35///  //Will return an error if the selected key could not be found or if the value types dont match
36///  assert_eq!(reader.load_entry::<&str>(0).unwrap(), "Very long value");
37///}
38///```
39
40///Refers to a position given to every deserialize and serialize operation, can be used to store
41///data if one does not need to store data in the payload e. g. Field smaller than 8 Bytes
42pub struct Position {
43    pub offset: i32,
44    pub length: i32,
45}
46
47
48///Refers to the different types when implementing your own types use an own enum like
49///this:
50///```rust
51///use membuffer::MemBufferTypes;
52///enum MyImplementedTypes {
53/// MyOwnType0 = MemBufferTypes::LastPreDefienedValue as isize,
54/// MyOwnType1,
55/// MyOwnType2
56///}
57///```
58#[derive(Debug)]
59pub enum MemBufferTypes {
60    Text,
61    Integer32,
62    VectorU8,
63    VectorU64,
64    MemBuffer,
65    LastPreDefienedValue
66}
67
68impl Into<i32> for MemBufferTypes {
69    fn into(self) -> i32 {
70        self as i32
71    }
72}
73
74
75struct InternPosition {
76    pub pos: Position,
77    pub variable_type: i32,
78}
79
80
81
82
83#[derive(Debug, Clone)]
84pub enum MemBufferError {
85    FieldTypeError(i32,i32),
86    WrongFormat,
87}
88
89impl<'a> std::fmt::Display for MemBufferError {
90    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
91        match self {
92            MemBufferError::FieldTypeError(x,y) => write!(f,"Memory buffer error: Field has type {} and not requested type {}",x.to_string(),y.to_string()),
93            MemBufferError::WrongFormat => write!(f,"Memory buffer error: Reached end of slice before end of header, memory seems to be corrupted")
94        }
95    }
96}
97
98
99pub trait MemBufferDeserialize<'a,T> {
100    fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<T,MemBufferError> where Self: Sized;
101}
102
103impl<'a> MemBufferDeserialize<'a,&'a str> for &str {
104    fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a str,MemBufferError> {
105        //This should always be safe as long as the saved string was utf-8 encoded and no one
106        //messed with the file on disk.
107        unsafe{ Ok(std::str::from_utf8_unchecked(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])) }
108    }
109}
110
111impl<'a> MemBufferDeserialize<'a,i32> for i32 {
112    fn from_mem_buffer(pos: &Position, _: &'a [u8]) -> Result<i32,MemBufferError> {
113        //Fast load integer since no memory is required to store integer
114        Ok(pos.offset)
115    }
116}
117
118impl<'a> MemBufferDeserialize<'a,&'a [u8]> for &[u8] {
119    fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a [u8],MemBufferError> {
120        Ok(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])
121    }
122}
123
124impl<'a> MemBufferDeserialize<'a,&'a [u64]> for &[u64] {
125    fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a [u64],MemBufferError> {
126        let val: *const u8 = mem[pos.offset as usize..].as_ptr();
127        let cast_memory = val.cast::<u64>();
128        //Divide by eight as u64 should be 8 bytes on any system
129        let mem_length = pos.length>>3;
130
131        //This should always be safe as long as no one messed with the serialized data
132        Ok(unsafe{std::slice::from_raw_parts(cast_memory, mem_length as usize)})
133    }
134}
135
136impl<'a> MemBufferDeserialize<'a,MemBufferReader<'a>> for MemBufferReader<'a> {
137    fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<MemBufferReader<'a>,MemBufferError> {
138        let reader = MemBufferReader::new(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])?;
139        Ok(reader)
140    }
141}
142
143///The reader which is used for reading the memory area produced by the writer, **Important notice:
144///The reader uses the native endian of the system used therefore sending between big endian and
145///little endian systems wont work**
146///```rust
147///use membuffer::{MemBufferWriter,MemBufferReader};
148///
149///let mut data = MemBufferWriter::new();
150///data.add_entry("Add some data to save to file or send over the network");
151///let data_vec = data.finalize();
152/////The reader is type sensitive
153///let reader = MemBufferReader::new(&data_vec).unwrap();
154/////We load the first entry, try not to get this mixed up
155///assert_eq!(reader.load_entry::<&str>(0).unwrap(),"Add some data to save to file or send over the network");
156///```
157pub struct MemBufferReader<'a> {
158    offsets: &'a [InternPosition],
159    data: &'a [u8]
160}
161
162impl<'a> MemBufferReader<'a> {
163    ///Deserialize data from a buffer to an i32 integer
164    pub fn deserialize_i32_from(mut buffer: &[u8]) -> i32 {
165        buffer.read_i32::<NativeEndian>().unwrap()
166    }
167
168    pub fn len(&self) -> usize {
169        self.offsets.len()
170    }
171
172    pub fn payload_len(&self) -> usize {
173        self.data.len()
174    }
175    
176    ///Internal load function this is needed to enable loading nested MemBufferWriters which does
177    ///not implement the Deserialize trait
178    fn intern_load_entry<X: MemBufferDeserialize<'a,X>>(&self, key: usize, expected_type: i32) -> Result<X,MemBufferError> {
179        let entry = &self.offsets[key];
180        let is_type = entry.variable_type;
181        if is_type != expected_type {
182            return Err(MemBufferError::FieldTypeError(is_type,expected_type));
183        }
184        return X::from_mem_buffer(&entry.pos, self.data);
185    }
186
187    ///Load one entry with the given type, expecting the serializable trait as well to determine
188    ///the integer type, when doing polymorphismus of structures use the same integer for multiple
189    ///types
190    pub fn load_entry<X: MemBufferDeserialize<'a,X> + MemBufferSerialize>(&self,key: usize) -> Result<X,MemBufferError> {
191        self.intern_load_entry(key.into(), X::get_mem_buffer_type())
192    }
193
194    ///Loads an entry stored with serde_json and returns it.
195    pub fn load_serde_entry<T: Deserialize<'a>>(&self,key: usize) -> Result<T,MemBufferError> {
196        let string : &str = self.load_entry(key.into())?;
197        Ok(serde_json::from_str(string).unwrap())
198    }
199
200    ///Loads a nested MembufferWriter as reader
201    pub fn load_recursive_reader(&self, key: usize) -> Result<MemBufferReader<'a>,MemBufferError> {
202        self.intern_load_entry(key.into(), MemBufferWriter::get_mem_buffer_type())
203    }
204
205
206    ///Creates a new memory format reader from the given memory slice, as the readed values are
207    ///borrowed from the memory slice the reader cannot outlive the memory it borrows from
208    pub fn new(val: &'a [u8]) -> Result<MemBufferReader<'a>,MemBufferError> {
209        if val.len() < 8 {
210            return Err(MemBufferError::WrongFormat);
211        }
212
213        let vec_len = MemBufferReader::deserialize_i32_from(val) as usize;
214        let start = vec_len*std::mem::size_of::<InternPosition>()+4;
215        if val.len() < start+4 {
216            return Err(MemBufferError::WrongFormat);
217        }
218
219        let magic = MemBufferReader::deserialize_i32_from(&val[start..]);
220        if magic != 0x7AFECAFE {
221            return Err(MemBufferError::WrongFormat);
222        }
223        unsafe {
224        Ok(MemBufferReader {
225            offsets: std::slice::from_raw_parts(val[4..].as_ptr().cast::<InternPosition>(),vec_len),
226            data: &val[start+4..]
227        })
228        }
229    }
230}
231
232impl<'a> std::fmt::Debug for MemBufferReader<'a> {
233    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
234        write!(f,"Found memory buffer with payload size {}",self.data.len())
235    }
236}
237
238
239///The Writer class which sets up the schema and writes it into the memory when finished building
240pub struct MemBufferWriter {
241    offsets: Vec<InternPosition>,
242    data: Vec<u8>
243}
244
245pub trait MemBufferSerialize {
246    fn to_mem_buffer<'a>(&'a self, pos: &mut Position) -> std::borrow::Cow<'a,[u8]>;
247    fn get_mem_buffer_type() -> i32; 
248}
249
250impl MemBufferSerialize for &str {
251    fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> std::borrow::Cow<'a,[u8]> {
252        std::borrow::Cow::Borrowed(self.as_bytes())
253    }
254
255    fn get_mem_buffer_type() -> i32 {
256        MemBufferTypes::Text.into()
257    }
258}
259
260impl MemBufferSerialize for &String {
261    fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> Cow<'a,[u8]> {
262        Cow::Borrowed(self.as_bytes())
263    }
264
265    fn get_mem_buffer_type() -> i32 {
266        MemBufferTypes::Text.into()
267    }
268}
269
270impl MemBufferSerialize for i32 {
271    fn to_mem_buffer<'a>(&'a self, pos: &mut Position) -> Cow<'a, [u8]> {
272        pos.offset = *self;
273        Cow::Borrowed(&[])
274    }
275
276    fn get_mem_buffer_type() -> i32 {
277        MemBufferTypes::Integer32.into()
278    }
279}
280
281impl MemBufferSerialize for &[u8] {
282    fn to_mem_buffer<'a>(&'a self, _: &mut Position) -> Cow<'a, [u8]> {
283        Cow::Borrowed(self)
284    }
285
286    fn get_mem_buffer_type() -> i32 {
287        MemBufferTypes::VectorU8.into()
288    }
289}
290
291impl MemBufferSerialize for &[u64] {
292    fn to_mem_buffer<'a>(&'a self, _: &mut Position) -> Cow<'a,[u8]> {
293        let val: *const u64 = self.as_ptr();
294        let cast_memory = val.cast::<u8>();
295        let mem_length = self.len() * std::mem::size_of::<u64>();
296        Cow::Borrowed(unsafe{ std::slice::from_raw_parts(cast_memory, mem_length)})
297    }
298
299    fn get_mem_buffer_type() -> i32 {
300        MemBufferTypes::VectorU64.into()
301    }
302}
303
304
305impl MemBufferSerialize for MemBufferWriter {
306    fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> Cow<'a,[u8]> {
307        let ret = self.finalize();
308        Cow::Owned(ret)
309    }
310
311    fn get_mem_buffer_type() -> i32 {
312        MemBufferTypes::MemBuffer.into()
313    }
314}
315
316impl MemBufferWriter {
317    ///Creates a new empty memory format writer
318    pub fn new() -> MemBufferWriter {
319        MemBufferWriter {
320            offsets: Vec::new(),
321            data: Vec::new()
322        }
323    }
324
325    ///Create a new Membuffer writer from the given memory, this will enable the writer to add
326    ///more data to the previous version, to do so the writer does a full reload of the memory
327    ///therefore it is an expensive operation if the structure adding fields to is huge.
328    ///```rust
329    ///use membuffer::{MemBufferWriter,MemBufferReader};
330    ///
331    ///let mut value = MemBufferWriter::new();
332    ///value.add_entry("Hello");
333    ///value.add_entry("World");
334    ///
335    ///let data = value.finalize();
336    ///
337    /////Save data to disk or anything like that
338    /////Then load it again and add more data by doing this
339    ///
340    ///let mut writer_adder = MemBufferWriter::from(&data).unwrap();
341    /////The writer creates a new Vector to hold the data therefore no mutable reference to data is
342    /////stored
343    ///writer_adder.add_entry("Damn I forgot");
344    ///
345    ///let new_data = writer_adder.finalize();
346    /////new_data will now contain an entry for "Hello" an entry for "World" and an entry
347    /////for "Damn I forgot" 
348    ///
349    ///```
350    pub fn from<'a>(raw_memory: &'a [u8]) -> Result<MemBufferWriter,MemBufferError> {
351        let reader = MemBufferReader::new(raw_memory)?;
352        let mut offsets : Vec<InternPosition> = Vec::new();
353        for x in reader.offsets.iter() {
354            offsets.push(InternPosition{
355                pos: Position {
356                    offset: x.pos.offset,
357                    length: x.pos.length,
358                },
359                variable_type: x.variable_type
360            });
361        }
362
363        Ok(MemBufferWriter {
364            offsets,
365            data: reader.data.to_vec()
366        })
367    }
368
369    ///Serializes the integer to the memory slice
370    pub fn serialize_i32_to(val: i32, to: &mut Vec<u8>) {
371        to.write_i32::<NativeEndian>(val).unwrap();
372    }
373
374    ///Adds an entry to the writer the only requirement is the serializable trait
375    pub fn add_entry<T: MemBufferSerialize>(&mut self, val: T) {
376        let mut position = Position {offset: self.data.len() as i32, length: 0};
377        let slice = val.to_mem_buffer(&mut position);
378        position.length = slice.len() as i32;
379        self.offsets.push(InternPosition{pos:position,variable_type: T::get_mem_buffer_type()});
380        self.data.extend_from_slice(&slice);
381    }
382
383    ///Adds a serde serializable entry into the structure as serializer serde_json is used.
384    ///Internally it is saved as a string.
385    pub fn add_serde_entry<T: Serialize>(&mut self,val: &T) {
386        let as_str = serde_json::to_string(val).unwrap();
387        self.add_entry(&as_str);
388    }
389
390
391    ///Finalize the schema and return the memory slice holding the whole vector
392    pub fn finalize(&self) -> Vec<u8> {
393        let mut var: Vec<u8> = Vec::with_capacity(self.data.len()+self.offsets.len()*20);
394        MemBufferWriter::serialize_i32_to(self.offsets.len() as i32,&mut var);
395        for val in self.offsets.iter() {
396            MemBufferWriter::serialize_i32_to(val.pos.offset, &mut var);
397            MemBufferWriter::serialize_i32_to(val.pos.length, &mut var);
398            MemBufferWriter::serialize_i32_to(val.variable_type, &mut var);
399        }
400        MemBufferWriter::serialize_i32_to(0x7AFECAFE, &mut var);
401        var.extend_from_slice(&self.data);
402        var
403    }
404}
405
406
407
408#[cfg(test)]
409mod tests {
410    use super::{MemBufferWriter,MemBufferReader,MemBufferError,MemBufferTypes,MemBufferSerialize};
411    use serde::{Serialize,Deserialize};
412
413    #[derive(Serialize,Deserialize)]
414    struct HeavyStruct {
415        vec: Vec<u64>,
416        name: String,
417        frequency: i32,
418        id: i32,
419    }
420
421    #[test]
422    fn check_enum_usage() {
423        let mut writer = MemBufferWriter::new();
424        writer.add_entry("Der moderne Prometheus");
425        writer.add_entry("Dies hier ist nur ein Satz");
426        writer.add_entry::<&[u64]>(&vec![0,1,2,3,4,5]);
427
428        let result = writer.finalize();
429
430        let reader = MemBufferReader::new(&result).unwrap();
431
432        let _: &str = reader.load_entry(0).unwrap();
433        let _: &str = reader.load_entry(1).unwrap();
434        let _: &[u64] = reader.load_entry(2).unwrap();
435    }
436    
437    #[test]
438    fn check_type_ids() {
439        assert_eq!(<&str as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Text as i32);
440        assert_eq!(<&String as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Text as i32);
441        assert_eq!(<i32 as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Integer32 as i32);
442        assert_eq!(<&[u8] as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::VectorU8 as i32);
443        assert_eq!(<&[u64] as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::VectorU64 as i32);
444        assert_eq!(MemBufferWriter::get_mem_buffer_type(),MemBufferTypes::MemBuffer as i32);
445    }
446
447    #[test]
448    fn corrupt_length() {
449        let mut writer = MemBufferWriter::new();
450        writer.add_entry("Der moderne Prometheus");
451        writer.add_entry("Dies hier ist nur ein Satz");
452        writer.add_entry::<&[u64]>(&vec![0,1,2,3,4,5]);
453
454        let mut result = writer.finalize();
455        result[0] = 100;
456
457
458        let reader = MemBufferReader::new(&result);
459        assert_eq!(reader.is_err(),true);
460    }
461
462    #[test]
463    fn check_read_attributes() {
464        let mut writer = MemBufferWriter::new();
465        let str1 = "Hello World";
466        let str2 = "Hello second World";
467        let str3 = "визитной карточкой";
468        writer.add_entry(str1);
469        writer.add_entry(str2);
470        writer.add_entry(str3);
471        let result = writer.finalize();
472
473        let reader = MemBufferReader::new(&result).unwrap();
474        let positions = &reader.offsets;
475
476        assert_eq!(positions.len(),3);
477        let zero = &positions[0];
478        assert_eq!(zero.variable_type,MemBufferTypes::Text as i32);
479        assert_eq!(zero.pos.offset,0);
480        assert_eq!(zero.pos.length,str1.as_bytes().len() as i32);
481
482        let one = &positions[1];
483        assert_eq!(one.variable_type,MemBufferTypes::Text as i32);
484        assert_eq!(one.pos.offset,str1.as_bytes().len() as i32);
485        assert_eq!(one.pos.length,str2.as_bytes().len() as i32);
486
487        let two = &positions[2];
488        assert_eq!(two.variable_type,MemBufferTypes::Text as i32);
489        assert_eq!(two.pos.offset as usize,str1.as_bytes().len() + str2.as_bytes().len());
490        assert_eq!(two.pos.length,str3.as_bytes().len() as i32);
491
492        assert_eq!(reader.load_entry::<&str>(2).unwrap(),str3);
493    }
494
495    #[test]
496    fn check_serde_capability() {
497        let value = HeavyStruct {
498            vec: vec![100,20,1],
499            name: String::from("membuffer!"),
500            frequency: 10,
501            id: 200,
502        };
503        let mut writer = MemBufferWriter::new();
504        writer.add_serde_entry(&value);
505        let result = writer.finalize();
506 
507        let reader = MemBufferReader::new(&result).unwrap();
508        let struc: HeavyStruct = reader.load_serde_entry(0).unwrap();
509
510        assert_eq!(struc.vec, vec![100,20,1]);
511        assert_eq!(struc.name,"membuffer!");
512        assert_eq!(struc.frequency,10);
513        assert_eq!(struc.id,200);
514    }
515
516    #[test]
517    fn check_serialize_string_deserialize() {
518        let mut writer = MemBufferWriter::new();
519        writer.add_entry("Earth");
520        let result = writer.finalize();
521
522        let reader = MemBufferReader::new(&result).unwrap();
523        assert_eq!(reader.load_entry::<&str>(0).unwrap(), "Earth");
524    }
525
526    #[test]
527    fn check_serialize_vecu8_deserialize() {
528        let mut writer = MemBufferWriter::new();
529        let some_bytes : Vec<u8> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
530        writer.add_entry(&some_bytes[..]);
531        let result = writer.finalize();
532
533        let reader = MemBufferReader::new(&result).unwrap();
534        assert_eq!(reader.load_entry::<&[u8]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
535    }
536
537    #[should_panic]
538    #[test]
539    fn check_wrong_key() {
540        let mut writer = MemBufferWriter::new();
541        let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
542        writer.add_entry(&some_bytes[..]);
543        writer.add_entry(&some_bytes[..]);
544        let result = writer.finalize();
545
546        let reader = MemBufferReader::new(&result).unwrap();
547        assert_eq!(reader.load_entry::<&[u64]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
548        //TODO check index overflow
549        assert_eq!(reader.load_entry::<&[u64]>(3).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
550    }
551
552    #[test]
553    fn check_reload_writer_from_mem() {
554        let mut writer = MemBufferWriter::new();
555        let str1 = "Hello World";
556        let str2 = "Hello second World";
557        let str3 = "визитной карточкой";
558        writer.add_entry(str1);
559        writer.add_entry(str2);
560        writer.add_entry(str3);
561        let result = writer.finalize();
562
563        let mut writer2 = MemBufferWriter::from(&result).unwrap();
564        writer2.add_entry("fuchs");
565        
566        let added2 = writer2.finalize();
567        let reader = MemBufferReader::new(&added2).unwrap();
568        assert_eq!(reader.len(),4);
569        assert_eq!(reader.load_entry::<&str>(3).unwrap(),"fuchs");
570        assert_eq!(reader.load_entry::<&str>(2).unwrap(),"визитной карточкой");
571    }
572
573    #[test]
574    fn check_serialize_vecu64_deserialize() {
575        let mut writer = MemBufferWriter::new();
576        let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
577        writer.add_entry(&some_bytes[..]);
578        writer.add_entry(&some_bytes[..]);
579        let result = writer.finalize();
580
581        let reader = MemBufferReader::new(&result).unwrap();
582        assert_eq!(reader.load_entry::<&[u64]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
583        assert_eq!(reader.load_entry::<&[u64]>(1).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
584    }
585
586
587    #[test]
588    fn check_len() {
589        let mut writer = MemBufferWriter::new();
590        let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
591        writer.add_entry(&some_bytes[..]);
592        writer.add_entry(&some_bytes[..]);
593        writer.add_entry(&some_bytes[..]);
594        let result = writer.finalize();
595
596        let reader = MemBufferReader::new(&result).unwrap();
597        assert_eq!(reader.len(), 3);
598    }
599
600    #[test]
601    fn check_empty() {
602        let writer = MemBufferWriter::new();
603        let result = writer.finalize();
604        let reader = MemBufferReader::new(&result).unwrap();
605        assert_eq!(reader.len(), 0);
606        assert_eq!("Found memory buffer with payload size 0",format!("{:?}",reader));
607
608    }
609
610    #[test]
611    fn check_slice_too_small() {
612        let writer = MemBufferWriter::new();
613        let result = writer.finalize();
614        let reader = MemBufferReader::new(&result[0..1]);
615        assert_eq!(reader.is_err(),true);
616        println!("Error: {}",reader.unwrap_err());
617    }
618
619
620    #[test]
621    fn check_payload_len() {
622        let mut writer = MemBufferWriter::new();
623        let some_bytes = "Hello how are you?";
624        writer.add_entry(&some_bytes[..]);
625        writer.add_entry(&some_bytes[..]);
626        writer.add_entry(&some_bytes[..]);
627        let result = writer.finalize();
628
629        let reader = MemBufferReader::new(&result).unwrap();
630        assert_eq!(reader.payload_len(), some_bytes.as_bytes().len()*3);
631    }
632
633    #[test]
634    fn check_recursive_readers() {
635        let mut writer = MemBufferWriter::new();
636        let some_bytes = "Hello how are you?";
637        writer.add_entry(&some_bytes[..]);
638
639        let mut writer2 = MemBufferWriter::new();
640        writer2.add_entry(some_bytes);
641
642        writer.add_entry(writer2);
643        let result = writer.finalize();
644        assert_eq!(writer.finalize(), result);
645
646        let reader = MemBufferReader::new(&result).unwrap();
647        assert_eq!(reader.len(), 2);
648        assert_eq!(reader.load_entry::<&str>(0).unwrap(), "Hello how are you?");
649        let second = reader.load_recursive_reader(1);
650        assert_eq!(second.is_err(),false);
651        let reader2 = second.unwrap();
652        assert_eq!(reader2.len(), 1);
653        assert_eq!(reader2.load_entry::<&str>(0).unwrap(), "Hello how are you?");
654
655        assert_eq!(reader.load_recursive_reader(0).is_err(),true);
656    }
657
658    #[test]
659    fn check_mem_shift() {
660        let mut writer = MemBufferWriter::new();
661        writer.add_entry("Earth");
662        let result = writer.finalize();
663
664        let reader = MemBufferReader::new(&result[1..]);
665        assert_eq!(reader.is_err(),true);
666    }
667
668    #[test]
669    fn check_type_error() {
670        let mut writer = MemBufferWriter::new();
671        writer.add_entry("Earth");
672        let result = writer.finalize();
673
674        let reader = MemBufferReader::new(&result);
675        assert_eq!(reader.is_err(),false);
676        let err = reader.unwrap().load_entry::<i32>(0).unwrap_err();
677        if let MemBufferError::FieldTypeError(x,y) = err {
678                println!("Error {} ",MemBufferError::FieldTypeError(x,y));
679                assert_eq!(x, MemBufferTypes::Text as i32);
680                assert_eq!(y, MemBufferTypes::Integer32 as i32);
681        }
682    }
683
684
685    #[test]
686    fn check_serialize_i32_deserialize() {
687        let mut writer = MemBufferWriter::new();
688        writer.add_entry(100);
689        let result = writer.finalize();
690
691        let reader = MemBufferReader::new(&result).unwrap();
692        assert_eq!(reader.load_entry::<i32>(0).unwrap(), 100);
693    }
694}
695
696#[cfg(feature="bench")]
697mod bench {
698    use test::Bencher;
699    use super::{MemBufferWriter,MemBufferReader};
700    use serde::{Serialize,Deserialize};
701    use serde_json;
702
703
704    #[bench]
705    fn benchmark_few_keys_payload_1mb(b: &mut Bencher) {
706        let mut huge_string = String::with_capacity(1_000_000);
707        for _ in 0..1_000_000 {
708            huge_string.push('a');
709        }
710        let mut writer = MemBufferWriter::new();
711        writer.add_entry(&huge_string);
712        let result = writer.finalize();
713
714        b.iter(|| {
715            let reader = MemBufferReader::new(&result).unwrap();
716            let string = reader.load_entry::<&str>(0).unwrap();
717            assert_eq!(string.len(), 1_000_000);
718        });
719    }
720
721    #[bench]
722    fn benchmark_few_keys_payload_10mb(b: &mut Bencher) {
723        let mut huge_string = String::with_capacity(10_000_000);
724        for _ in 0..10_000_000 {
725            huge_string.push('a');
726        }
727        let mut writer = MemBufferWriter::new();
728        writer.add_entry(&huge_string);
729        let result = writer.finalize();
730
731        b.iter(|| {
732            let reader = MemBufferReader::new(&result).unwrap();
733            let string = reader.load_entry::<&str>(0).unwrap();
734            assert_eq!(string.len(), 10_000_000);
735        });
736    }
737
738    #[bench]
739    fn benchmark_few_keys_payload_100mb(b: &mut Bencher) {
740        let mut huge_string = String::with_capacity(10_000_000);
741        for _ in 0..100_000_000 {
742            huge_string.push('a');
743        }
744        let mut writer = MemBufferWriter::new();
745        writer.add_entry(&huge_string);
746        let result = writer.finalize();
747
748        b.iter(|| {
749            let reader = MemBufferReader::new(&result).unwrap();
750            let string = reader.load_entry::<&str>(0).unwrap();
751            assert_eq!(string.len(), 100_000_000);
752        });
753    }
754
755    #[bench]
756    fn benchmark_few_keys_payload_1mb_times_3(b: &mut Bencher) {
757        let mut huge_string = String::with_capacity(1_000_000);
758        for _ in 0..1_000_000 {
759            huge_string.push('a');
760        }
761        let mut writer = MemBufferWriter::new();
762        writer.add_entry(&huge_string);
763        writer.add_entry(&huge_string);
764        writer.add_entry(&huge_string);
765        let result = writer.finalize();
766        assert!(result.len() > 3_000_000);
767
768        b.iter(|| {
769            let reader = MemBufferReader::new(&result).unwrap();
770            let string1 = reader.load_entry::<&str>(0).unwrap();
771            let string2 = reader.load_entry::<&str>(1).unwrap();
772            let string3 = reader.load_entry::<&str>(2).unwrap();
773            assert_eq!(string1.len(), 1_000_000);
774            assert_eq!(string2.len(), 1_000_000);
775            assert_eq!(string3.len(), 1_000_000);
776        });
777    }
778
779    #[bench]
780    fn benchmark_few_keys_payload_100mb_times_3(b: &mut Bencher) {
781        let mut huge_string = String::with_capacity(100_000_000);
782        for _ in 0..100_000_000 {
783            huge_string.push('a');
784        }
785        let mut writer = MemBufferWriter::new();
786        writer.add_entry(&huge_string);
787        writer.add_entry(&huge_string);
788        writer.add_entry(&huge_string);
789        let result = writer.finalize();
790        assert!(result.len() > 300_000_000);
791
792        b.iter(|| {
793            let reader = MemBufferReader::new(&result).unwrap();
794            let string1 = reader.load_entry::<&str>(0).unwrap();
795            let string2 = reader.load_entry::<&str>(1).unwrap();
796            let string3 = reader.load_entry::<&str>(2).unwrap();
797            assert_eq!(string1.len(), 100_000_000);
798            assert_eq!(string2.len(), 100_000_000);
799            assert_eq!(string3.len(), 100_000_000);
800        });   
801    }
802
803    #[derive(Serialize,Deserialize)]
804    struct BenchSerde<'a> {
805        one: &'a str,
806        two: &'a str,
807        three: &'a str
808    }
809
810    #[bench]
811    fn benchmark_few_keys_payload_1mb_times_3_serde(b: &mut Bencher) {
812        let mut huge_string = String::with_capacity(1_000_000);
813        for _ in 0..1_000_000 {
814            huge_string.push('a');
815        }
816        let first = BenchSerde {
817            one: &huge_string,
818            two: &huge_string,
819            three: &huge_string
820        };
821
822        let string = serde_json::to_string(&first).unwrap();
823
824        b.iter(|| {
825            let reader: BenchSerde = serde_json::from_str(&string).unwrap();
826            assert_eq!(reader.one.len(), 1_000_000);
827            assert_eq!(reader.two.len(), 1_000_000);
828            assert_eq!(reader.three.len(), 1_000_000);
829        });
830    }
831}