Esempio n. 1
0
        /// <summary>
        /// Creates a new dot product expression.
        /// </summary>
        /// <param name="components">The ordered components of the two vectors in the order of first vectors coordinates then second vectors coordinates (ex: x0,y0,x1,y1).</param>
        /// <param name="reductionExpressionGenerator">The optional expression generator that can be used to produce reduced expressions.</param>
        public DotProductExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
            : base(reductionExpressionGenerator)
        {
            if (null == components)
            {
                throw new ArgumentNullException("components");
            }
            if (components.Length == 0)
            {
                throw new ArgumentException("Must have at least 1 component.", "components");
            }
            if (components.Length % 2 != 0)
            {
                throw new ArgumentException("Must have an even number of components.", "components");
            }
            Contract.Requires(Contract.ForAll(components, x => x != null));
            Contract.Ensures(Components != null);

            Components = components; // TODO: clone?

            if (Components.ContainsNull())
            {
                throw new ArgumentException("All components expressions must be non null.", "components");
            }
        }
Esempio n. 2
0
        public static Expression BuildConversionCall(this IExpressionGenerator gen, MethodInfo method, Expression input, Type resultType)
        {
            Contract.Requires(gen != null);
            Contract.Requires(method != null);
            Contract.Requires(input != null);

            var methodParams = method.GetParameters();

            if (methodParams.Length > 0)
            {
                Contract.Assume(methodParams[0] != null);
                var paramType = methodParams[0].ParameterType;
                if (input.Type != paramType)
                {
                    input = gen.GenerateConversionOrThrow(paramType, input);
                }
            }

            Expression result = method.BuildCallExpression(input);

            if (resultType != null && result.Type != resultType)
            {
                result = gen.GenerateConversionOrThrow(resultType, result);
            }

            return(result);
        }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SingleInstanceProvider"/> class.
 /// </summary>
 /// <param name="type">
 /// The type.
 /// </param>
 /// <param name="generator">
 /// The generator.
 /// </param>
 public SingleInstanceProvider(Type type, IExpressionGenerator generator)
 {
     this.type = type;
     this.generator = generator;
     this.instance = new Lazy<object>(this.CreateInstance);
     this.expression = new Lazy<Expression>(() => this.generator.GenerateExpression(this.type));
 }
Esempio n. 4
0
 /// <summary>
 /// Creates a new dot product expression.
 /// </summary>
 /// <param name="components">The ordered components of the two vectors in the order of first vectors coordinates then second vectors coordinates (ex: x0,y0,x1,y1).</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator that can be used to produce reduced expressions.</param>
 public DistanceExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
     : this(new SquaredDistanceExpression(components, reductionExpressionGenerator), reductionExpressionGenerator) {
     Contract.Requires(components != null);
     Contract.Requires(components.Length != 0);
     Contract.Requires(components.Length % 2 == 0);
     Contract.Requires(Contract.ForAll(components, x => null != x));
 }
