/// <summary>
        /// Instantiates the expression Bonsai serializer.
        /// </summary>
        /// <param name="version">Version of Bonsai to use.</param>
        /// <param name="liftMemoizer">The function memoizer to use for converting types to object serializers.</param>
        /// <param name="reduceMemoizer">The function memoizer to use for converting types to object deserializers.</param>
        public BonsaiExpressionSerializer(Version version, IMemoizer liftMemoizer, IMemoizer reduceMemoizer)
        {
            _version = version;

            _serializeConstant   = liftMemoizer?.Memoize <Func <Type, Func <object, Json.Expression> > >(GetConstantSerializer);
            _deserializeConstant = reduceMemoizer?.Memoize <Func <Type, Func <Json.Expression, object> > >(GetConstantDeserializer);
        }
Пример #2
0
        /// <summary>
        /// Creates a new evaluator factory using the specified <paramref name="memoizer"/> to cache the
        /// compiled delegates created by <see cref="ShouldCache(MemberInfo)"/>. A weak memoizer is used which
        /// can help to prevent the cache from keeping member objects and evaluator delegates alive.
        /// </summary>
        /// <param name="memoizer">The memoizer to use for caching <see cref="GetEvaluator(MemberInfo)"/> calls.</param>
        public MemoizingEvaluatorFactory(IWeakMemoizer memoizer)
        {
            if (memoizer == null)
            {
                throw new ArgumentNullException(nameof(memoizer));
            }

            _getEvaluator = memoizer.MemoizeWeak <MemberInfo, Delegate>(base.GetEvaluator);
        }
Пример #3
0
            public MemberInfoSlimHashingVisitor(ExpressionSlimHasher parent, TypeSlimHashingVisitor typeHasher, IMemoizer memoizer)
            {
                _parent     = parent;
                _typeHasher = typeHasher;

                // NB: We use reference equality for memoization in order to prevent the computation of another
                //     hash code through the overridden GetHashCode implementation on MemberInfoSlim. The use
                //     of reference equality is very effective within expressions and for reflection objects that
                //     come from a shared reflection context where reference-equal objects are returned.

                _visitCache = memoizer.Memoize(base.Visit, MemoizationOptions.None, ReferenceEqualityComparer <MemberInfoSlim> .Instance);
            }
Пример #4
0
 public Weak(Func <T, T> clone, IMemoizedDelegate <Func <T, WeakReference <T> > > @delegate)
 {
     _clone    = clone;
     _delegate = @delegate;
 }
Пример #5
0
 public Strong(IMemoizedDelegate <Func <T, T> > @delegate) => _delegate = @delegate;