databuffer/
lib.rs

1
2/// THIS FILE HAS BEEN MODIFIED HEAVILY BY Ceikry IN ORDER TO ACCOMODATE ADDITIONAL FEATURES, AND SEPARATE NAMING BASED ON PERSONAL PREFERENCE.
3/// Much love to the original authors who provided the groundwork <3 (Such authors are mentioned in the attributions in cargo.toml)
4extern crate byteorder;
5
6use byteorder::{ByteOrder, BigEndian};
7use std::{io::{Read, Write, Result}, convert::TryInto};
8
9/// A data buffer object specifically turned to easily read and write binary values
10pub struct DataBuffer {
11    data: Vec<u8>,
12    wpos: usize,
13    rpos: usize,
14    rbit: usize,
15    wbit: usize,
16    header: PacketHeader
17}
18
19pub enum PacketHeader {
20    NORMAL,
21    SHORT,
22    BYTE
23}
24
25impl DataBuffer {
26    /// Construct a new, empty, DataBuffer
27    pub fn new() -> DataBuffer {
28        DataBuffer {
29            data: vec![],
30            wpos: 0,
31            rpos: 0,
32            rbit: 0,
33            wbit: 0,
34            header: PacketHeader::NORMAL
35        }
36    }
37
38    /// Borrows the data from a [`Vec<u8>`] to produce a [`DataBuffer`]. 
39    /// This method is the equivalent of creating a new() [`DataBuffer`]
40    /// and calling the .write_bytes() method to effectively
41    /// copy all bytes from the borrowed vector into this buffer's underlying
42    /// vector.
43    pub fn from_bytes(bytes: &[u8]) -> DataBuffer {
44        let mut buffer = DataBuffer::new();
45        buffer.write_bytes(bytes);
46        buffer
47    }
48
49    /// Takes ownership of a [`Vec<u8>`] and uses it for this buffer's
50    /// underlying vector. This is not a borrow, you will not be able to use
51    /// the original vector anymore after calling this method.
52    /// This method is useful to avoid excessive copying of data.
53    pub fn with_vec(bytes: Vec<u8>) -> DataBuffer {
54        DataBuffer { data: bytes, wpos: 0, rpos: 0, rbit: 0, wbit: 0, header: PacketHeader::NORMAL }
55    }
56
57    pub fn create(opcode: u8, header: PacketHeader) -> DataBuffer {
58        let mut buff = DataBuffer::new();
59        buff.write_u8(opcode);
60
61        match header {
62            PacketHeader::NORMAL => {},
63            PacketHeader::BYTE => {
64                buff.write_u8(255);
65            }
66            PacketHeader::SHORT => {
67                buff.write_u16(65535);
68            }
69        }
70
71        buff.header = header;
72
73        buff
74    }
75
76    pub fn finish(&mut self){
77        let mut size = self.get_wpos();
78
79        self.set_wpos(1);
80        self.set_rpos(1);
81
82        let header_bytes = match self.header {
83            PacketHeader::NORMAL => 0,
84            PacketHeader::BYTE => 1,
85            PacketHeader::SHORT => 2
86        };
87
88        size = ((size as u8) - header_bytes - 1).try_into().unwrap();
89
90        match self.header {
91            PacketHeader::NORMAL => {},
92            PacketHeader::BYTE => {
93                self.write_u8(size.try_into().unwrap());
94            }
95            PacketHeader::SHORT => {
96                self.write_u16(size.try_into().unwrap());
97            }
98        }
99
100        self.set_rpos(0);
101    }
102
103    /// Return the buffer size
104    pub fn len(&self) -> usize {
105        self.data.len()
106    }
107
108    /// Clear the buffer and reinitialize the reading and writing cursor
109    pub fn clear(&mut self) {
110        self.data.clear();
111        self.wpos = 0;
112        self.rpos = 0;
113    }
114
115    /// Change the buffer size to size.
116    ///
117    /// _Note_: You cannot shrink a buffer with this method
118    pub fn resize(&mut self, size: usize) {
119        let diff = size - self.data.len();
120        if diff > 0 {
121            self.data.extend(std::iter::repeat(0).take(diff))
122        }
123    }
124
125    // Write operations
126
127    /// Append a byte array to the buffer. The buffer is automatically extended if needed
128    ///
129    /// #Example
130    ///
131    /// ```
132    /// # use databuffer::*;
133    /// let mut buffer = DataBuffer::new();
134    /// buffer.write_bytes(&vec![0x1, 0xFF, 0x45]); // buffer contains [0x1, 0xFF, 0x45]
135    /// ```
136    pub fn write_bytes(&mut self, bytes: &[u8]) {
137        self.flush_bit();
138
139        let size = bytes.len() + self.wpos;
140
141        if size > self.data.len() {
142            self.resize(size);
143        }
144
145        for v in bytes {
146            self.data[self.wpos] = *v;
147            self.wpos += 1;
148        }
149    }
150
151    /// Append a byte (8 bits value) to the buffer
152    ///
153    /// #Example
154    ///
155    /// ```
156    /// #  use databuffer::*;
157    /// let mut buffer = DataBuffer::new();
158    /// buffer.write_u8(1) // buffer contains [0x1]
159    /// ```
160    pub fn write_u8(&mut self, val: u8) {
161        self.write_bytes(&[val]);
162    }
163
164    /// Same as `write_u8()` but for signed values
165    pub fn write_i8(&mut self, val: i8) {
166        self.write_u8(val as u8);
167    }
168
169    /// Append a word (16 bits value) to the buffer
170    ///
171    /// #Example
172    ///
173    /// ```
174    /// #  use databuffer::*;
175    /// let mut buffer = DataBuffer::new();
176    /// buffer.write_u16(1) // buffer contains [0x00, 0x1] if little endian
177    /// ```
178    pub fn write_u16(&mut self, val: u16) {
179        let mut buf = [0; 2];
180        BigEndian::write_u16(&mut buf, val);
181        self.write_bytes(&buf);
182    }
183
184    /// Same as `write_u16()` but for signed values
185    pub fn write_i16(&mut self, val: i16) {
186        self.write_u16(val as u16);
187    }
188
189    /// Append a double word (32 bits value) to the buffer
190    ///
191    /// #Example
192    ///
193    /// ```
194    /// #  use databuffer::*;
195    /// let mut buffer = DataBuffer::new();
196    /// buffer.write_u32(1) // buffer contains [0x00, 0x00, 0x00, 0x1] if little endian
197    /// ```
198    pub fn write_u32(&mut self, val: u32) {
199        let mut buf = [0; 4];
200        BigEndian::write_u32(&mut buf, val);
201        self.write_bytes(&buf);
202    }
203
204    /// Same as `write_u32()` but for signed values
205    pub fn write_i32(&mut self, val: i32) {
206        self.write_u32(val as u32);
207    }
208
209    /// Append a quaddruple word (64 bits value) to the buffer
210    ///
211    /// #Example
212    ///
213    /// ```
214    /// #  use databuffer::*;
215    /// let mut buffer = DataBuffer::new();
216    /// buffer.write_u64(1) // buffer contains [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1] if little endian
217    /// ```
218    pub fn write_u64(&mut self, val: u64) {
219        let mut buf = [0; 8];
220        BigEndian::write_u64(&mut buf, val);
221        self.write_bytes(&buf);
222    }
223
224    /// Same as `write_u64()` but for signed values
225    pub fn write_i64(&mut self, val: i64) {
226        self.write_u64(val as u64);
227    }
228
229    /// Append a 32 bits floating point number to the buffer.
230    ///
231    /// #Example
232    ///
233    /// ```
234    /// #  use databuffer::*;
235    /// let mut buffer = DataBuffer::new();
236    /// buffer.write_f32(0.1)
237    /// ```
238    pub fn write_f32(&mut self, val: f32) {
239        let mut buf = [0; 4];
240        BigEndian::write_f32(&mut buf, val);
241        self.write_bytes(&buf);
242    }
243
244    /// Append a 64 bits floating point number to the buffer.
245    ///
246    /// #Example
247    ///
248    /// ```
249    /// #  use databuffer::*;
250    /// let mut buffer = DataBuffer::new();
251    /// buffer.write_f64(0.1)
252    /// ```
253    pub fn write_f64(&mut self, val: f64) {
254        let mut buf = [0; 8];
255        BigEndian::write_f64(&mut buf, val);
256        self.write_bytes(&buf);
257    }
258
259    /// Append a string to the buffer.
260    ///
261    /// *Format* The format is `(u32)size + size * (u8)characters`
262    ///
263    /// #Example
264    ///
265    /// ```
266    /// #  use databuffer::*;
267    /// let mut buffer = DataBuffer::new();
268    /// buffer.write_str("Hello")
269    /// ```
270    pub fn write_str(&mut self, val: &str) {
271        self.write_u32(val.len() as u32);
272        self.write_bytes(val.as_bytes());
273    }
274
275    /// Write a single null-terminated string to the buffer.
276    /// 
277    /// #Example
278    ///
279    ///  ```
280    /// # use databuffer::*;
281    /// let mut buffer = DataBuffer::new();
282    /// buffer.write_ntstr("Hello");
283    /// ```
284    pub fn write_ntstr(&mut self, val: &str) {
285        self.write_bytes(val.as_bytes());
286        self.write_u8(0);
287    }
288
289    /// Write a null-bookeneded string to the buffer.
290    /// 
291    /// #Example
292    /// ```
293    /// # use databuffer::*;
294    /// let mut buffer = DataBuffer::new();
295    /// buffer.write_dntstr("Hello");
296    /// ```
297    pub fn write_dntstr(&mut self, val: &str){
298        self.write_u8(0);
299        self.write_bytes(val.as_bytes());
300        self.write_u8(0);
301    }
302
303    /// Writes a smart to the buffer, which is a dynamically-sized unit with a max value of 32768.
304    pub fn write_smart(&mut self, val: u16){
305        if val > 128 {
306            self.write_u16(val.wrapping_add(32768));
307        } else {
308            self.write_u8(val as u8);
309        }
310    }
311
312    /// Writes a medium to the buffer, which is a tribyte word.
313    pub fn write_medium(&mut self, val: u32) {
314        self.write_i8((val >> 16) as i8);
315        self.write_i8(((val >> 8) & 0xFF) as i8);
316        self.write_i8((val & 0xFF) as i8);
317    }
318
319    /// Writes an inverted-signededness u8 to the buffer.
320    pub fn write_u8_neg(&mut self, val: u8) {
321        self.write_i8(-(val as i8));    
322    }
323
324    /// Writes an inverted-signededness i8 to the buffer.
325    pub fn write_i8_neg(&mut self, val: i8) {
326        self.write_i8(val.wrapping_neg());    
327    }
328
329    /// Writes a u8 + 128 to the buffer.
330    pub fn write_u8_add(&mut self, val: u8) {
331        self.write_u8(val.wrapping_add(128));
332    }
333
334    /// Writes a i8 + 128 to the buffer.
335    pub fn write_i8_add(&mut self, val: i8) {
336        self.write_i8(val.wrapping_add(127).wrapping_add(1));
337    }
338
339    /// Writes a u8 - 128 to the buffer.
340    pub fn write_u8_sub(&mut self, val: u8) {
341        self.write_i8(val.wrapping_sub(128) as i8);
342    }
343
344    /// Writes a i8 - 128 to the buffer.
345    pub fn write_i8_sub(&mut self, val: i8) {
346        self.write_i8(val.wrapping_sub(127).wrapping_sub(1));
347    }
348    
349    /// Writes a little-endian u16 to the buffer.
350    pub fn write_u16_le(&mut self, val: u16) {
351        self.write_u8(val as u8);
352        self.write_u8((val >> 8) as u8);
353    }
354
355    /// Writes a little-endian i16 to the buffer.
356    pub fn write_i16_le(&mut self, val: i16) {
357        self.write_i8(val as i8);
358        self.write_i8((val >> 8) as i8);
359    }
360
361    /// Writes a little-endian u16 + 128 to the buffer.
362    pub fn write_u16_le_add(&mut self, val: u16) {
363        self.write_u8(val.wrapping_add(128) as u8);
364        self.write_u8((val >> 8) as u8);
365    }
366
367    /// Writes a little-endian u16 + 128 to the buffer.
368    pub fn write_i16_le_add(&mut self, val: i16) {
369        self.write_i8_add(val as i8);
370        self.write_i8((val >> 8) as i8);
371    }
372
373    /// Writes a little-endian u32 to the buffer.
374    pub fn write_u32_le(&mut self, val: u32){
375        self.write_u8(val as u8);
376        self.write_u8((val >> 8) as u8);
377        self.write_u8((val >> 16) as u8);
378        self.write_u8((val >> 24) as u8);
379    }
380
381    /// Writes a little-endian i32 to the buffer.
382    pub fn write_i32_le(&mut self, val: i32){
383        self.write_i8(val as i8);
384        self.write_i8((val >> 8) as i8);
385        self.write_i8((val >> 16) as i8);
386        self.write_i8((val >> 24) as i8);
387    }
388
389    /// Writes a mixed-endian u32 to the buffer.
390    pub fn write_u32_me(&mut self, val: u32){
391        self.write_u8((val >> 16) as u8);
392        self.write_u8((val >> 24) as u8);
393        self.write_u8(val as u8);
394        self.write_u8((val >> 8) as u8);
395    }
396
397    /// Writes a reverse mixed-endian u32 to the buffer.
398    pub fn write_u32_me_reversed(&mut self, val: u32){
399        self.write_u8((val >> 8) as u8);
400        self.write_u8(val as u8);
401        self.write_u8((val >> 24) as u8);
402        self.write_u8((val >> 16) as u8);
403    }
404
405    // Read operations
406
407    /// Read a defined amount of raw bytes. The program crash if not enough bytes are available
408    pub fn read_bytes(&mut self, size: usize) -> Vec<u8> {
409        self.flush_bit();
410        assert!(self.rpos + size <= self.data.len());
411        let range = self.rpos..self.rpos + size;
412        let mut res = Vec::<u8>::new();
413        res.write(&self.data[range]).unwrap();
414        self.rpos += size;
415        res
416    }
417
418    /// Read one byte. The program crash if not enough bytes are available
419    ///
420    /// #Example
421    ///
422    /// ```
423    /// #  use databuffer::*;
424    /// let mut buffer = DataBuffer::from_bytes(&vec![0x1]);
425    /// let value = buffer.read_u8(); //Value contains 1
426    /// ```
427    pub fn read_u8(&mut self) -> u8 {
428        self.flush_bit();
429        assert!(self.rpos < self.data.len());
430        let pos = self.rpos;
431        self.rpos += 1;
432        self.data[pos]
433    }
434
435    /// Same as `read_u8()` but for signed values
436    pub fn read_i8(&mut self) -> i8 {
437        self.read_u8() as i8
438    }
439
440    /// Read a 2-bytes long value. The program crash if not enough bytes are available
441    ///
442    /// #Example
443    ///
444    /// ```
445    /// #  use databuffer::*;
446    /// let mut buffer = DataBuffer::from_bytes(&vec![0x0, 0x1]);
447    /// let value = buffer.read_u16(); //Value contains 1
448    /// ```
449    pub fn read_u16(&mut self) -> u16 {
450        self.flush_bit();
451        assert!(self.rpos + 2 <= self.data.len());
452        let range = self.rpos..self.rpos + 2;
453        self.rpos += 2;
454        BigEndian::read_u16(&self.data[range])
455    }
456
457    /// Same as `read_u16()` but for signed values
458    pub fn read_i16(&mut self) -> i16 {
459        self.read_u16() as i16
460    }
461
462    /// Read a four-bytes long value. The program crash if not enough bytes are available
463    ///
464    /// #Example
465    ///
466    /// ```
467    /// #  use databuffer::*;
468    /// let mut buffer = DataBuffer::from_bytes(&vec![0x0, 0x0, 0x0, 0x1]);
469    /// let value = buffer.read_u32(); // Value contains 1
470    /// ```
471    pub fn read_u32(&mut self) -> u32 {
472        self.flush_bit();
473        assert!(self.rpos + 4 <= self.data.len());
474        let range = self.rpos..self.rpos + 4;
475        self.rpos += 4;
476        BigEndian::read_u32(&self.data[range])
477    }
478
479    /// Same as `read_u32()` but for signed values
480    pub fn read_i32(&mut self) -> i32 {
481        self.read_u32() as i32
482    }
483
484    /// Read an eight bytes long value. The program crash if not enough bytes are available
485    ///
486    /// #Example
487    ///
488    /// ```
489    /// #  use databuffer::*;
490    /// let mut buffer = DataBuffer::from_bytes(&vec![0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1]);
491    /// let value = buffer.read_u64(); //Value contains 1
492    /// ```
493    pub fn read_u64(&mut self) -> u64 {
494        self.flush_bit();
495        assert!(self.rpos + 8 <= self.data.len());
496        let range = self.rpos..self.rpos + 8;
497        self.rpos += 8;
498        BigEndian::read_u64(&self.data[range])
499    }
500
501    /// Same as `read_u64()` but for signed values
502    pub fn read_i64(&mut self) -> i64 {
503        self.read_u64() as i64
504    }
505
506    /// Read a 32 bits floating point value. The program crash if not enough bytes are available
507    pub fn read_f32(&mut self) -> f32 {
508        self.flush_bit();
509        assert!(self.rpos + 4 <= self.data.len());
510        let range = self.rpos..self.rpos + 4;
511        self.rpos += 4;
512        BigEndian::read_f32(&self.data[range])
513    }
514
515    /// Read a 64 bits floating point value. The program crash if not enough bytes are available
516    pub fn read_f64(&mut self) -> f64 {
517        self.flush_bit();
518        assert!(self.rpos + 8 <= self.data.len());
519        let range = self.rpos..self.rpos + 8;
520        self.rpos += 8;
521        BigEndian::read_f64(&self.data[range])
522    }
523
524    /// Read a string.
525    ///
526    /// *Note* : First it reads a 32 bits value representing the size, the read 'size' raw bytes.
527    pub fn read_string(&mut self) -> String {
528        let size = self.read_u32();
529        String::from_utf8(self.read_bytes(size as usize)).unwrap()
530    }
531
532    /// Read a null-terminated string.
533    pub fn read_ntstr(&mut self) -> String {
534        let mut string = String::new();
535
536        let mut current = self.read_u8();
537        while current != 0 {
538            string.push(current as char);
539            current = self.read_u8();
540        }
541
542        string
543    }
544
545    /// Read a null-bookended string.
546    pub fn read_dntstr(&mut self) -> String {
547        let mut string = String::new();
548
549        assert_eq!(0, self.read_u8());
550
551        let mut current = self.read_u8();
552        while current != 0 {
553            string.push(current as char);
554            current = self.read_u8();
555        }
556
557        string
558    }
559
560    /// Reads a smart from the buffer, which is a dynamically-sized unit with a max value of 32768.
561    pub fn read_smart(&mut self) -> u16 {
562        if self.data[self.rpos] >= 128 {
563            return self.read_u16().wrapping_sub(32768);
564        }
565        else {
566            return self.read_u8() as u16;
567        }
568    }
569
570    /// Reads a medium from the buffer, which is a tribyte word.
571    pub fn read_medium(&mut self) -> u32 {
572        return ((self.read_u8() as u32) << 16) + ((self.read_u8() as u32) << 8) + (self.read_u8() as u32);
573    }
574
575    /// Reads an inverted-signededness u8 from the buffer.
576    pub fn read_u8_neg(&mut self) -> u8 {
577        return -self.read_i8() as u8;   
578    }
579
580    /// Reads an inverted-signededness i8 from the buffer.
581    pub fn read_i8_neg(&mut self) -> i8 {
582        return self.read_i8().wrapping_neg();
583    }
584
585    /// Reads a u8 + 128 from the buffer, and subtracts the extra 128.
586    pub fn read_u8_add(&mut self) -> u8 {
587        return self.read_u8().wrapping_sub(128);
588    }
589
590    /// Reads a i8 + 128 from the buffer, and subtracts the extra 128.
591    pub fn read_i8_add(&mut self) -> i8 {
592        return self.read_u8().wrapping_sub(128) as i8;
593    }
594
595    /// Reads a u8 - 128 from the buffer, and adds back the missing 128.
596    pub fn read_u8_sub(&mut self) -> u8 {
597        return self.read_u8().wrapping_add(128) as u8;
598    }
599
600    /// Reads a i8 - 128 from the buffer, and adds back the missing 128.
601    pub fn read_i8_sub(&mut self) -> i8 {
602        return self.read_i8().wrapping_add(127).wrapping_add(1) as i8;
603    }
604
605    /// Reads a little-endian u16 from the buffer.
606    pub fn read_u16_le(&mut self) -> u16 {
607        let mut bytes: [u8; 2] = [0; 2];
608        let _ = self.read(&mut bytes);
609        return u16::from_le_bytes(bytes);
610    }
611
612    /// Reads a little-endian i16 from the buffer.
613    pub fn read_i16_le(&mut self) -> i16 {
614        let mut bytes: [u8; 2] = [0; 2];
615        let _ = self.read(&mut bytes);
616        return i16::from_le_bytes(bytes);
617    }
618
619    /// Reads a little-endian u16 + 128 from the buffer, and subtracts the extra 128.
620    pub fn read_u16_le_add(&mut self) -> u16 {
621        let mut bytes: [u8; 2] = [0; 2];
622        let _ = self.read(&mut bytes);
623        bytes[0] = bytes[0].wrapping_sub(128);
624        return u16::from_le_bytes(bytes);
625    }
626
627    /// Reads a little-endian i16 + 128 from the buffer, and subtracts the extra 128.
628    pub fn read_i16_le_add(&mut self) -> i16 {
629        let mut bytes: [u8; 2] = [0; 2];
630        let _ = self.read(&mut bytes);
631        bytes[0] = bytes[0].wrapping_sub(128);
632        return i16::from_le_bytes(bytes);
633    }
634
635    /// Reads a little-endian u32 from the buffer.
636    pub fn read_u32_le(&mut self) -> u32 {
637        let mut bytes: [u8; 4] = [0; 4];
638        let _ = self.read(&mut bytes);
639        return u32::from_le_bytes(bytes);
640    }
641
642    /// Reads a little-endian u32 from the buffer.
643    pub fn read_i32_le(&mut self) -> i32 {
644        let mut bytes: [u8; 4] = [0; 4];
645        let _ = self.read(&mut bytes);
646        return i32::from_le_bytes(bytes);
647    }
648
649    /// Reads a mixed-endian u32 from the buffer.
650    pub fn read_u32_me(&mut self) -> u32 {
651        return ((self.read_u8() as u32) << 16) + ((self.read_u8() as u32) << 24) + ((self.read_u8() as u32)) + ((self.read_u8() as u32) << 8);
652    }
653
654    /// Reads a reverse mixed-endian u32 from the buffer.
655    pub fn read_u32_me_reversed(&mut self) -> u32 {
656        return ((self.read_u8() as u32) << 8) + (self.read_u8() as u32) + ((self.read_u8() as u32) << 24) + ((self.read_u8() as u32) << 16);
657    }
658
659    // Other
660
661    /// Dump the byte buffer to a string.
662    pub fn to_string(&self) -> String {
663        let mut str = String::new();
664        for b in &self.data {
665            str = str + &format!("0x{:01$x} ", b, 2);
666        }
667        str.pop();
668        str
669    }
670
671    /// Return the position of the reading cursor
672    pub fn get_rpos(&self) -> usize {
673        self.rpos
674    }
675
676    /// Set the reading cursor position.
677    /// *Note* : Set the reading cursor to `min(newPosition, self.len())` to prevent overflow
678    pub fn set_rpos(&mut self, rpos: usize) {
679        self.rpos = std::cmp::min(rpos, self.data.len());
680    }
681
682    /// Return the writing cursor position
683    pub fn get_wpos(&self) -> usize {
684        self.wpos
685    }
686
687    /// Set the writing cursor position.
688    /// *Note* : Set the writing cursor to `min(newPosition, self.len())` to prevent overflow
689    pub fn set_wpos(&mut self, wpos: usize) {
690        self.wpos = std::cmp::min(wpos, self.data.len());
691    }
692
693    /// Returns a copy of this buffer's underlying [`Vec<u8>`].
694    /// If you no longer need to use this buffer after calling this,
695    /// it is recommended to use .deconstruct() instead.
696    pub fn to_bytes(&self) -> Vec<u8> {
697        self.data.to_vec()
698    }
699
700    pub fn deconstruct(self) -> Vec<u8> {
701        self.data
702    }
703
704    //Bit manipulation functions
705
706    /// Read 1 bit. Return true if the bit is set to 1, otherwhise, return false.
707    ///
708    /// **Note** Bits are read from left to right
709    ///
710    /// #Example
711    ///
712    /// ```
713    /// #  use databuffer::*;
714    /// let mut buffer = DataBuffer::from_bytes(&vec![128]); // 10000000b
715    /// let value1 = buffer.read_bit(); //value1 contains true (eg: bit is 1)
716    /// let value2 = buffer.read_bit(); //value2 contains false (eg: bit is 0)
717    /// ```
718    pub fn read_bit(&mut self) -> bool {
719        assert!(self.rpos <= self.data.len());
720        let bit = self.data[self.rpos] & (1 << 7 - self.rbit) != 0;
721        self.rbit += 1;
722        if self.rbit > 7 {
723            self.rbit = 0;
724            self.rpos += 1;
725        }
726        bit
727    }
728
729    /// Read n bits. an return the corresponding value an u64.
730    ///
731    /// **Note 1** : We cannot read more than 64 bits
732    ///
733    /// **Note 2** Bits are read from left to right
734    ///
735    /// #Example
736    ///
737    /// ```
738    /// #  use databuffer::*;
739    /// let mut buffer = DataBuffer::from_bytes(&vec![128]); // 10000000b
740    /// let value = buffer.read_bits(3); // value contains 4 (eg: 100b)
741    /// ```
742    pub fn read_bits(&mut self, n: u8) -> u64 {
743        // TODO : Assert that n <= 64
744        if n > 0 {
745            ((if self.read_bit() { 1 } else { 0 }) << n - 1) | self.read_bits(n - 1)
746        } else {
747            0
748        }
749    }
750
751    /// Discard all the pending bits available for reading or writing and place the the corresponding cursor to the next byte.
752    ///
753    /// **Note 1** : If no bits are currently read or written, this function does nothing.
754    /// **Note 2** : This function is automatically called for each write or read operations.
755    /// #Example
756    ///
757    /// ```text
758    /// 10010010 | 00000001
759    /// ^
760    /// 10010010 | 00000001 // read_bit called
761    ///  ^
762    /// 10010010 | 00000001 // flush_bit() called
763    ///            ^
764    /// ```
765    pub fn flush_bit(&mut self) {
766        if self.rbit > 0 {
767            self.rpos += 1;
768            self.rbit = 0
769        }
770
771        if self.wbit > 0 {
772            self.wpos += 1;
773            self.wbit = 0
774        }
775    }
776
777    /// Append 1 bit value to the buffer.
778    /// The bit is happened like this :
779    ///
780    /// ```text
781    /// ...| XXXXXXXX | 10000000 |....
782    /// ```
783    pub fn write_bit(&mut self, bit: bool) {
784        let size = self.wpos + 1;
785        if size > self.data.len() {
786            self.resize(size);
787        }
788
789        if bit {
790            self.data[self.wpos] |= 1 << (7 - self.wbit);
791        }
792
793        self.wbit += 1;
794
795        if self.wbit > 7 {
796            self.wbit = 0;
797            self.wpos += 1;
798        }
799    }
800
801    /// Write the given value as a sequence of n bits
802    ///
803    /// #Example
804    ///
805    /// ```
806    /// #  use databuffer::*;
807    /// let mut buffer = DataBuffer::new();
808    /// buffer.write_bits(4, 3); // append 100b
809    /// ```
810    pub fn write_bits(&mut self, value: u64, n: u8) {
811        if n > 0 {
812            self.write_bit((value >> n - 1) & 1 != 0);
813            self.write_bits(value, n - 1);
814        } else {
815            self.write_bit((value & 1) != 0);
816        }
817    }
818}
819
820impl Read for DataBuffer {
821    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
822        self.flush_bit();
823        let read_len = std::cmp::min(self.data.len() - self.rpos, buf.len());
824        let range = self.rpos..self.rpos + read_len;
825        for (i, val) in (&self.data[range]).iter().enumerate() {
826            buf[i] = *val;
827        }
828        self.rpos += read_len;
829        Ok(read_len)
830    }
831}
832
833impl Write for DataBuffer {
834    fn write(&mut self, buf: &[u8]) -> Result<usize> {
835        self.write_bytes(buf);
836        Ok(buf.len())
837    }
838
839    fn flush(&mut self) -> Result<()> {
840        Ok(())
841    }
842}
843
844impl std::fmt::Debug for DataBuffer {
845    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
846        let rpos = if self.rbit > 0 {
847            self.rpos + 1
848        } else {
849            self.rpos
850        };
851
852        let read_len = self.data.len() - rpos;
853        let mut remaining_data = vec![0; read_len];
854        let range = rpos..rpos + read_len;
855        for (i, val) in (&self.data[range]).iter().enumerate() {
856            remaining_data[i] = *val;
857        }
858
859        write!(f, "DataBuffer {{ remaining_data: {:?}, total_data: {:?} }}",
860               remaining_data, self.data)
861    }
862}