Esempio n. 5
0
        [ContractVerification(false)] // TODO: remove when CC bugs are fixed
        public FunctionExpressionGenerationRequest(IExpressionGenerator generator, string expressionName, params Expression[] inputs)
        {
            if (null == generator)
            {
                throw new ArgumentNullException("generator");
            }
            if (String.IsNullOrEmpty(expressionName))
            {
                throw new ArgumentException("Invalid expression name.", "expressionName");
            }
            if (null == inputs)
            {
                throw new ArgumentNullException("inputs");
            }
            if (inputs.Length == 0)
            {
                throw new ArgumentException("At least one input expression is required.", "inputs");
            }
            Contract.Requires(Contract.ForAll(inputs, x => x != null));

            TopLevelGenerator = generator;
            ExpressionName    = expressionName;
            _inputExpressions = inputs; // TODO: consider a clone

            if (_inputExpressions.ContainsNull())
            {
                throw new ArgumentException("No expressions may not be null", "inputs");
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="TransientInstanceProvider"/> class.
 /// </summary>
 /// <param name="type">
 /// The type.
 /// </param>
 /// <param name="expressionGenerator">
 /// The expression generator.
 /// </param>
 public TransientInstanceProvider(Type type, IExpressionGenerator expressionGenerator)
 {
     this.type = type;
     this.generator = expressionGenerator;
     this.func = new Lazy<Func<object>>(this.CreateObjectFunc);
     this.expression = new Lazy<Expression>(() => this.generator.GenerateExpression(this.type));
 }
Esempio n. 7
0
 /// <summary>
 /// Creates a new magnitude expression.
 /// </summary>
 /// <param name="components">The coordinate expressions.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 public MagnitudeExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
     : this(new SquaredMagnitudeExpression(components, reductionExpressionGenerator), reductionExpressionGenerator)
 {
     Contract.Requires(components != null);
     Contract.Requires(components.Length != 0);
     Contract.Requires(Contract.ForAll(components, x => x != null));
 }
Esempio n. 8
0
        public static Expression BuildConversionCall(this IExpressionGenerator gen, MethodInfo method, Type resultType, params Expression[] inputExpressions)
        {
            Contract.Requires(gen != null);
            Contract.Requires(method != null);
            Contract.Requires(inputExpressions != null);
            Contract.Requires(Contract.ForAll(inputExpressions, x => x != null));

            var methodParams = method.GetParameters();

            if (methodParams.Length != inputExpressions.Length)
            {
                throw new ArgumentException(String.Format("{0} input expressions are required.", methodParams.Length));
            }

            for (int i = 0; i < methodParams.Length; i++)
            {
                Contract.Assume(methodParams[i] != null);
                var paramType       = methodParams[i].ParameterType;
                var inputExpression = inputExpressions[i];
                if (inputExpression.Type != paramType)
                {
                    inputExpressions[i] = gen.GenerateConversionOrThrow(paramType, inputExpression);
                }
            }

            Expression result = method.BuildCallExpression(inputExpressions);

            if (resultType != null && result.Type != resultType)
            {
                result = gen.GenerateConversionOrThrow(resultType, result);
            }

            return(result);
        }
Esempio n. 9
0
 /// <summary>
 /// Creates a new dot product expression.
 /// </summary>
 /// <param name="components">The ordered components of the two vectors in the order of first vectors coordinates then second vectors coordinates (ex: x0,y0,x1,y1).</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator that can be used to produce reduced expressions.</param>
 public DistanceExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
     : this(new SquaredDistanceExpression(components, reductionExpressionGenerator), reductionExpressionGenerator)
 {
     Contract.Requires(components != null);
     Contract.Requires(components.Length != 0);
     Contract.Requires(components.Length % 2 == 0);
     Contract.Requires(Contract.ForAll(components, x => null != x));
 }
 /// <summary>
 /// Creates a new expression request.
 /// </summary>
 /// <param name="generator">The expression generator to use.</param>
 /// <param name="expressionName">The name of the requested expression.</param>
 /// <param name="resultType">The desired result type of the expression.</param>
 /// <returns>A new expression generation request.</returns>
 public static IExpressionGenerationRequest NewRequest(this IExpressionGenerator generator, string expressionName, Type resultType)
 {
     Contract.Requires(null != generator);
     Contract.Requires(!String.IsNullOrEmpty(expressionName));
     Contract.Requires(null != resultType);
     Contract.Ensures(Contract.Result <IExpressionGenerationRequest>() != null);
     return(new ConstantExpressionGenerationRequest(generator, expressionName, resultType));
 }
 /// <summary>
 /// Creates a new reducible expression with the given single parameter.
 /// </summary>
 /// <param name="unaryParameter">The single input parameter for the expression.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 protected ReducibleUnaryExpressionBase(
     Expression unaryParameter,
     IExpressionGenerator reductionExpressionGenerator = null
 ) : base(reductionExpressionGenerator) {
     if (null == unaryParameter) throw new ArgumentNullException("unaryParameter");
     Contract.EndContractBlock();
     UnaryParameter = unaryParameter;
 }
 /// <summary>
 /// Creates a new conversion expression request.
 /// </summary>
 /// <param name="generator">The expression generator to use.</param>
 /// <param name="resultType">The desired result type of the conversion expression.</param>
 /// <param name="input">The input expression to be converted.</param>
 /// <returns>A new expression generation request.</returns>
 public static IExpressionGenerationRequest NewConversionRequest(this IExpressionGenerator generator, Type resultType, Expression input)
 {
     Contract.Requires(null != generator);
     Contract.Requires(null != resultType);
     Contract.Requires(null != input);
     Contract.Ensures(Contract.Result <IExpressionGenerationRequest>() != null);
     return(new ConversionExpressionRequest(generator, input, resultType));
 }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="input">The requested input for the expression.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression Generate(this IExpressionGenerator generator, string expressionName, Expression input)
        {
            Contract.Requires(generator != null);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(input != null);
            var request = NewRequest(generator, expressionName, input);

            return(generator.Generate(request));
        }
Esempio n. 14
0
 private MagnitudeExpression(SquaredMagnitudeExpression innerExpression, IExpressionGenerator reductionExpressionGenerator = null)
 {
     if (innerExpression == null)
     {
         throw new ArgumentNullException("innerExpression");
     }
     Contract.EndContractBlock();
     InnerExpression = innerExpression;
 }
        /// <summary>
        /// Creates a new conversion expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="resultType">The desired result type of the expression to convert to.</param>
        /// <param name="input">The input expression to convert from.</param>
        /// <returns>A new requested conversion expression or null if one could not be generated.</returns>
        public static Expression GenerateConversion(this IExpressionGenerator generator, Type resultType, Expression input)
        {
            Contract.Requires(null != generator);
            Contract.Requires(null != resultType);
            Contract.Requires(null != input);
            var request = NewConversionRequest(generator, resultType, input);

            return(generator.Generate(request));
        }
 /// <summary>
 /// Creates a new function expression generation request. This request is for a function that accepts one or more expressions as input.
 /// </summary>
 /// <param name="generator">The primary generator to be used for the generation of sub expressions.</param>
 /// <param name="expressionName">The name of the requested constant.</param>
 /// <param name="resultType">The desired type of the constant.</param>
 public ConstantExpressionGenerationRequest(IExpressionGenerator generator, string expressionName, Type resultType) {
     if (null == generator) throw new ArgumentNullException("generator");
     if (String.IsNullOrEmpty(expressionName)) throw new ArgumentException("Invalid expression name.", "expressionName");
     if (null == resultType) throw new ArgumentNullException("resultType");
     Contract.EndContractBlock();
     TopLevelGenerator = generator;
     ExpressionName = expressionName;
     DesiredResultType = resultType;
 }
 /// <summary>
 /// Creates a new function expression generation request. This request is for a function that accepts one or more expressions as input.
 /// </summary>
 /// <param name="generator">The primary generator to be used for the generation of sub expressions.</param>
 /// <param name="inputExpression">The name of the requested constant.</param>
 /// <param name="resultType">The desired type of the constant.</param>
 public ConversionExpressionRequest(IExpressionGenerator generator, Expression inputExpression, Type resultType) {
     if (null == generator) throw new ArgumentNullException("generator");
     if (null == inputExpression) throw new ArgumentNullException("inputExpression");
     if (null == resultType) throw new ArgumentNullException("resultType");
     Contract.EndContractBlock();
     TopLevelGenerator = generator;
     InputExpression = inputExpression;
     DesiredResultType = resultType;
 }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="resultType">The desired result type of the expression.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression Generate(this IExpressionGenerator generator, string expressionName, Type resultType)
        {
            Contract.Requires(null != generator);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(null != resultType);
            var request = NewRequest(generator, expressionName, resultType);

            return(generator.Generate(request));
        }
Esempio n. 19
0
 private DistanceExpression(SquaredDistanceExpression innerExpression, IExpressionGenerator reductionExpressionGenerator = null)
     : base(reductionExpressionGenerator)
 {
     if (innerExpression == null)
     {
         throw new ArgumentNullException("innerExpression");
     }
     Contract.EndContractBlock();
     InnerExpression = innerExpression;
 }
Esempio n. 20
0
 public Stage(IMode mode)
 {
     if (mode == null)
     {
         throw new ArgumentNullException("mode");
     }
     _mode           = mode;
     _generator      = new ExpressionGenerator(mode);
     _questionNumber = _mode.Operand.Random;
 }
 /// <summary>
 /// Creates a new expression request.
 /// </summary>
 /// <param name="generator">The expression generator to use.</param>
 /// <param name="expressionName">The name of the requested expression.</param>
 /// <param name="inputExpressions">The requested inputs for the expression.</param>
 /// <returns>A new expression generation request.</returns>
 public static IExpressionGenerationRequest NewRequest(this IExpressionGenerator generator, string expressionName, params Expression[] inputExpressions)
 {
     Contract.Requires(null != generator);
     Contract.Requires(!String.IsNullOrEmpty(expressionName));
     Contract.Requires(null != inputExpressions);
     Contract.Requires(inputExpressions.Length != 0);
     Contract.Requires(Contract.ForAll(inputExpressions, x => x != null));
     Contract.Ensures(Contract.Result <IExpressionGenerationRequest>() != null);
     return(new FunctionExpressionGenerationRequest(generator, expressionName, inputExpressions));
 }
 /// <summary>
 /// Creates a new reducible expression with the given left and right parameters.
 /// </summary>
 /// <param name="leftParameter">The first or left parameter.</param>
 /// <param name="rightParameter">The second or right parameter.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 protected ReducibleBinaryExpressionBase(
     Expression leftParameter,
     Expression rightParameter,
     IExpressionGenerator reductionExpressionGenerator = null
 ) : base(reductionExpressionGenerator) {
     if (null == leftParameter) throw new ArgumentNullException("leftParameter");
     if (null == rightParameter) throw new ArgumentNullException("rightParameter");
     Contract.EndContractBlock();
     LeftParameter = leftParameter;
     RightParameter = rightParameter;
 }
        /// <summary>
        /// Creates a new squared magnitude expression.
        /// </summary>
        /// <param name="components">The coordinate expressions.</param>
        /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
        public SquaredMagnitudeExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
            : base(reductionExpressionGenerator) {
            if (null == components) throw new ArgumentNullException("components");
            if (components.Length == 0) throw new ArgumentException("Must have at least 1 component.", "components");
            Contract.Requires(Contract.ForAll(components, x => x != null));

            Components = components; // TODO: clone?

            if (Components.ContainsNull())
                throw new ArgumentException("All components expressions must be non null.", "components");
        }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="inputExpressions">The requested inputs for the expression.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression Generate(this IExpressionGenerator generator, string expressionName, params Expression[] inputExpressions)
        {
            Contract.Requires(null != generator);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(null != inputExpressions);
            Contract.Requires(inputExpressions.Length != 0);
            Contract.Requires(Contract.ForAll(inputExpressions, x => x != null));
            var request = NewRequest(generator, expressionName, inputExpressions);

            return(generator.Generate(request));
        }
