Skip to content

Commit

Permalink
#486 - Add Temperature Unit (#487)
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed Nov 22, 2021
1 parent d0a7c11 commit 67d0c54
Show file tree
Hide file tree
Showing 77 changed files with 2,024 additions and 84 deletions.
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Analyzer{TResult,TContext}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ public virtual TResult Analyze(Angle exp, TContext context)
public virtual TResult Analyze(Power exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(Temperature exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(ToDegree exp, TContext context)
=> Analyze(exp as IExpression, context);
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Analyzer{TResult}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ public virtual TResult Analyze(Angle exp)
public virtual TResult Analyze(Power exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(Temperature exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(ToDegree exp)
=> Analyze(exp as IExpression);
Expand Down
8 changes: 8 additions & 0 deletions xFunc.Maths/Analyzers/Differentiator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,14 @@ public override IExpression Analyze(Power exp, DifferentiatorContext context)
return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Temperature exp, DifferentiatorContext context)
{
ValidateArguments(exp, context);

return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Pow exp, DifferentiatorContext context)
{
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Formatters/CommonFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ public virtual string Analyze(Angle exp)
public virtual string Analyze(Power exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(Temperature exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(ToDegree exp)
=> ToString(exp, "todegree({0})");
Expand Down
8 changes: 8 additions & 0 deletions xFunc.Maths/Analyzers/IAnalyzer{TResult,TContext}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,14 @@ public interface IAnalyzer<out TResult, in TContext>
/// <returns>The result of analysis.</returns>
TResult Analyze(Power exp, TContext context);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
/// <param name="exp">The expression.</param>
/// <param name="context">The context.</param>
/// <returns>The result of analysis.</returns>
TResult Analyze(Temperature exp, TContext context);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
7 changes: 7 additions & 0 deletions xFunc.Maths/Analyzers/IAnalyzer{TResult}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,13 @@ public interface IAnalyzer<out TResult>
/// <returns>The result of analysis.</returns>
TResult Analyze(Power exp);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
/// <param name="exp">The expression.</param>
/// <returns>The result of analysis.</returns>
TResult Analyze(Temperature exp);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
19 changes: 13 additions & 6 deletions xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ public enum ResultTypes
/// </summary>
PowerNumber = 1 << 9,

/// <summary>
/// The expression returns a temperature number.
/// </summary>
TemperatureNumber = 1 << 10,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
Expand All @@ -81,18 +86,20 @@ public enum ResultTypes
/// </summary>
NumberOrAngleOrComplex = NumberOrAngle | ComplexNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
/// </summary>
NumberOrAngleOrComplexOrVector = NumberOrAngleOrComplex | Vector,

/// <summary>
/// The expression returns a number or a vector or a matrix.
/// </summary>
NumberOrVectorOrMatrix = Number | Vector | Matrix,

// TODO: remove?

/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number | AngleNumber | PowerNumber,
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
/// </summary>
NumbersOrComplexOrVector = Numbers | ComplexNumber | Vector,
}
58 changes: 51 additions & 7 deletions xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,12 @@ private ResultTypes AnalyzeRelational([NotNull] BinaryExpression? exp)
(ResultTypes.Undefined, ResultTypes.AngleNumber) or
(ResultTypes.PowerNumber, ResultTypes.Undefined) or
(ResultTypes.Undefined, ResultTypes.PowerNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Undefined) or
(ResultTypes.Undefined, ResultTypes.TemperatureNumber) or
(ResultTypes.Number, ResultTypes.Number) or
(ResultTypes.AngleNumber, ResultTypes.AngleNumber) or
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.Boolean,

(_, ResultTypes.Number) => ResultTypes.Number.ThrowForLeft(leftResult),
Expand All @@ -125,6 +128,9 @@ private ResultTypes AnalyzeRelational([NotNull] BinaryExpression? exp)
(_, ResultTypes.PowerNumber) => ResultTypes.PowerNumber.ThrowForLeft(leftResult),
(ResultTypes.PowerNumber, _) => ResultTypes.PowerNumber.ThrowForRight(rightResult),

(_, ResultTypes.TemperatureNumber) => ResultTypes.TemperatureNumber.ThrowForLeft(leftResult),
(ResultTypes.TemperatureNumber, _) => ResultTypes.TemperatureNumber.ThrowForRight(rightResult),

_ => throw new ParameterTypeMismatchException(),
};
}
Expand Down Expand Up @@ -198,10 +204,13 @@ private ResultTypes AnalyzeEquality([NotNull] BinaryExpression? exp)
(ResultTypes.Undefined, ResultTypes.AngleNumber) or
(ResultTypes.PowerNumber, ResultTypes.Undefined) or
(ResultTypes.Undefined, ResultTypes.PowerNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Undefined) or
(ResultTypes.Undefined, ResultTypes.TemperatureNumber) or
(ResultTypes.Number, ResultTypes.Number) or
(ResultTypes.Boolean, ResultTypes.Boolean) or
(ResultTypes.AngleNumber, ResultTypes.AngleNumber) or
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.Boolean,

(_, ResultTypes.Number) => ResultTypes.Number.ThrowForLeft(leftResult),
Expand All @@ -216,6 +225,9 @@ private ResultTypes AnalyzeEquality([NotNull] BinaryExpression? exp)
(_, ResultTypes.PowerNumber) => ResultTypes.PowerNumber.ThrowForLeft(leftResult),
(ResultTypes.PowerNumber, _) => ResultTypes.PowerNumber.ThrowForRight(rightResult),

(_, ResultTypes.TemperatureNumber) => ResultTypes.TemperatureNumber.ThrowForLeft(leftResult),
(ResultTypes.TemperatureNumber, _) => ResultTypes.TemperatureNumber.ThrowForRight(rightResult),

_ => throw new ParameterTypeMismatchException(),
};
}
Expand Down Expand Up @@ -296,7 +308,8 @@ public virtual ResultTypes Analyze(Abs exp)
=> ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
_ => ResultTypes.NumberOrAngleOrComplexOrVector.ThrowFor(result),
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
};
}

