Exemplo n.º 1
0
        public TValue AddOrUpdate(TKey key, Func <TKey, TValue> addValueFactory, Func <TKey, TValue, TValue> updateValueFactory)
        {
            if (addValueFactory == null)
            {
                throw new ArgumentNullException("addValueFactory");
            }
            if (updateValueFactory == null)
            {
                throw new ArgumentNullException("updateValueFactory");
            }
            var needle = PrivateGetNeedle(key);
            Func <WeakNeedle <TKey>, TValue, TValue> factory = (pairKey, foundValue) =>
            {
                TKey foundKey;
                if (PrivateTryGetValue(pairKey, out foundKey))
                {
                    return(updateValueFactory(foundKey, foundValue));
                }
                return(addValueFactory(key));
            };
            Func <WeakNeedle <TKey>, TValue> valueFactory = input => addValueFactory(key);
            bool added;
            var  result = _wrapped.AddOrUpdate
                          (
                needle,
                valueFactory,
                factory,
                out added
                          );

            if (!added)
            {
                _reservoir.DonateNeedle(needle);
            }
            return(result);
        }
Exemplo n.º 2
0
        public TValue AddOrUpdate(TKey key, Func <TKey, TValue> addValueFactory, Func <TKey, TValue, TValue> updateValueFactory)
        {
            if (ReferenceEquals(addValueFactory, null))
            {
                throw new ArgumentNullException("addValueFactory");
            }
            if (ReferenceEquals(updateValueFactory, null))
            {
                throw new ArgumentNullException("updateValueFactory");
            }
            bool    added;
            TNeedle needle = PrivateGetNeedle(key);
            Func <TNeedle, TValue, TValue> factory = (pairKey, foundValue) =>
            {
                TKey foundKey;
                if (PrivateTryGetValue(pairKey, out foundKey))
                {
                    return(updateValueFactory(foundKey, foundValue));
                }
                return(addValueFactory(key));
            };
            Func <TNeedle, TValue> valueFactory = input => addValueFactory(key);
            var result = _wrapped.AddOrUpdate
                         (
                needle,
                valueFactory,
                factory,
                out added
                         );

            if (!added)
            {
                NeedleReservoir <TKey, TNeedle> .DonateNeedle(needle);
            }
            return(result);
        }