示例#1
0
        /// <summary>
        /// Creates and returns set by deserialization
        /// </summary>
        /// <param name="reader">general reader</param>
        /// <param name="itemReader">item reader</param>
        /// <param name="concurrencyLevel">the concurrency level (all values less than 1024 will be assumed to be 1024)</param>
        public static ConcurrentBigSet <TItem> Deserialize(
            BinaryReader reader,
            Func <TItem> itemReader,
            int concurrencyLevel = DefaultConcurrencyLevel)
        {
            var count                  = reader.ReadInt32();
            var nodeLength             = reader.ReadInt32();
            var itemsPerBufferBitWidth = reader.ReadInt32();
            var capacity               = Math.Max(MinConcurrencyLevel, Math.Max(nodeLength, concurrencyLevel));

            var items = new BigBuffer <TItem>(itemsPerBufferBitWidth);

            items.Initialize(capacity);
            var nodes = new BigBuffer <Node>(NodesPerEntryBufferBitWidth);

            nodes.Initialize(capacity);

            var itemsAccessor = items.GetAccessor();
            var nodesAccessor = nodes.GetAccessor();

            List <int> freeNodes = new List <int>();

            for (int i = 0; i < nodeLength; i++)
            {
                var hashCode = reader.ReadInt32();
                if (hashCode != Node.UnusedHashCode)
                {
                    var next = reader.ReadInt32();
                    var item = itemReader();
                    nodesAccessor[i] = new Node(hashCode, next);
                    itemsAccessor[i] = item;
                }
                else
                {
                    freeNodes.Add(i);
                }
            }

            var buckets = Buckets.Deserialize(reader);
            var result  = new ConcurrentBigSet <TItem>(
                concurrencyLevel,
                items,
                nodes,
                buckets,
                nodeLength);

            result.m_count = count;

            // distribute free nodes
            var accessors = result.m_accessors;

            foreach (var i in freeNodes)
            {
                var lockNo = result.GetLockNo(i);
                result.AddFreeNode(lockNo, i, ref accessors);
            }

            return(result);
        }
示例#2
0
        public ConcurrentBigMap(ConcurrentBigSet <KeyValuePair <TKey, TValue> > backingSet, IEqualityComparer <TKey> keyComparer = null, IEqualityComparer <TValue> valueComparer = null)
        {
            Contract.RequiresNotNull(backingSet);

            BackingSet      = backingSet;
            m_keyComparer   = keyComparer ?? EqualityComparer <TKey> .Default;
            m_valueComparer = valueComparer ?? EqualityComparer <TValue> .Default;
        }
示例#3
0
        public static ConcurrentBigMap <TKey, TValue> Deserialize(
            BinaryReader reader,
            Func <KeyValuePair <TKey, TValue> > itemReader,
            int concurrencyLevel = ConcurrentBigSet <KeyValuePair <TKey, TValue> > .DefaultConcurrencyLevel,
            IEqualityComparer <TKey> keyComparer     = null,
            IEqualityComparer <TValue> valueComparer = null)
        {
            var set = ConcurrentBigSet <KeyValuePair <TKey, TValue> > .Deserialize(
                reader,
                itemReader,
                concurrencyLevel);

            return(new ConcurrentBigMap <TKey, TValue>(set, keyComparer, valueComparer));
        }
示例#4
0
 public ItemsCollection(ConcurrentBigSet <TItem> set)
 {
     m_set = set;
 }
示例#5
0
 public Accessors(ConcurrentBigSet <TItem> set)
 {
     Nodes = set.m_nodes.GetAccessor();
     Items = set.m_items.GetAccessor();
 }
示例#6
0
 /// <summary>
 /// Class constructor
 /// </summary>
 protected ScopedReferenceMap(IEqualityComparer <TKey>?keyComparer = null)
 {
     m_keyComparer = keyComparer ?? EqualityComparer <TKey> .Default;
     m_backingSet  = new ConcurrentBigSet <ScopedReferenceEntry>();
 }