1 module hunt.serialization.BinaryDeserializer;
2 
3 import hunt.serialization.Specify;
4 import std.traits;
5 
6 /**
7  * 
8  */
9 struct BinaryDeserializer {
10 
11     private {
12         const(ubyte)[] _buffer;
13     }
14 
15     this(ubyte[] buffer) {
16         this._buffer = buffer;
17     }
18 
19     const(ubyte[]) bytes() const nothrow {
20         return _buffer;
21     }
22 
23     ulong bytesLeft() const {
24         return _buffer.length;
25     }
26 
27     T iArchive(T)()
28             if (!isDynamicArray!T && !isAssociativeArray!T && !is(T == class) && __traits(compiles, T())) {
29         T obj;
30         specify(this, obj);
31         return obj;
32     }
33 
34     T iArchive(T)()
35             if (!isDynamicArray!T && !isAssociativeArray!T && !is(T == class)
36                 && !__traits(compiles, T())) {
37         T obj = void;
38         specify(this, obj);
39         return obj;
40     }
41 
42     T iArchive(T, A...)(A args) if (is(T == class)) {
43         T obj = new T(args);
44         specify(this, obj);
45         return obj;
46     }
47 
48     T iArchive(T)() if (isDynamicArray!T || isAssociativeArray!T) {
49         return iArchive!(T, ushort)();
50     }
51 
52     T iArchive(T, U)() if (isDynamicArray!T || isAssociativeArray!T) {
53         T obj;
54         specify!U(this, obj);
55         return obj;
56     }
57 
58     void putUbyte(ref ubyte val) {
59         val = _buffer[0];
60         _buffer = _buffer[1 .. $];
61     }
62 
63     void putClass(T)(T val) if (is(T == class)) {
64         specifyClass(this, val);
65     }
66 
67     auto putRaw(ushort length) {
68         auto res = _buffer[0 .. length];
69         _buffer = _buffer[length .. $];
70         return res;
71     }
72 
73     bool isNullObj() {
74         return _buffer[0 .. 4] == NULL ? true : false;
75     }
76 }