1 module sbin.stdtypesrh; 2 3 import sbin.repr; 4 import sbin.type; 5 6 public import sbin.repr : CombineReprHandler; 7 8 import std.datetime : SysTime, UTC; 9 import std.bitmanip : BitArray; 10 11 struct SysTimeAsHNSecsRH(bool asUTC=false) 12 { 13 enum sbinReprHandler; 14 static: 15 struct R { long value; } 16 17 R repr(in SysTime v) 18 { 19 static if (asUTC) return R(v.toUTC.stdTime); 20 else return R(v.stdTime); 21 } 22 23 SysTime fromRepr(in R r) 24 { 25 static if (asUTC) return SysTime(r.value, UTC()); 26 else return SysTime(r.value); 27 } 28 } 29 30 struct SysTimeAsUnixTimeRH(bool asUTC=false, bool use32bit=false) 31 { 32 enum sbinReprHandler; 33 static: 34 static if (use32bit) alias T = int; 35 else alias T = long; 36 37 struct R { T value; } 38 39 R repr(in SysTime v) 40 { 41 static if (asUTC) return R(v.toUTC.toUnixTime!T); 42 else return R(v.toUnixTime!T); 43 } 44 45 SysTime fromRepr(in R r) 46 { 47 static if (asUTC) return SysTime.fromUnixTime(r.value, UTC()); 48 else return SysTime.fromUnixTime(r.value); 49 } 50 } 51 52 struct BitArrayRH 53 { 54 enum sbinReprHandler; 55 static: 56 struct R 57 { 58 vluint bits; 59 const(void)[] data; 60 } 61 62 R repr(in BitArray v) { return R(vluint(v.length), cast(const(void)[])v); } 63 64 BitArray fromRepr(in R r) { return BitArray(r.data.dup, cast(size_t)r.bits.value); } 65 } 66 67 static if (__VERSION__ >= 2097) 68 { 69 import std.typecons : Nullable; 70 static import std.sumtype; 71 72 struct NullableAsSumTypeRH 73 { 74 enum sbinReprHandler; 75 static: 76 alias ST = std.sumtype.SumType; 77 78 auto repr(N)(in N n) 79 if (is(N == Nullable!X, X)) 80 { 81 alias R = ST!(typeof(null), typeof(N.init.get)); 82 return n.isNull ? R(null) : R(n.get); 83 } 84 85 auto fromRepr(N)(in N n) 86 if (is(N == ST!X, X...) && X.length == 2 && is(X[0] == typeof(null))) 87 { 88 alias R = Nullable!(N.Types[1]); 89 return n.match!( 90 (typeof(null) v) => R.init, 91 v => R(v) 92 ); 93 } 94 } 95 }