Expand Down Expand Up @@ -327,6 +340,11 @@ public virtual ResultTypes Analyze(Add exp)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
=> ResultTypes.PowerNumber,

(ResultTypes.Number, ResultTypes.TemperatureNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -369,7 +387,8 @@ public virtual ResultTypes Analyze(Ceil exp)
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}

Expand Down Expand Up @@ -426,6 +445,11 @@ public virtual ResultTypes Analyze(Div exp)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
=> ResultTypes.PowerNumber,

(ResultTypes.Number, ResultTypes.TemperatureNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -485,6 +509,7 @@ public virtual ResultTypes Analyze(Floor exp)
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -503,6 +528,7 @@ public virtual ResultTypes Analyze(Trunc exp)
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -521,6 +547,7 @@ public virtual ResultTypes Analyze(Frac exp)
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand Down Expand Up @@ -687,6 +714,11 @@ public virtual ResultTypes Analyze(Mul exp)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
=> ResultTypes.PowerNumber,

(ResultTypes.Number, ResultTypes.TemperatureNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -732,6 +764,10 @@ public virtual ResultTypes Analyze(Angle exp)
public virtual ResultTypes Analyze(Power exp)
=> CheckArgument(exp, ResultTypes.PowerNumber);

/// <inheritdoc />
public virtual ResultTypes Analyze(Temperature exp)
=> CheckArgument(exp, ResultTypes.TemperatureNumber);

/// <inheritdoc />
public virtual ResultTypes Analyze(ToDegree exp)
=> AngleConversion(exp);
Expand Down Expand Up @@ -867,6 +903,11 @@ public virtual ResultTypes Analyze(Sub exp)
(ResultTypes.PowerNumber, ResultTypes.PowerNumber)
=> ResultTypes.PowerNumber,

(ResultTypes.Number, ResultTypes.TemperatureNumber) or
(ResultTypes.TemperatureNumber, ResultTypes.Number) or
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -905,6 +946,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
};
Expand Down Expand Up @@ -938,9 +980,10 @@ public virtual ResultTypes Analyze(Sign exp)
{
ResultTypes.Undefined => ResultTypes.Undefined,
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
_ => ResultTypes.Number.ThrowFor(result),
ResultTypes.AngleNumber => ResultTypes.Number,
ResultTypes.PowerNumber => ResultTypes.Number,
ResultTypes.TemperatureNumber => ResultTypes.Number,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}

Expand Down Expand Up @@ -974,6 +1017,7 @@ ResultTypes.Undefined or
ResultTypes.Number => ResultTypes.Undefined,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,

_ => ResultTypes.Numbers.ThrowFor(valueResult),
};
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Abs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
NumberValue number => NumberValue.Abs(number),
AngleValue angle => AngleValue.Abs(angle),
PowerValue power => PowerValue.Abs(power),
TemperatureValue temperature => TemperatureValue.Abs(temperature),
Complex complex => Complex.Abs(complex),
Vector vector => vector.Abs(parameters),
_ => throw new ResultIsNotSupportedException(this, result),
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Expressions/Add.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ public override object Execute(ExpressionParameters? parameters)
(PowerValue left, NumberValue right) => left + right,
(PowerValue left, PowerValue right) => left + right,

