1 module utils.binary.readers; 2 3 import 4 utils.misc; 5 6 7 struct MemoryReader 8 { 9 this(in void[] data) 10 { 11 _p = cast(ubyte *)data.ptr; 12 _end = _p + data.length; 13 } 14 15 bool read(ubyte[] v) 16 { 17 if(length < v.length) 18 { 19 return false; 20 } 21 22 v[] = _p[0..v.length]; 23 _p += v.length; 24 25 return true; 26 } 27 28 bool read(ref ubyte[] v, uint len) 29 { 30 if(length < len) 31 { 32 return false; 33 } 34 35 v = _p[0..len].dup; 36 _p += len; 37 38 return true; 39 } 40 41 bool readstr(ref string v) 42 { 43 auto t = _p; 44 auto r = length; 45 46 for(; r && *t; r--, t++) {} 47 48 if(!r) 49 { 50 return false; 51 } 52 53 v = cast(string)_p[0..t - _p].idup; 54 _p = t + 1; 55 56 return true; 57 } 58 59 bool write(in ubyte[] v) 60 { 61 if(length < v.length) 62 { 63 return false; 64 } 65 66 _p[0..v.length] = v; 67 _p += v.length; 68 69 return true; 70 } 71 72 bool rskip(size_t cnt) 73 { 74 if(length < cnt) 75 { 76 return false; 77 } 78 79 _p += cnt; 80 return true; 81 } 82 83 bool wskip(size_t cnt) 84 { 85 if(length < cnt) 86 { 87 return false; 88 } 89 90 _p += cnt; 91 return true; 92 } 93 94 const data() 95 { 96 return _p[0..length]; 97 } 98 99 const length() 100 { 101 return cast(size_t)(_end - _p); 102 } 103 104 private: 105 ubyte* 106 _p, 107 _end; 108 } 109 110 struct AppendWriter 111 { 112 bool write(in ubyte[] v) 113 { 114 _data ~= v; 115 return true; 116 } 117 118 bool wskip(size_t cnt) 119 { 120 _data.length += cnt; 121 return true; 122 } 123 124 const length() 125 { 126 return _data.length; 127 } 128 129 private: 130 mixin publicProperty!(ubyte[], `data`); 131 }