Esempio n. 25
0
        public IExpressionGenerator Create(IEnumerable <Type> functionTypeSamples)
        {
            IExpressionGenerator expressionGenerator = null;

            expressionGenerator = new ExpressionGenerator(new ConstantExpressionGenerator(),
                                                          new FunctionExpressionGenerator(new FunctionMetadataResolver(new TypeSamplesAndSuffixConventionBasedFunctionNameToMetadataMapFactory(functionTypeSamples,
                                                                                                                                                                                               new FunctionContractProvider())),
                                                                                          new FunctionArgumentExpressionsGenerator(new FunctionArgumentExpressionGenerator(new Lazy <IExpressionGenerator>(() => expressionGenerator)))),
                                                          new BatchExpressionGenerator(new Lazy <IExpressionGenerator>(() => expressionGenerator)));

            return(expressionGenerator);
        }
Esempio n. 26
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TypeRegistration"/> class.
        /// </summary>
        /// <param name="concreteType">
        /// The concrete type.
        /// </param>
        /// <param name="generator">
        /// The generator.
        /// </param>
        /// <param name="providerFactory">
        /// The provider factory.
        /// </param>
        public TypeRegistration(Type concreteType, IExpressionGenerator generator, IInstanceProviderFactory providerFactory)
        {
            Guard.ArgumentNotNull(concreteType, "concreteType");
            Guard.ArgumentNotNull(generator, "generator");
            Guard.ArgumentNotNull(providerFactory, "providerFactory");

            this.concreteType = concreteType;
            this.providerFactory = providerFactory;
            this.Generator = generator;

            this.provider = new Lazy<IInstanceProvider>(this.CreateProvider);
        }
        /// <summary>
        /// Creates a new dot product expression.
        /// </summary>
        /// <param name="components">The ordered components of the two vectors in the order of first vectors coordinates then second vectors coordinates (ex: x0,y0,x1,y1).</param>
        /// <param name="reductionExpressionGenerator">The optional expression generator that can be used to produce reduced expressions.</param>
        public SquaredDistanceExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
            : base(reductionExpressionGenerator) {
            if (null == components) throw new ArgumentNullException("components");
            if (components.Length == 0) throw new ArgumentException("Must have at least 1 component.", "components");
            if (components.Length % 2 != 0) throw new ArgumentException("Must have an even number of components.", "components");
            Contract.Requires(components.All(x => null != x));

            Components = components; // TODO: clone?

            if (Components.ContainsNull())
                throw new ArgumentException("All components expressions must be non null.", "components");
        }
 /// <summary>
 /// Creates a new reducible expression with the given single parameter.
 /// </summary>
 /// <param name="unaryParameter">The single input parameter for the expression.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 protected ReducibleUnaryExpressionBase(
     Expression unaryParameter,
     IExpressionGenerator reductionExpressionGenerator = null
     ) : base(reductionExpressionGenerator)
 {
     if (null == unaryParameter)
     {
         throw new ArgumentNullException("unaryParameter");
     }
     Contract.EndContractBlock();
     UnaryParameter = unaryParameter;
 }
        /// <summary>
        /// Creates a new conversion expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="resultType">The desired result type of the expression to convert to.</param>
        /// <param name="input">The input expression to convert from.</param>
        /// <returns>A new requested conversion expression or null if one could not be generated.</returns>
        public static Expression GenerateConversionOrThrow(this IExpressionGenerator generator, Type resultType, Expression input)
        {
            Contract.Requires(null != generator);
            Contract.Requires(null != resultType);
            Contract.Requires(null != input);
            var request = NewConversionRequest(generator, resultType, input);
            var result  = generator.Generate(request);

            if (result == null)
            {
                throw InvalidOpConversion(input.Type, resultType);
            }
            return(result);
        }
        [ContractVerification(false)] // TODO: remove when CC bugs are fixed
        public FunctionExpressionGenerationRequest(IExpressionGenerator generator, string expressionName, params Expression[] inputs) {
            if (null == generator) throw new ArgumentNullException("generator");
            if (String.IsNullOrEmpty(expressionName)) throw new ArgumentException("Invalid expression name.", "expressionName");
            if (null == inputs) throw new ArgumentNullException("inputs");
            if (inputs.Length == 0) throw new ArgumentException("At least one input expression is required.", "inputs");
            Contract.Requires(Contract.ForAll(inputs, x => x != null));

            TopLevelGenerator = generator;
            ExpressionName = expressionName;
            _inputExpressions = inputs; // TODO: consider a clone

            if (_inputExpressions.ContainsNull())
                throw new ArgumentException("No expressions may not be null", "inputs");
        }
