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 }