Beispiel #1
0
        public void ConditionalSetOrAdd(KeyType key, UpdatePredicate <KeyType, ValueType> predicate)
        {
            if (predicate == null)
            {
                throw new ArgumentNullException();
            }

            ValueType value;
            bool      resident = TryGetValue(key, out value);

            uint version = this.version;
            List <EntryMap <KeyType, ValueType> > savedItems = items;

            items = new List <EntryMap <KeyType, ValueType> >();

            bool add = predicate(key, ref value, resident);

            items = savedItems;
            if (version != this.version)
            {
                throw new InvalidOperationException();
            }

            if (resident)
            {
                bool f = TrySetValue(key, value);
                Debug.Assert(f);
            }
            else if (add)
            {
                bool f = TryAdd(key, value);
                Debug.Assert(f);
            }
        }
        public void ConditionalSetOrRemove(KeyType key, UpdatePredicate <KeyType, ValueType> predicate)
        {
            KeyValue <KeyType, ValueType> kv;

            inner.TryGetKey(new KeyValue <KeyType, ValueType>(key), out kv);
            if (predicate != null)
            {
                inner.ConditionalSetOrRemove(
                    new KeyValue <KeyType, ValueType>(key, kv.value),
                    delegate(ref KeyValue <KeyType, ValueType> _key, bool resident)
                {
                    return(predicate(_key.key, ref _key.value, resident));
                });
            }
            else
            {
                inner.ConditionalSetOrRemove(
                    new KeyValue <KeyType, ValueType>(key, kv.value),
                    null);
            }
        }
Beispiel #3
0
        public void ConditionalSetOrRemove(KeyType key, UpdatePredicate <KeyType, ValueType> predicate)
        {
            if (predicate == null)
            {
                throw new ArgumentNullException();
            }

            ValueType value;
            bool      resident = TryGetValue(key, out value);

            uint version = inner.version;
            ReferenceMultiRankMap <KeyType, ValueType> savedInner = inner;

            inner         = new ReferenceMultiRankMap <KeyType, ValueType>();
            inner.version = savedInner.version;

            bool remove = predicate(key, ref value, resident);

            savedInner.version = inner.version;
            inner = savedInner;
            if (version != inner.version)
            {
                throw new InvalidOperationException();
            }

            if (resident)
            {
                if (remove)
                {
                    bool f = TryRemove(key);
                    Debug.Assert(f);
                }
                else
                {
                    bool f = TrySetValue(key, value);
                    Debug.Assert(f);
                }
            }
        }
Beispiel #4
0
 public void ConditionalSetOrRemove(KeyType key, UpdatePredicate <KeyType> predicate)
 {
     inner.ConditionalSetOrRemove(key, predicate);
 }
Beispiel #5
0
 public void ConditionalSetOrAdd(KeyType key, UpdatePredicate <KeyType, ValueType> predicate)
 {
     inner.ConditionalSetOrAdd(key, predicate);
 }