Esempio n. 31
0
        /// <summary>
        /// Creates a new basic generic operations implementation using the given expression generator.
        /// </summary>
        /// <param name="expressionGenerator">The expression generator that will be used to build the generic methods at run-time.</param>
        public BasicOperations(IExpressionGenerator expressionGenerator)
        {
            if (null == expressionGenerator)
            {
                throw new ArgumentNullException("expressionGenerator");
            }
            Contract.EndContractBlock();
            ExpressionGenerator = expressionGenerator;

            Add      = BuildBinaryFunc("Add");
            Subtract = BuildBinaryFunc("Subtract");
            Multiply = BuildBinaryFunc("Multiply");
            Divide   = BuildBinaryFunc("Divide");
            Negate   = BuildUnaryFunc("Negate");
            Sin      = BuildUnaryFunc("Sin");
            Cos      = BuildUnaryFunc("Cos");
            Tan      = BuildUnaryFunc("Tan");
            Asin     = BuildUnaryFunc("Asin");
            Acos     = BuildUnaryFunc("Acos");
            Atan     = BuildUnaryFunc("Atan");
            Sinh     = BuildUnaryFunc("Sinh");
            Cosh     = BuildUnaryFunc("Cosh");
            Tanh     = BuildUnaryFunc("Tanh");
            Asinh    = BuildUnaryFunc("Asinh");
            Acosh    = BuildUnaryFunc("Acosh");
            Atanh    = BuildUnaryFunc("Atanh");
            Log      = BuildUnaryFunc("Log");
            Log10    = BuildUnaryFunc("Log10");
            Exp      = BuildUnaryFunc("Exp");
            Abs      = BuildUnaryFunc("Abs");
            Atan2    = BuildBinaryFunc <ReverseCoordinates, TValue>("Atan2");
            Pow      = BuildBinaryFunc("Pow");
            Ceiling  = BuildUnaryFunc("Ceiling");
            Floor    = BuildUnaryFunc("Floor");
            Truncate = BuildUnaryFunc("Truncate");
            Min      = BuildBinaryFunc("Min");
            Max      = BuildBinaryFunc("Max");

            Equal          = BuildBinaryFunc <ComparisonTest, bool>("Equal");
            NotEqual       = BuildBinaryFunc <ComparisonTest, bool>("NotEqual");
            Less           = BuildBinaryFunc <ComparisonTest, bool>("Less");
            LessOrEqual    = BuildBinaryFunc <ComparisonTest, bool>("LessEqual");
            Greater        = BuildBinaryFunc <ComparisonTest, bool>("Greater");
            GreaterOrEqual = BuildBinaryFunc <ComparisonTest, bool>("GreaterOrEqual");
            CompareTo      = BuildBinaryFunc <Comparison <TValue>, int>("CompareTo");

            ToDouble            = BuildConversion <TValue, double>();
            FromDouble          = BuildConversion <double, TValue>();
            _zeroValueGenerator = BuildConstant("0");
        }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="resultType">The desired result type of the expression.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression GenerateOrThrow(this IExpressionGenerator generator, string expressionName, Type resultType)
        {
            Contract.Requires(null != generator);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(null != resultType);
            Contract.Ensures(Contract.Result <Expression>() != null);
            var request = NewRequest(generator, expressionName, resultType);
            var result  = generator.Generate(request);

            if (result == null)
            {
                throw InvalidOp(expressionName, resultType);
            }
            return(result);
        }
