[[表紙|/]] [[編集|EDIT]] [[短縮|TURL]] *serializer ubyte[] serialize(T)(in T t) { ubyte[] rv; static if( is(T==struct) ) {{ foreach(x;t.tupleof) rv~=serialize(x); }} else static if( __traits(isIntegral,T) ) {{ rv=(cast(ubyte*)[t].ptr)[0..T.sizeof]; }} else static if(__traits(isStaticArray,T)) {{ rv=cast(ubyte[])t; }} else static if(__traits(isAssociativeArray,T)) {{ rv=serialize(t.length); foreach( i, v; t) { rv~= serialize(i); rv~= serialize(v); } }} else static if(is(T U:U[])) {{ rv=serialize(t.length); foreach( v; t) { rv~= serialize(v); } }} else {{ assert(0,"unsupported"); }} return rv; } template ReturnType(T) { static if(__traits(isStaticArray,T) && is(T U:U[])) { alias U[] ReturnType; } else static if( is(T U:const(U)[]) || is(T U:invariant(U)[]) ) { alias U[] ReturnType; } else static if( is(T U:const U) || is(T U:invariant U) ) { alias U ReturnType; } else { alias T ReturnType; } } ReturnType!(T) deserialize(T)(ubyte[] t) { ubyte* ptr = t.ptr; return _deserialize!(T)(ptr); } private ReturnType!(T) _deserialize(T)(ref ubyte* t){ static if(is(T==struct)) {{ ReturnType!(T) rv; foreach(i,x;rv.tupleof) { static if(__traits(isStaticArray,typeof(x))) rv.tupleof[i][]/*x[]=*/=_deserialize!(typeof(x))(t)[]; else rv.tupleof[i]/*x=*/=_deserialize!(typeof(x))(t); } return rv; }} else static if(__traits(isIntegral,T)){{ ReturnType!(T) rv=*cast(T*)t; t+=T.sizeof; return rv; }} else static if(__traits(isStaticArray,T)&&is(T U:U[])){{ ReturnType!(T) rv; rv=cast(U[])t[0..T.sizeof]; t+=T.sizeof; return rv; }} else static if( __traits(isAssociativeArray,T) && is(T A:U[A],U) ) {{ ReturnType!(T) rv; int len = _deserialize!(size_t)(t); foreach( i; 0..len) { A key= _deserialize!(A)(t); rv[key]= _deserialize!(U)(t); } return rv; }} else static if(is(T U:U[])){{ ReturnType!(T) rv; int len = _deserialize!(size_t)(t); rv.length= len; foreach( i; 0..len) { rv[i]= _deserialize!(U)(t); } return rv; }} else {{ assert(0,"unsupported"); }} }