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 }