public static Dictionary <Tkey, Tval> ReadMap <Tkey, Tval>(SpanStream r) where Tkey : unmanaged where Tval : unmanaged { // sum of bitsizes of each member uint cardinality = r.ReadUInt32(); int numElements = r.ReadInt32(); BitSet available = new BitSet(ReadArray <UInt32>(r)); BitSet deleted = new BitSet(ReadArray <UInt32>(r)); int keySize = Marshal.SizeOf <Tkey>(); int valueSize = Marshal.SizeOf <Tval>(); Dictionary <Tkey, Tval> map = new Dictionary <Tkey, Tval>(numElements); for (int i = 0; i < numElements; i++) { if (!available.Contains(i)) { continue; } unsafe { fixed(byte *pKey = r.ReadBytes(keySize)) fixed(byte *pVal = r.ReadBytes(valueSize)) { Tkey key = *(Tkey *)pKey; Tval val = *(Tval *)pVal; map.Add(key, val); } } } return(map); }
public static T[] ReadArray <T>(SpanStream r) where T : unmanaged { uint numElements = r.ReadUInt32(); T[] arr = new T[numElements]; int tSize = Marshal.SizeOf <T>(); for (int i = 0; i < numElements; i++) { unsafe { fixed(byte *data = r.ReadBytes(tSize)) { T element = *(T *)data; arr.SetValue(element, i); } } } return(arr); }
public static byte[] ReadBuffer(SpanStream r) { int numBytes = r.ReadInt32(); return(r.ReadBytes(numBytes)); }