Beispiel #1
0
        /// <summary>
        /// All keys in the input set must be less than all keys in the current set OR all keys in the input set must be greater than all keys in the current set.
        /// </summary>
        public void Merge(IOrderedSet <TKey, TValue> set)
        {
            if (set.Count == 0)
            {
                return;
            }

            if (this.Count == 0)
            {
                foreach (var x in set) //set.Forward()
                {
                    list.Add(x);
                }

                return;
            }

            //Debug.Assert(comparer.Compare(this.Last.Key, set.First.Key) < 0 || comparer.Compare(this.First.Key, set.Last.Key) > 0);

            if (list != null)
            {
                int idx = kvComparer.Compare(set.Last, list[0]) < 0 ? 0 : list.Count;
                list.InsertRange(idx, set);
            }
            else if (dictionary != null)
            {
                foreach (var kv in set.InternalEnumerate())
                {
                    this.dictionary.Add(kv.Key, kv.Value); //there should be no exceptions
                }
            }
            else //if (set != null)
            {
                foreach (var kv in set.InternalEnumerate())
                {
                    this.set.Add(kv);
                }
            }
        }
        private void WriteRaw(BinaryWriter writer, IOrderedSet <IData, IData> data)
        {
            lock (data)
            {
                writer.Write(data.Count);
                writer.Write(data.IsInternallyOrdered);

                foreach (var kv in data.InternalEnumerate())
                {
                    keyPersist.Write(writer, kv.Key);
                    recordPersist.Write(writer, kv.Value);
                }
            }
        }
        private void WriteVertical(BinaryWriter writer, IOrderedSet <IData, IData> data)
        {
            KeyValuePair <IData, IData>[] rows;

            bool isInternallyOrdered;

            lock (data)
            {
                isInternallyOrdered = data.IsInternallyOrdered;

                rows = new KeyValuePair <IData, IData> [data.Count];
                int index = 0;
                foreach (var kv in data.InternalEnumerate())
                {
                    rows[index++] = kv;
                }

                CountCompression.Serialize(writer, checked ((ulong)rows.Length));
                writer.Write(data.IsInternallyOrdered);
            }

            Action[]       actions = new Action[2];
            MemoryStream[] streams = new MemoryStream[2];

            actions[0] = () =>
            {
                streams[0] = new MemoryStream();
                keyIndexerPersist.Store(new BinaryWriter(streams[0]), (idx) => { return(rows[idx].Key); }, rows.Length);
            };

            actions[1] = () =>
            {
                streams[1] = new MemoryStream();
                recordIndexerPersist.Store(new BinaryWriter(streams[1]), (idx) => { return(rows[idx].Value); }, rows.Length);
            };

            Parallel.Invoke(actions);

            foreach (var stream in streams)
            {
                using (stream)
                {
                    CountCompression.Serialize(writer, checked ((ulong)stream.Length));
                    writer.Write(stream.GetBuffer(), 0, (int)stream.Length);
                }
            }
        }