Esempio n. 33
0
        /// <summary>
        /// Creates a new vector operation implementation using the given expression generator.
        /// </summary>
        /// <param name="expressionGenerator">The expression generator which is used to generate expression for the generic operations at run-time.</param>
        public VectorOperations(IExpressionGenerator expressionGenerator)
        {
            if (null == expressionGenerator)
            {
                throw new ArgumentNullException("expressionGenerator");
            }
            Contract.EndContractBlock();
            ExpressionGenerator = expressionGenerator;

            Magnitude2D               = CreateCoordinateToValue2D("Magnitude");
            SquaredMagnitude2D        = CreateCoordinateToValue2D("SquaredMagnitude");
            DotProduct2D              = CreateTwoCoordinateToValue2D("DotProduct");
            PerpendicularDotProduct2D = CreatePerpendicularDotProduct2D();
            Distance2D        = CreateTwoCoordinateToValue2D("Distance");
            DistanceSquared2D = CreateTwoCoordinateToValue2D("SquaredDistance");
        }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="inputExpressions">The requested inputs for the expression.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression GenerateOrThrow(this IExpressionGenerator generator, string expressionName, params Expression[] inputExpressions)
        {
            Contract.Requires(null != generator);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(null != inputExpressions);
            Contract.Requires(inputExpressions.Length != 0);
            Contract.Requires(Contract.ForAll(inputExpressions, x => x != null));
            Contract.Ensures(Contract.Result <Expression>() != null);
            var request = NewRequest(generator, expressionName, inputExpressions);
            var result  = generator.Generate(request);

            if (result == null)
            {
                throw InvalidOp(expressionName, inputExpressions);
            }
            return(result);
        }
        /// <summary>
        /// Creates a new expression.
        /// </summary>
        /// <param name="generator">The expression generator to use.</param>
        /// <param name="expressionName">The name of the requested expression.</param>
        /// <param name="input0">The first input argument.</param>
        /// <param name="input1">The second input argument.</param>
        /// <returns>A new requested expression or null if one could not be generated.</returns>
        public static Expression GenerateOrThrow(this IExpressionGenerator generator, string expressionName, Expression input0, Expression input1)
        {
            Contract.Requires(null != generator);
            Contract.Requires(!String.IsNullOrEmpty(expressionName));
            Contract.Requires(input0 != null);
            Contract.Requires(input1 != null);
            Contract.Ensures(Contract.Result <Expression>() != null);
            var inputs  = new[] { input0, input1 };
            var request = NewRequest(generator, expressionName, inputs);
            var result  = generator.Generate(request);

            if (result == null)
            {
                throw InvalidOp(expressionName, inputs);
            }
            return(result);
        }
