public override FSharpMap <TKey, TValue> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { // tracker.Dirty(); // immutable var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } ZeroFormatterSerializer.ValidateNewLength(length); var startOffset = offset; offset += 4; int size; var result = new Tuple <TKey, TValue> [length]; for (int i = 0; i < length; i++) { var kvp = kvpFormatter.Deserialize(ref bytes, offset, tracker, out size); result[i] = Tuple.Create(kvp.Key, kvp.Value); offset += size; } byteSize = offset - startOffset; return(MapModule.OfArray(result)); }
public override FSharpList <T> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { // tracker.Dirty(); FSharpList is immutable var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } var startOffset = offset; offset += 4; int size; ZeroFormatterSerializer.ValidateNewLength(length); var result = new T[length]; for (int i = 0; i < length; i++) { result[i] = formatter.Deserialize(ref bytes, offset, tracker, out size); offset += size; } byteSize = offset - startOffset; return(ListModule.OfArray(result)); }
public override ISet <T> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { tracker.Dirty(); // can not track so mark as dirty. var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } ZeroFormatterSerializer.ValidateNewLength(length); var startOffset = offset; offset += 4; int size; var comparer = ZeroFormatterEqualityComparer <T> .NondeterministicSafeFallbacked; var result = new HashSet <T>(comparer); for (int i = 0; i < length; i++) { result.Add(formatter.Deserialize(ref bytes, offset, tracker, out size)); offset += size; } byteSize = offset - startOffset; return(result); }
public override IReadOnlyDictionary <TKey, TValue> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { // tracker.Dirty(); // immutable var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } ZeroFormatterSerializer.ValidateNewLength(length); var startOffset = offset; offset += 4; int size; var comparer = ZeroFormatterEqualityComparer <TKey> .NondeterministicSafeFallbacked; var result = new Dictionary <TKey, TValue>(length, comparer); for (int i = 0; i < length; i++) { var kvp = formatter.Deserialize(ref bytes, offset, tracker, out size); result.Add(kvp.Key, kvp.Value); offset += size; } byteSize = offset - startOffset; return(result); }
public override T[] Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { tracker.Dirty(); // can not track so mark as dirty. var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } var startOffset = offset; offset += 4; int size; ZeroFormatterSerializer.ValidateNewLength(length); var result = new T[length]; for (int i = 0; i < length; i++) { result[i] = formatter.Deserialize(ref bytes, offset, tracker, out size); offset += size; } byteSize = offset - startOffset; return(result); }
public override ILookup <TKey, TElement> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { // tracker.Dirty(); // ilookup is immutable var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } ZeroFormatterSerializer.ValidateNewLength(length); var startOffset = offset; offset += 4; var lastOffset = offset; var lookup = DeserializeSequence(bytes, offset, tracker, length).ToLookup(x => x.Item1, x => { lastOffset = x.Item3; // capture in lambda is overhead but lookup can only create from ToLookup return(x.Item2); }); byteSize = lastOffset - startOffset; return(lookup); }
public override Int32[] Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { tracker.Dirty(); // can not track so mark as dirty. var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } else { byteSize = length * 4 + 4; } var arraySize = length * 4; ZeroFormatterSerializer.ValidateNewLength(arraySize); var result = new Int32[length]; Buffer.BlockCopy(bytes, offset + 4, result, 0, arraySize); return(result); }
public override TCollection Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { tracker.Dirty(); // can not track so mark as dirty. var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(default(TCollection)); } var startOffset = offset; offset += 4; int size; ZeroFormatterSerializer.ValidateNewLength(length); TCollection result; if (isList) { // optmize fixed length. result = (TCollection)(object)new List <TElement>(length); } else { result = new TCollection(); } for (int i = 0; i < length; i++) { result.Add(formatter.Deserialize(ref bytes, offset, tracker, out size)); offset += size; } byteSize = offset - startOffset; return(result); }
public override ILookup <TKey, TElement> Deserialize(ref byte[] bytes, int offset, DirtyTracker tracker, out int byteSize) { // tracker.Dirty(); // ilookup is immutable var length = BinaryUtil.ReadInt32(ref bytes, offset); if (length == -1) { byteSize = 4; return(null); } ZeroFormatterSerializer.ValidateNewLength(length); var startOffset = offset; offset += 4; var lastOffset = offset; var comparer = ZeroFormatterEqualityComparer <TKey> .NondeterministicSafeFallbacked; var sequence = new DeserializeSequence(bytes, offset, tracker, length, keyFormatter, valueFormatter); var lookup = sequence.ToLookup(x => x.Item1, x => x.Item2, comparer); byteSize = sequence.offset - startOffset; return(lookup); }