internal DictionarySegment(DirtyTracker tracker, int size) { tracker = tracker.CreateChild(); this.tracker = tracker; this.count = 0; if (size == 0) { size = HashHelpers.GetPrime(size); } var newBuckets = new int[size]; for (int i = 0; i < newBuckets.Length; i++) { newBuckets[i] = -1; } this.buckets = newBuckets; this.entries = new DictionaryEntry <TKey, TValue> [size]; this.comparer = ZeroFormatterEqualityComparer <TKey> .Default; this.freeList = -1; this.freeCount = 0; this.mode = DictionarySegmentMode.LazyAll; }
DictionarySegment(DirtyTracker tracker, ArraySegment <byte> originalBytes) { tracker = tracker.CreateChild(); this.tracker = tracker; this.originalBytes = originalBytes; var bytes = originalBytes.Array; var offset = originalBytes.Offset + 4; this.count = BinaryUtil.ReadInt32(ref bytes, offset); offset += 4; var intListFormatter = Formatter <IList <int> > .Default; var entryListFormatter = Formatter <IList <DictionaryEntry <TKey, TValue> > > .Default; int size; this.buckets = intListFormatter.Deserialize(ref bytes, offset, tracker, out size); offset += size; this.entries = entryListFormatter.Deserialize(ref bytes, offset, tracker, out size); offset += size; // new size if (buckets.Count == 0) { var capacity = HashHelpers.GetPrime(0); Resize(capacity); } this.comparer = ZeroFormatterEqualityComparer <TKey> .Default; this.freeList = -1; this.freeCount = 0; this.mode = DictionarySegmentMode.LazyAll; }
internal static DictionarySegment <TKey, TValue> Create(DirtyTracker tracker, byte[] bytes, int offset, DictionarySegmentMode mode, out int byteSize) { var byteSizeOrCount = BinaryUtil.ReadInt32(ref bytes, offset); if (byteSizeOrCount == -1) { byteSize = 4; return(null); } if (mode == DictionarySegmentMode.Immediate) { var originalOffset = offset; var dict = new DictionarySegment <TKey, TValue>(tracker, byteSizeOrCount); var childTracker = dict.tracker; dict.tracker = DirtyTracker.NullTracker; // don't do dirty var keyFormatter = Formatter <TKey> .Default; var valueFormatter = Formatter <TValue> .Default; int size = 0; byteSize = 4; offset += 4; for (int i = 0; i < byteSizeOrCount; i++) { var key = keyFormatter.Deserialize(ref bytes, offset, tracker, out size); byteSize += size; offset += size; var value = valueFormatter.Deserialize(ref bytes, offset, tracker, out size); byteSize += size; offset += size; dict.Add(key, value); } dict.tracker = childTracker; dict.originalBytes = new ArraySegment <byte>(bytes, originalOffset, byteSize); dict.mode = DictionarySegmentMode.Immediate; return(dict); } else { byteSize = byteSizeOrCount; return(new DictionarySegment <TKey, TValue>(tracker, new ArraySegment <byte>(bytes, offset, byteSize))); } }