Esempio n. 36
0
 /// <summary>
 /// Creates a new reducible expression with the given left and right parameters.
 /// </summary>
 /// <param name="leftParameter">The first or left parameter.</param>
 /// <param name="rightParameter">The second or right parameter.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 protected ReducibleBinaryExpressionBase(
     Expression leftParameter,
     Expression rightParameter,
     IExpressionGenerator reductionExpressionGenerator = null
     ) : base(reductionExpressionGenerator)
 {
     if (null == leftParameter)
     {
         throw new ArgumentNullException("leftParameter");
     }
     if (null == rightParameter)
     {
         throw new ArgumentNullException("rightParameter");
     }
     Contract.EndContractBlock();
     LeftParameter  = leftParameter;
     RightParameter = rightParameter;
 }
Esempio n. 37
0
 /// <summary>
 /// Creates a new function expression generation request. This request is for a function that accepts one or more expressions as input.
 /// </summary>
 /// <param name="generator">The primary generator to be used for the generation of sub expressions.</param>
 /// <param name="expressionName">The name of the requested constant.</param>
 /// <param name="resultType">The desired type of the constant.</param>
 public ConstantExpressionGenerationRequest(IExpressionGenerator generator, string expressionName, Type resultType)
 {
     if (null == generator)
     {
         throw new ArgumentNullException("generator");
     }
     if (String.IsNullOrEmpty(expressionName))
     {
         throw new ArgumentException("Invalid expression name.", "expressionName");
     }
     if (null == resultType)
     {
         throw new ArgumentNullException("resultType");
     }
     Contract.EndContractBlock();
     TopLevelGenerator = generator;
     ExpressionName    = expressionName;
     DesiredResultType = resultType;
 }
