/// <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); }
/// <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); }
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); }
public Weak(Func <T, T> clone, IMemoizedDelegate <Func <T, WeakReference <T> > > @delegate) { _clone = clone; _delegate = @delegate; }
public Strong(IMemoizedDelegate <Func <T, T> > @delegate) => _delegate = @delegate;