Example #1
0
        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;
        }
Example #2
0
        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;
        }
Example #3
0
        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)));
            }
        }