Esempio n. 38
0
 /// <summary>
 /// Creates a new function expression generation request. This request is for a function that accepts one or more expressions as input.
 /// </summary>
 /// <param name="generator">The primary generator to be used for the generation of sub expressions.</param>
 /// <param name="inputExpression">The name of the requested constant.</param>
 /// <param name="resultType">The desired type of the constant.</param>
 public ConversionExpressionRequest(IExpressionGenerator generator, Expression inputExpression, Type resultType)
 {
     if (null == generator)
     {
         throw new ArgumentNullException("generator");
     }
     if (null == inputExpression)
     {
         throw new ArgumentNullException("inputExpression");
     }
     if (null == resultType)
     {
         throw new ArgumentNullException("resultType");
     }
     Contract.EndContractBlock();
     TopLevelGenerator = generator;
     InputExpression   = inputExpression;
     DesiredResultType = resultType;
 }
Esempio n. 39
0
 /// <summary>
 /// Creates a new logarithm of the given <paramref name="b">base</paramref>.
 /// </summary>
 /// <param name="value">The value expression to calculate the logarithm of.</param>
 /// <param name="b">The base expression.</param>
 /// <param name="generator">The optional expression generator used during reduction.</param>
 public LogExpression(Expression value, Expression b, IExpressionGenerator generator = null)
     : base(value, b, generator) {
     Contract.Requires(value != null);
     Contract.Requires(b != null);
 }
Esempio n. 40
0
 /// <summary>
 /// Creates a new floor expression.
 /// </summary>
 /// <param name="input">The expression to calculate the floor of.</param>
 /// <param name="generator">The optional expression generator used during reduction.</param>
 public FloorExpression(Expression input, IExpressionGenerator generator = null)
     : base(input, generator) {
     Contract.Requires(null != input);
 }
