Ejemplo n.º 1
0
        public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
            where T : class
        {
            if (this is T context)
            {
                return(context);
            }

            if (PayloadCache.TryGetPayload <T>(out var payload))
            {
                return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory));
            }

            if (_context.TryGetPayload(out payload))
            {
                T Add()
                {
                    return(updateFactory(payload));
                }

                return(PayloadCache.AddOrUpdatePayload(Add, updateFactory));
            }

            return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 2
0
        T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (_right is T context)
            {
                return(context);
            }

            return(_left.AddOrUpdatePayload(addFactory, updateFactory));
        }
        /// <summary>
        /// Either adds a new payload, or updates an existing payload
        /// </summary>
        /// <param name="addFactory">The payload factory called if the payload is not present</param>
        /// <param name="updateFactory">The payload factory called if the payload already exists</param>
        /// <typeparam name="T">The payload type</typeparam>
        /// <returns></returns>
        public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (this is T context)
            {
                return(context);
            }

            return(ReceiveContext.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 4
0
        T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (_payloadCache != null)
            {
                return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory));
            }

            return(_context.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Either adds a new payload, or updates an existing payload
        /// </summary>
        /// <param name="addFactory">The payload factory called if the payload is not present</param>
        /// <param name="updateFactory">The payload factory called if the payload already exists</param>
        /// <typeparam name="T">The payload type</typeparam>
        /// <returns></returns>
        public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
            where T : class
        {
            if (this is T context)
            {
                return(context);
            }

            return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 6
0
        T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            // can't modify implicit payload types
            var context = _sourceContext as T;

            if (context != null)
            {
                return(context);
            }

            return(_context.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Either adds a new payload, or updates an existing payload
        /// </summary>
        /// <param name="addFactory">The payload factory called if the payload is not present</param>
        /// <param name="updateFactory">The payload factory called if the payload already exists</param>
        /// <typeparam name="T">The payload type</typeparam>
        /// <returns></returns>
        public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
            where T : class
        {
            // can't modify implicit payload types
            var context = this as T;

            if (context != null)
            {
                return(context);
            }

            return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 8
0
        T IPayloadCache.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (_payloadCache.TryGetPayload(out T existingPayload))
            {
                return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory));
            }

            if (_parentCache.TryGetPayload(out existingPayload))
            {
                T Add() => updateFactory(existingPayload);

                return(_payloadCache.AddOrUpdatePayload(Add, updateFactory));
            }

            return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 9
0
        T IPayloadCache.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            try
            {
                T previousValue           = null;
                IPayloadValue <T> context = null;

                IPayloadCollection currentCollection;
                do
                {
                    if (_collection.TryGetPayload(out T existingValue))
                    {
                        if (context == null || previousValue != existingValue)
                        {
                            context = new PayloadValue <T>(updateFactory(existingValue));
                        }

                        previousValue = existingValue;

                        currentCollection = Volatile.Read(ref _collection);

                        Interlocked.CompareExchange(ref _collection, currentCollection.Add(context), currentCollection);
                    }
                    else
                    {
                        if (context == null)
                        {
                            context = new PayloadValue <T>(addFactory());
                        }

                        currentCollection = Volatile.Read(ref _collection);

                        Interlocked.CompareExchange(ref _collection, currentCollection.Add(context), currentCollection);
                    }
                }while (currentCollection == Volatile.Read(ref _collection));

                return(context.Value);
            }
            catch (Exception exception)
            {
                throw new PayloadFactoryException($"The payload factory faulted: {TypeCache<T>.ShortName}", exception);
            }
        }
Ejemplo n.º 10
0
        public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (base.TryGetPayload <T>(out var existing) || _context.TryGetPayload(out existing))
            {
                T Update(T _)
                {
                    return(updateFactory(existing));
                }

                T Add()
                {
                    return(updateFactory(existing));
                }

                return(base.AddOrUpdatePayload(Add, Update));
            }

            return(base.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 11
0
        public override T AddOrUpdatePayload<T>(PayloadFactory<T> addFactory, UpdatePayloadFactory<T> updateFactory)
        {
            if (this is T context)
                return context;

            if (PayloadCache.TryGetPayload<T>(out var payload))
                return PayloadCache.AddOrUpdatePayload(addFactory, updateFactory);

            if (_context.TryGetPayload(out payload))
            {
                T Add()
                {
                    return updateFactory(payload);
                }

                return PayloadCache.AddOrUpdatePayload(Add, updateFactory);
            }

            return PayloadCache.AddOrUpdatePayload(addFactory, updateFactory);
        }
Ejemplo n.º 12
0
        public T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
            where T : class
        {
            lock (this)
            {
                if (_cache != null)
                {
                    for (int i = _cache.Count - 1; i >= 0; i--)
                    {
                        if (_cache[i] is T result)
                        {
                            var updated = updateFactory(result);

                            _cache[i] = updated;

                            return(updated);
                        }
                    }
                }

                T payload = addFactory();

                if (_cache != null)
                {
                    _cache.Add(payload);
                }
                else
                {
                    _cache = new List <object>(1)
                    {
                        payload
                    }
                };

                return(payload);
            }
        }
    }
        public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
        {
            if (this is T context)
            {
                return(context);
            }

            if (_context.TryGetPayload <T>(out var payload))
            {
                return(_context.AddOrUpdatePayload(addFactory, updateFactory));
            }

            if (base.TryGetPayload(out payload))
            {
                T Add()
                {
                    return(updateFactory(payload));
                }

                return(_context.AddOrUpdatePayload(Add, updateFactory));
            }

            return(_context.AddOrUpdatePayload(addFactory, updateFactory));
        }
Ejemplo n.º 14
0
 public abstract T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
     where T : class;
Ejemplo n.º 15
0
 T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
 {
     return(_context.AddOrUpdatePayload(addFactory, updateFactory));
 }
Ejemplo n.º 16
0
 public T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class
 {
     return(_context.AddOrUpdatePayload(addFactory, updateFactory));
 }
Ejemplo n.º 17
0
 T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory)
 {
     throw new ConsumeContextNotAvailableException();
 }