(NumberValue left, TemperatureValue right) => left + right,
(TemperatureValue left, NumberValue right) => left + right,
(TemperatureValue left, TemperatureValue right) => left + right,

(NumberValue left, Complex right) => left + right,
(Complex left, NumberValue right) => left + right,
(Complex left, Complex right) => left + right,
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Ceil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public override object Execute(ExpressionParameters? parameters)
NumberValue number => NumberValue.Ceiling(number),
AngleValue angle => AngleValue.Ceiling(angle),
PowerValue power => PowerValue.Ceiling(power),
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
11 changes: 11 additions & 0 deletions xFunc.Maths/Expressions/Collections/ParameterValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ public ParameterValue(PowerValue value)
{
}

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(TemperatureValue value)
: this(value as object)
{
}

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(Complex value)
: this(value as object)
Expand Down Expand Up @@ -79,6 +85,7 @@ internal ParameterValue(object value)
value is NumberValue
or AngleValue
or PowerValue
or TemperatureValue
or Complex
or bool
or Vector
Expand Down Expand Up @@ -109,6 +116,10 @@ or Matrix
public static implicit operator ParameterValue(PowerValue value)
=> new ParameterValue(value);

/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
public static implicit operator ParameterValue(TemperatureValue value)
=> new ParameterValue(value);

/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
public static implicit operator ParameterValue(Complex value)
=> new ParameterValue(value);
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Expressions/Div.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public override object Execute(ExpressionParameters? parameters)
(PowerValue left, NumberValue right) => left / right,
(PowerValue left, PowerValue right) => left / right,

(NumberValue left, TemperatureValue right) => left / right,
(TemperatureValue left, NumberValue right) => left / right,
(TemperatureValue left, TemperatureValue right) => left / right,

(NumberValue left, Complex right) => left / right,
(Complex left, NumberValue right) => left / right,
(Complex left, Complex right) => left / right,
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Floor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public override object Execute(ExpressionParameters? parameters)
NumberValue number => NumberValue.Floor(number),
AngleValue angle => AngleValue.Floor(angle),
PowerValue power => PowerValue.Floor(power),
TemperatureValue temperature => TemperatureValue.Floor(temperature),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Frac.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public override object Execute(ExpressionParameters? parameters)
NumberValue number => NumberValue.Frac(number),
AngleValue angle => AngleValue.Frac(angle),
PowerValue power => PowerValue.Frac(power),
TemperatureValue temperature => TemperatureValue.Frac(temperature),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Expressions/Mul.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ public override object Execute(ExpressionParameters? parameters)
(PowerValue left, NumberValue right) => left * right,
(PowerValue left, PowerValue right) => left * right,

(NumberValue left, TemperatureValue right) => left * right,
(TemperatureValue left, NumberValue right) => left * right,
(TemperatureValue left, TemperatureValue right) => left * right,

(NumberValue left, Complex right) => left * right,
(Complex left, NumberValue right) => left * right,
(Complex left, Complex right) => left * right,
Expand Down

0 comments on commit 67d0c54

Please sign in to comment.