Esempio n. 41
0
 /// <summary>
 /// Creates a new magnitude expression.
 /// </summary>
 /// <param name="components">The coordinate expressions.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 public MagnitudeExpression(Expression[] components, IExpressionGenerator reductionExpressionGenerator = null)
     : this(new SquaredMagnitudeExpression(components, reductionExpressionGenerator), reductionExpressionGenerator) {
     Contract.Requires(components != null);
     Contract.Requires(components.Length != 0);
     Contract.Requires(Contract.ForAll(components, x => x != null));
 }
Esempio n. 42
0
 private MagnitudeExpression(SquaredMagnitudeExpression innerExpression, IExpressionGenerator reductionExpressionGenerator = null) {
     if(innerExpression == null) throw new ArgumentNullException("innerExpression");
     Contract.EndContractBlock();
     InnerExpression = innerExpression;
 }
 /// <summary>
 /// Implementation of <see cref="IInstanceProviderFactory.CreateProvider"/>
 /// </summary>
 /// <param name="type">
 /// The type.
 /// </param>
 /// <param name="generator">
 /// The generator.
 /// </param>
 /// <returns>
 /// A new <see cref="TransientInstanceProvider"/> for the given type and generator
 /// </returns>
 public IInstanceProvider CreateProvider(Type type, IExpressionGenerator generator)
 {
     return new TransientInstanceProvider(type, generator);
 }
Esempio n. 44
0
 /// <summary>
 /// Creates a new square root expression.
 /// </summary>
 /// <param name="unaryParameter">The expression to find the square root of.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 public SquareRootExpression(Expression unaryParameter, IExpressionGenerator reductionExpressionGenerator = null)
     : base(unaryParameter, reductionExpressionGenerator)
 {
     Contract.Requires(null != unaryParameter);
 }
Esempio n. 45
0
        private IBatchExpression Act(TokenTree tokenTree, IExpressionGenerator expressionGenerator = null)
        {
            var generator = new BatchExpressionGenerator(new Lazy <IExpressionGenerator>(() => expressionGenerator));

            return(generator.Generate(tokenTree));
        }
Esempio n. 46
0
 /// <summary>
 /// Creates a new square root expression.
 /// </summary>
 /// <param name="unaryParameter">The expression to find the square root of.</param>
 /// <param name="reductionExpressionGenerator">The optional expression generator used for reduction.</param>
 public SquareRootExpression(Expression unaryParameter, IExpressionGenerator reductionExpressionGenerator = null)
     : base(unaryParameter, reductionExpressionGenerator) {
     Contract.Requires(null != unaryParameter);
 }
Esempio n. 47
0
 private DistanceExpression(SquaredDistanceExpression innerExpression, IExpressionGenerator reductionExpressionGenerator = null)
     : base(reductionExpressionGenerator) {
     if (innerExpression == null) throw new ArgumentNullException("innerExpression");
     Contract.EndContractBlock();
     InnerExpression = innerExpression;
 }
Esempio n. 48
0
 /// <summary>
 /// Creates a new maximum value expression.
 /// </summary>
 /// <param name="left">An expression to use.</param>
 /// <param name="right">An expression to use.</param>
 /// <param name="generator">/// <inheritdoc/></param>
 public MaxExpression(Expression left, Expression right, IExpressionGenerator generator = null)
     : base(left, right, generator) {
     Contract.Requires(null != left);
     Contract.Requires(null != right);
 }
Esempio n. 49
0
 public void SetUp()
 {
     instance = new object();
     generator = new ConstantExpressionGenerator(instance);
     expression = generator.GenerateExpression(typeof(object));
 }
Esempio n. 50
0
 /// <summary>
 /// Creates a new absolute value expression.
 /// </summary>
 /// <param name="input">The expression to find the absolute value of.</param>
 /// <param name="generator">The optional expression generator used during reduction.</param>
 public AbsExpression(Expression input, IExpressionGenerator generator = null) : base(input, generator)
 {
     Contract.Requires(null != input);
 }
 /// <summary>
 /// A basic reducible expression.
 /// </summary>
 /// <param name="reductionExpressionGenerator">The optional expression generator to be used in reduction.</param>
 protected ReducibleExpressionBase(IExpressionGenerator reductionExpressionGenerator = null) {
     _reductionExpressionGenerator = reductionExpressionGenerator;
 }