Esempio n. 1
0
        /// <summary>
        /// Returns a new set with all of the elements of this set, plus the value given as an argument [Time: log(this.Count)]
        /// </summary>
        /// <param name="value">The value to add</param>
        /// <returns>The new set containing <paramref name="value"/>.</returns>
        public Set <T> Add(T value)
        {
            bool        added;
            LobTree <T> newElems = LobTree <T> .Insert(elems, value, false, out added);

            return(added ? new Set <T>(count + 1, newElems) : this);
        }
Esempio n. 2
0
        /// <summary>
        /// Creates a map from the keys and values given as arguments.
        /// </summary>
        /// <param name="key1">The first key</param>
        /// <param name="value1">The value corresponding to <paramref name="key1"/></param>
        /// <param name="key2">The second key</param>
        /// <param name="value2">The value corresponding to <paramref name="key2"/></param>
        /// <param name="key3">The third key</param>
        /// <param name="value3">The value corresponding to <paramref name="key3"/></param>
        /// <param name="key4">The fourth key</param>
        /// <param name="value4">The value corresponding to <paramref name="key4"/></param>
        public Map(T key1, S value1, T key2, S value2, T key3, S value3, T key4, S value4)
        {
            LobTree <Maplet> /*?*/ newElems = null;
            bool added;
            int  newCount = 1;

            newElems = LobTree <Maplet> .Insert(newElems, new Maplet(new Pair <T, S>(key1, value1)), true, out added);

            //^ assert added;
            newElems = LobTree <Maplet> .Insert(newElems, new Maplet(new Pair <T, S>(key2, value2)), true, out added);

            if (added)
            {
                newCount += 1;
            }
            newElems = LobTree <Maplet> .Insert(newElems, new Maplet(new Pair <T, S>(key3, value3)), true, out added);

            if (added)
            {
                newCount += 1;
            }
            newElems = LobTree <Maplet> .Insert(newElems, new Maplet(new Pair <T, S>(key4, value4)), true, out added);

            if (added)
            {
                newCount += 1;
            }
            this.count = newCount;
            this.elems = newElems;
        }
Esempio n. 3
0
        /// <summary>
        /// Returns a new set containing every element of this set except the value given as a parameter.
        /// If value is not in this set, then returns this set. [Time: log(this.Count)]
        /// </summary>
        /// <param name="value">The value to be deleted.</param>
        /// <returns>The new set that does not contain <paramref name="value"/>.</returns>
        public Set <T> Remove(T value)
        //^ ensures !this.Contains(value) <==> ((object)this == result);  // pointer equals iff value not contained
        //^ ensures this.Contains(value) <==> (result.Count + 1 == this.Count);
        {
            bool deleted = false;
            LobTree <T> /*?*/ newElems = LobTree <T> .Remove(this.elems, value, out deleted);

            return(deleted ? new Set <T>(count - 1, newElems) : this);
        }
Esempio n. 4
0
        /// <summary>
        /// Creates a map from the key and value given as arguments.
        /// </summary>
        /// <param name="key1">The key</param>
        /// <param name="value1">The value corresponding to <paramref name="key1"/></param>
        public Map(T key1, S value1)
        {
            LobTree <Maplet> /*?*/ newElems = null;
            bool added;

            newElems = LobTree <Maplet> .Insert(newElems, new Maplet(new Pair <T, S>(key1, value1)), true, out added);

            //^ assert added;
            this.count = 1;
            this.elems = newElems;
        }
Esempio n. 5
0
        private void InPlaceRemove(T value)
        {
            bool deleted = false;

            elems = LobTree <T> .Remove(elems, value, out deleted);

            if (deleted)
            {
                count -= 1;
                this.InvalidateCache();
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Removes the key-value pair from the map
        /// </summary>
        /*internal*/
        private void InPlaceRemove(Pair <T, S> d)
        {
            bool deleted = false;

            this.elems = LobTree <Maplet> .Remove(elems, new Maplet(d), out deleted);

            this.InvalidateCache();
            if (deleted)
            {
                count -= 1;
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Removes the element with the specified key from the map
        /// </summary>
        private void InPlaceRemoveKey(T /*!*/ key)
        {
            bool deleted;

            this.elems = LobTree <Maplet> .Remove(elems, new Maplet(new Pair <T, S>(key, default(S))), out deleted);

            this.InvalidateCache();
            if (deleted)
            {
                count -= 1;
            }
        }
Esempio n. 8
0
        //private void InPlaceAdd(Maplet/*!*/ m)
        //{
        //    bool added;
        //    this.elems = LobTree<Maplet>.Insert(elems, m, true, out added);
        //    hashCode = null;
        //    if (added)
        //        count++;
        //    else
        //    {
        //        throw new Exception(String.Format("Map.Add: Duplicate key '{0}'", (/*^(!)^*/m.d.First).ToString()));
        //    }
        //}
        /// <summary>
        /// Adds an element with the specified key and value into the map [Time: log(this.Count)]
        /// </summary>
        private void InPlaceOverride(Pair <T, S> d)
        {
            bool added;

            this.elems = LobTree <Maplet> .Insert(elems, new Maplet(d), true, out added);

            this.InvalidateCache();
            if (added)
            {
                count += 1;
            }
        }
Esempio n. 9
0
        private int InPlaceAdd(T value)
        {
            bool added;

            elems = LobTree <T> .Insert(elems, value, false, out added);

            if (added)
            {
                count += 1;
                this.InvalidateCache();
            }
            return(count);
        }
Esempio n. 10
0
        /// <summary>
        /// Construct a set from the elements given in the argument list
        /// </summary>
        /// <param name="elements">The argument list</param>
        public Set(params T[] elements)
        {
            int newCount = 0;
            LobTree <T> /*?*/ newElems = null;
            bool added = false;

            foreach (T o in elements)
            {
                newElems = LobTree <T> .Insert(newElems, o, false, out added);

                if (added)
                {
                    newCount += 1;
                }
            }
            this.count = newCount;
            this.elems = newElems;
        }
Esempio n. 11
0
        public Map(params Pair <T, S>[] keyValuePairs)
        {
            LobTree <Maplet> /*?*/ newElems = null;
            int newCount = 0;

            foreach (Pair <T, S> d in keyValuePairs)
            {
                bool added;
                newElems = LobTree <Maplet> .Insert(newElems, new Maplet(d), true, out added);

                if (added)
                {
                    newCount += 1;
                }
            }

            this.count = newCount;
            this.elems = newElems;
        }
Esempio n. 12
0
        [SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals")] // want to use "found" var
        private void InPlaceAdd(T key, S value)
        {
            bool             added;
            LobTree <Maplet> newElems = LobTree <Maplet> .Insert(elems, new Maplet(new Pair <T, S>(key, value)), true, out added);

            if (!added)
            {
                S    previousValue;
                bool found = this.TryGetValue(key, out previousValue);
                //^ assume found;
                if (!Object.Equals(value, previousValue))
                {
                    throw new ArgumentException(MessageStrings.LocalizedFormat(MessageStrings.MapAddInvalidArgument, key.ToString()));
                }
            }
            else
            {
                this.count += 1;
            }
            this.elems = newElems;
            this.InvalidateCache();
        }
Esempio n. 13
0
 private Set(int count, LobTree <T> /*?*/ elems)
 {
     this.count = count;
     this.elems = elems;
 }
Esempio n. 14
0
 private Map(int count, LobTree <Maplet> /*?*/ elems)
 {
     this.count = count; this.elems = elems;
 }