Skip to content

Commit

Permalink
#491 - Mass Units
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed Feb 14, 2022
1 parent 15284b1 commit 007d6d2
Show file tree
Hide file tree
Showing 65 changed files with 1,894 additions and 141 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 @@ -117,6 +117,10 @@ public virtual TResult Analyze(Power exp, TContext context)
public virtual TResult Analyze(Temperature exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(Mass 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 @@ -116,6 +116,10 @@ public virtual TResult Analyze(Power exp)
public virtual TResult Analyze(Temperature exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(Mass 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 @@ -234,6 +234,14 @@ public override IExpression Analyze(Temperature exp, DifferentiatorContext conte
return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Mass 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 @@ -161,6 +161,10 @@ public virtual string Analyze(Power exp)
public virtual string Analyze(Temperature exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(Mass 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 @@ -212,6 +212,14 @@ public interface IAnalyzer<out TResult, in TContext>
/// <returns>The result of analysis.</returns>
TResult Analyze(Temperature 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(Mass 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 @@ -186,6 +186,13 @@ public interface IAnalyzer<out TResult>
/// <returns>The result of analysis.</returns>
TResult Analyze(Temperature exp);

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

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
7 changes: 6 additions & 1 deletion xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ public enum ResultTypes
/// </summary>
TemperatureNumber = 1 << 10,

/// <summary>
/// The expression returns a mass number.
/// </summary>
MassNumber = 1 << 11,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
Expand All @@ -96,7 +101,7 @@ public enum ResultTypes
/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber,
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
Expand Down
65 changes: 55 additions & 10 deletions xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ public virtual ResultTypes Analyze(Abs exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
};
}
Expand Down Expand Up @@ -345,6 +346,11 @@ public virtual ResultTypes Analyze(Add exp)
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -388,6 +394,7 @@ public virtual ResultTypes Analyze(Ceil exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}
Expand Down Expand Up @@ -444,6 +451,9 @@ public virtual ResultTypes Analyze(Div exp)
(ResultTypes.TemperatureNumber, ResultTypes.Number)
=> ResultTypes.TemperatureNumber,

(ResultTypes.MassNumber, ResultTypes.Number)
=> ResultTypes.MassNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -504,6 +514,7 @@ public virtual ResultTypes Analyze(Floor exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -523,6 +534,7 @@ public virtual ResultTypes Analyze(Trunc exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -542,6 +554,7 @@ public virtual ResultTypes Analyze(Frac exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand Down Expand Up @@ -710,6 +723,10 @@ public virtual ResultTypes Analyze(Mul exp)
(ResultTypes.TemperatureNumber, ResultTypes.Number)
=> ResultTypes.TemperatureNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -759,6 +776,10 @@ public virtual ResultTypes Analyze(Power exp)
public virtual ResultTypes Analyze(Temperature exp)
=> CheckArgument(exp, ResultTypes.TemperatureNumber);

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

/// <inheritdoc />
public virtual ResultTypes Analyze(ToDegree exp)
=> AngleConversion(exp);
Expand Down Expand Up @@ -849,15 +870,30 @@ public virtual ResultTypes Analyze(Round exp)
if (exp is null)
ArgNull(ExceptionArgument.exp);

var enumerator = exp.Arguments.GetEnumerator();
for (var i = 0; enumerator.MoveNext(); i++)
var number = exp.Arguments[0].Analyze(this);
var digits = exp.Arguments[1]?.Analyze(this) ?? ResultTypes.None;

if (digits is ResultTypes.None or ResultTypes.Undefined or ResultTypes.Number)
{
var item = enumerator.Current.Analyze(this);
if (item != ResultTypes.Undefined && item != ResultTypes.Number)
throw new DifferentParameterTypeMismatchException(ResultTypes.Number, item, i);
return number switch
{
ResultTypes.Undefined => ResultTypes.Undefined,
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => throw new DifferentParameterTypeMismatchException(
ResultTypes.Undefined | ResultTypes.Numbers,
number,
0),
};
}

return ResultTypes.Number;
throw new DifferentParameterTypeMismatchException(
ResultTypes.None | ResultTypes.Undefined | ResultTypes.Number,
digits,
1);
}

/// <inheritdoc />
Expand Down Expand Up @@ -900,6 +936,11 @@ public virtual ResultTypes Analyze(Sub exp)
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
=> ResultTypes.TemperatureNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -939,6 +980,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
};
Expand Down Expand Up @@ -971,10 +1013,12 @@ public virtual ResultTypes Analyze(Sign exp)
return result switch
{
ResultTypes.Undefined => ResultTypes.Undefined,
ResultTypes.Number => ResultTypes.Number,
ResultTypes.AngleNumber => ResultTypes.Number,
ResultTypes.PowerNumber => ResultTypes.Number,
ResultTypes.TemperatureNumber => ResultTypes.Number,
ResultTypes.Number or
ResultTypes.AngleNumber or
ResultTypes.PowerNumber or
ResultTypes.TemperatureNumber or
ResultTypes.MassNumber => ResultTypes.Number,

_ => ResultTypes.Numbers.ThrowFor(result),
};
}
Expand Down Expand Up @@ -1010,6 +1054,7 @@ ResultTypes.Undefined or
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,

_ => 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 @@ -43,6 +43,7 @@ public override object Execute(ExpressionParameters? parameters)
AngleValue angle => AngleValue.Abs(angle),
PowerValue power => PowerValue.Abs(power),
TemperatureValue temperature => TemperatureValue.Abs(temperature),
MassValue mass => MassValue.Abs(mass),
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 @@ -55,6 +55,10 @@ public override object Execute(ExpressionParameters? parameters)
(TemperatureValue left, NumberValue right) => left + right,
(TemperatureValue left, TemperatureValue right) => left + right,

(NumberValue left, MassValue right) => left + right,
(MassValue left, NumberValue right) => left + right,
(MassValue left, MassValue 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 @@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
AngleValue angle => AngleValue.Ceiling(angle),
PowerValue power => PowerValue.Ceiling(power),
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
MassValue mass => MassValue.Ceiling(mass),
_ => 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 @@ -42,6 +42,12 @@ public ParameterValue(TemperatureValue value)
{
}

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

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(Complex value)
: this(value as object)
Expand Down Expand Up @@ -86,6 +92,7 @@ internal ParameterValue(object value)
or AngleValue
or PowerValue
or TemperatureValue
or MassValue
or Complex
or bool
or Vector
Expand Down Expand Up @@ -120,6 +127,10 @@ or Matrix
public static implicit operator ParameterValue(TemperatureValue value)
=> new ParameterValue(value);

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

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

(NumberValue left, Complex right) => left / right,
(Complex left, NumberValue 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 @@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
AngleValue angle => AngleValue.Floor(angle),
PowerValue power => PowerValue.Floor(power),
TemperatureValue temperature => TemperatureValue.Floor(temperature),
MassValue mass => MassValue.Floor(mass),
_ => 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 @@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
AngleValue angle => AngleValue.Frac(angle),
PowerValue power => PowerValue.Frac(power),
TemperatureValue temperature => TemperatureValue.Frac(temperature),
MassValue mass => MassValue.Frac(mass),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
3 changes: 3 additions & 0 deletions xFunc.Maths/Expressions/Mul.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public override object Execute(ExpressionParameters? parameters)
(NumberValue left, TemperatureValue right) => left * right,
(TemperatureValue left, NumberValue right) => left * right,

(NumberValue left, MassValue right) => left * right,
(MassValue left, NumberValue 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 007d6d2

Please sign in to comment.