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); } }
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); } } }
public void ConditionalSetOrRemove(KeyType key, UpdatePredicate <KeyType> predicate) { inner.ConditionalSetOrRemove(key, predicate); }
public void ConditionalSetOrAdd(KeyType key, UpdatePredicate <KeyType, ValueType> predicate) { inner.ConditionalSetOrAdd(key, predicate); }