Skip to content

Commit 00c82ff

Browse files
committed
#491 - Mass Units
1 parent 63eda27 commit 00c82ff

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1815
-117
lines changed

xFunc.Maths/Analyzers/Analyzer{TResult,TContext}.cs

+4
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public virtual TResult Analyze(Power exp, TContext context)
117117
public virtual TResult Analyze(Temperature exp, TContext context)
118118
=> Analyze(exp as IExpression, context);
119119

120+
/// <inheritdoc />
121+
public virtual TResult Analyze(Mass exp, TContext context)
122+
=> Analyze(exp as IExpression, context);
123+
120124
/// <inheritdoc />
121125
public virtual TResult Analyze(ToDegree exp, TContext context)
122126
=> Analyze(exp as IExpression, context);

xFunc.Maths/Analyzers/Analyzer{TResult}.cs

+4
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ public virtual TResult Analyze(Power exp)
116116
public virtual TResult Analyze(Temperature exp)
117117
=> Analyze(exp as IExpression);
118118

119+
/// <inheritdoc />
120+
public virtual TResult Analyze(Mass exp)
121+
=> Analyze(exp as IExpression);
122+
119123
/// <inheritdoc />
120124
public virtual TResult Analyze(ToDegree exp)
121125
=> Analyze(exp as IExpression);

xFunc.Maths/Analyzers/Differentiator.cs

+8
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ public override IExpression Analyze(Temperature exp, DifferentiatorContext conte
234234
return Number.Zero;
235235
}
236236

237+
/// <inheritdoc />
238+
public override IExpression Analyze(Mass exp, DifferentiatorContext context)
239+
{
240+
ValidateArguments(exp, context);
241+
242+
return Number.Zero;
243+
}
244+
237245
/// <inheritdoc />
238246
public override IExpression Analyze(Pow exp, DifferentiatorContext context)
239247
{

xFunc.Maths/Analyzers/Formatters/CommonFormatter.cs

+4
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ public virtual string Analyze(Power exp)
161161
public virtual string Analyze(Temperature exp)
162162
=> exp.Value.ToString();
163163

164+
/// <inheritdoc />
165+
public virtual string Analyze(Mass exp)
166+
=> exp.Value.ToString();
167+
164168
/// <inheritdoc />
165169
public virtual string Analyze(ToDegree exp)
166170
=> ToString(exp, "todegree({0})");

xFunc.Maths/Analyzers/IAnalyzer{TResult,TContext}.cs

+8
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,14 @@ public interface IAnalyzer<out TResult, in TContext>
212212
/// <returns>The result of analysis.</returns>
213213
TResult Analyze(Temperature exp, TContext context);
214214

215+
/// <summary>
216+
/// Analyzes the specified expression.
217+
/// </summary>
218+
/// <param name="exp">The expression.</param>
219+
/// <param name="context">The context.</param>
220+
/// <returns>The result of analysis.</returns>
221+
TResult Analyze(Mass exp, TContext context);
222+
215223
/// <summary>
216224
/// Analyzes the specified expression.
217225
/// </summary>

xFunc.Maths/Analyzers/IAnalyzer{TResult}.cs

+7
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ public interface IAnalyzer<out TResult>
186186
/// <returns>The result of analysis.</returns>
187187
TResult Analyze(Temperature exp);
188188

189+
/// <summary>
190+
/// Analyzes the specified expression.
191+
/// </summary>
192+
/// <param name="exp">The expression.</param>
193+
/// <returns>The result of analysis.</returns>
194+
TResult Analyze(Mass exp);
195+
189196
/// <summary>
190197
/// Analyzes the specified expression.
191198
/// </summary>

xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ public enum ResultTypes
7171
/// </summary>
7272
TemperatureNumber = 1 << 10,
7373

74+
/// <summary>
75+
/// The expression returns a mass number.
76+
/// </summary>
77+
MassNumber = 1 << 11,
78+
7479
/// <summary>
7580
/// The expression returns a number or a complex number.
7681
/// </summary>
@@ -96,7 +101,7 @@ public enum ResultTypes
96101
/// <summary>
97102
/// The expression returns any type of number.
98103
/// </summary>
99-
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber,
104+
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber,
100105

101106
/// <summary>
102107
/// The expression returns a number or a angle number or a complex number or a vector.

xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs

+55-10
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ ResultTypes.Number or ResultTypes.ComplexNumber or ResultTypes.Vector
309309
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
310310
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
311311
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
312+
ResultTypes.MassNumber => ResultTypes.MassNumber,
312313
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
313314
};
314315
}
@@ -345,6 +346,11 @@ public virtual ResultTypes Analyze(Add exp)
345346
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
346347
=> ResultTypes.TemperatureNumber,
347348

349+
(ResultTypes.Number, ResultTypes.MassNumber) or
350+
(ResultTypes.MassNumber, ResultTypes.Number) or
351+
(ResultTypes.MassNumber, ResultTypes.MassNumber)
352+
=> ResultTypes.MassNumber,
353+
348354
(ResultTypes.Number, ResultTypes.ComplexNumber) or
349355
(ResultTypes.ComplexNumber, ResultTypes.Number) or
350356
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -388,6 +394,7 @@ public virtual ResultTypes Analyze(Ceil exp)
388394
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
389395
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
390396
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
397+
ResultTypes.MassNumber => ResultTypes.MassNumber,
391398
_ => ResultTypes.Numbers.ThrowFor(result),
392399
};
393400
}
@@ -444,6 +451,9 @@ public virtual ResultTypes Analyze(Div exp)
444451
(ResultTypes.TemperatureNumber, ResultTypes.Number)
445452
=> ResultTypes.TemperatureNumber,
446453

454+
(ResultTypes.MassNumber, ResultTypes.Number)
455+
=> ResultTypes.MassNumber,
456+
447457
(ResultTypes.Number, ResultTypes.ComplexNumber) or
448458
(ResultTypes.ComplexNumber, ResultTypes.Number) or
449459
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -504,6 +514,7 @@ public virtual ResultTypes Analyze(Floor exp)
504514
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
505515
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
506516
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
517+
ResultTypes.MassNumber => ResultTypes.MassNumber,
507518
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
508519
};
509520
}
@@ -523,6 +534,7 @@ public virtual ResultTypes Analyze(Trunc exp)
523534
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
524535
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
525536
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
537+
ResultTypes.MassNumber => ResultTypes.MassNumber,
526538
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
527539
};
528540
}
@@ -542,6 +554,7 @@ public virtual ResultTypes Analyze(Frac exp)
542554
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
543555
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
544556
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
557+
ResultTypes.MassNumber => ResultTypes.MassNumber,
545558
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
546559
};
547560
}
@@ -710,6 +723,10 @@ public virtual ResultTypes Analyze(Mul exp)
710723
(ResultTypes.TemperatureNumber, ResultTypes.Number)
711724
=> ResultTypes.TemperatureNumber,
712725

726+
(ResultTypes.Number, ResultTypes.MassNumber) or
727+
(ResultTypes.MassNumber, ResultTypes.Number)
728+
=> ResultTypes.MassNumber,
729+
713730
(ResultTypes.Number, ResultTypes.ComplexNumber) or
714731
(ResultTypes.ComplexNumber, ResultTypes.Number) or
715732
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -759,6 +776,10 @@ public virtual ResultTypes Analyze(Power exp)
759776
public virtual ResultTypes Analyze(Temperature exp)
760777
=> CheckArgument(exp, ResultTypes.TemperatureNumber);
761778

779+
/// <inheritdoc />
780+
public virtual ResultTypes Analyze(Mass exp)
781+
=> CheckArgument(exp, ResultTypes.MassNumber);
782+
762783
/// <inheritdoc />
763784
public virtual ResultTypes Analyze(ToDegree exp)
764785
=> AngleConversion(exp);
@@ -849,15 +870,30 @@ public virtual ResultTypes Analyze(Round exp)
849870
if (exp is null)
850871
ArgNull(ExceptionArgument.exp);
851872

852-
var enumerator = exp.Arguments.GetEnumerator();
853-
for (var i = 0; enumerator.MoveNext(); i++)
873+
var number = exp.Arguments[0].Analyze(this);
874+
var digits = exp.Arguments[1]?.Analyze(this) ?? ResultTypes.None;
875+
876+
if (digits is ResultTypes.None or ResultTypes.Undefined or ResultTypes.Number)
854877
{
855-
var item = enumerator.Current.Analyze(this);
856-
if (item != ResultTypes.Undefined && item != ResultTypes.Number)
857-
throw new DifferentParameterTypeMismatchException(ResultTypes.Number, item, i);
878+
return number switch
879+
{
880+
ResultTypes.Undefined => ResultTypes.Undefined,
881+
ResultTypes.Number => ResultTypes.Number,
882+
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
883+
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
884+
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
885+
ResultTypes.MassNumber => ResultTypes.MassNumber,
886+
_ => throw new DifferentParameterTypeMismatchException(
887+
ResultTypes.Undefined | ResultTypes.Numbers,
888+
number,
889+
0),
890+
};
858891
}
859892

860-
return ResultTypes.Number;
893+
throw new DifferentParameterTypeMismatchException(
894+
ResultTypes.None | ResultTypes.Undefined | ResultTypes.Number,
895+
digits,
896+
1);
861897
}
862898

863899
/// <inheritdoc />
@@ -900,6 +936,11 @@ public virtual ResultTypes Analyze(Sub exp)
900936
(ResultTypes.TemperatureNumber, ResultTypes.TemperatureNumber)
901937
=> ResultTypes.TemperatureNumber,
902938

939+
(ResultTypes.Number, ResultTypes.MassNumber) or
940+
(ResultTypes.MassNumber, ResultTypes.Number) or
941+
(ResultTypes.MassNumber, ResultTypes.MassNumber)
942+
=> ResultTypes.MassNumber,
943+
903944
(ResultTypes.Number, ResultTypes.ComplexNumber) or
904945
(ResultTypes.ComplexNumber, ResultTypes.Number) or
905946
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -939,6 +980,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
939980
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
940981
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
941982
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
983+
ResultTypes.MassNumber => ResultTypes.MassNumber,
942984
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
943985
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
944986
};
@@ -971,10 +1013,12 @@ public virtual ResultTypes Analyze(Sign exp)
9711013
return result switch
9721014
{
9731015
ResultTypes.Undefined => ResultTypes.Undefined,
974-
ResultTypes.Number => ResultTypes.Number,
975-
ResultTypes.AngleNumber => ResultTypes.Number,
976-
ResultTypes.PowerNumber => ResultTypes.Number,
977-
ResultTypes.TemperatureNumber => ResultTypes.Number,
1016+
ResultTypes.Number or
1017+
ResultTypes.AngleNumber or
1018+
ResultTypes.PowerNumber or
1019+
ResultTypes.TemperatureNumber or
1020+
ResultTypes.MassNumber => ResultTypes.Number,
1021+
9781022
_ => ResultTypes.Numbers.ThrowFor(result),
9791023
};
9801024
}
@@ -1010,6 +1054,7 @@ ResultTypes.Undefined or
10101054
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
10111055
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
10121056
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
1057+
ResultTypes.MassNumber => ResultTypes.MassNumber,
10131058

10141059
_ => ResultTypes.Numbers.ThrowFor(valueResult),
10151060
};

xFunc.Maths/Expressions/Abs.cs

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public override object Execute(ExpressionParameters? parameters)
4343
AngleValue angle => AngleValue.Abs(angle),
4444
PowerValue power => PowerValue.Abs(power),
4545
TemperatureValue temperature => TemperatureValue.Abs(temperature),
46+
MassValue mass => MassValue.Abs(mass),
4647
Complex complex => Complex.Abs(complex),
4748
Vector vector => vector.Abs(parameters),
4849
_ => throw new ResultIsNotSupportedException(this, result),

xFunc.Maths/Expressions/Add.cs

+4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public override object Execute(ExpressionParameters? parameters)
5555
(TemperatureValue left, NumberValue right) => left + right,
5656
(TemperatureValue left, TemperatureValue right) => left + right,
5757

58+
(NumberValue left, MassValue right) => left + right,
59+
(MassValue left, NumberValue right) => left + right,
60+
(MassValue left, MassValue right) => left + right,
61+
5862
(NumberValue left, Complex right) => left + right,
5963
(Complex left, NumberValue right) => left + right,
6064
(Complex left, Complex right) => left + right,

xFunc.Maths/Expressions/Ceil.cs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
4141
AngleValue angle => AngleValue.Ceiling(angle),
4242
PowerValue power => PowerValue.Ceiling(power),
4343
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
44+
MassValue mass => MassValue.Ceiling(mass),
4445
_ => throw new ResultIsNotSupportedException(this, result),
4546
};
4647
}

xFunc.Maths/Expressions/Collections/ParameterValue.cs

+11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ public ParameterValue(TemperatureValue value)
4242
{
4343
}
4444

45+
/// <inheritdoc cref="ParameterValue(object)"/>
46+
public ParameterValue(MassValue value)
47+
: this(value as object)
48+
{
49+
}
50+
4551
/// <inheritdoc cref="ParameterValue(object)"/>
4652
public ParameterValue(Complex value)
4753
: this(value as object)
@@ -86,6 +92,7 @@ value is NumberValue
8692
or AngleValue
8793
or PowerValue
8894
or TemperatureValue
95+
or MassValue
8996
or Complex
9097
or bool
9198
or Vector
@@ -120,6 +127,10 @@ public static implicit operator ParameterValue(PowerValue value)
120127
public static implicit operator ParameterValue(TemperatureValue value)
121128
=> new ParameterValue(value);
122129

130+
/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
131+
public static implicit operator ParameterValue(MassValue value)
132+
=> new ParameterValue(value);
133+
123134
/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
124135
public static implicit operator ParameterValue(Complex value)
125136
=> new ParameterValue(value);

xFunc.Maths/Expressions/Div.cs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public override object Execute(ExpressionParameters? parameters)
4444
(AngleValue left, NumberValue right) => left / right,
4545
(PowerValue left, NumberValue right) => left / right,
4646
(TemperatureValue left, NumberValue right) => left / right,
47+
(MassValue left, NumberValue right) => left / right,
4748

4849
(NumberValue left, Complex right) => left / right,
4950
(Complex left, NumberValue right) => left / right,

xFunc.Maths/Expressions/Floor.cs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
4141
AngleValue angle => AngleValue.Floor(angle),
4242
PowerValue power => PowerValue.Floor(power),
4343
TemperatureValue temperature => TemperatureValue.Floor(temperature),
44+
MassValue mass => MassValue.Floor(mass),
4445
_ => throw new ResultIsNotSupportedException(this, result),
4546
};
4647
}

xFunc.Maths/Expressions/Frac.cs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public override object Execute(ExpressionParameters? parameters)
4141
AngleValue angle => AngleValue.Frac(angle),
4242
PowerValue power => PowerValue.Frac(power),
4343
TemperatureValue temperature => TemperatureValue.Frac(temperature),
44+
MassValue mass => MassValue.Frac(mass),
4445
_ => throw new ResultIsNotSupportedException(this, result),
4546
};
4647
}

xFunc.Maths/Expressions/Mul.cs

+3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public override object Execute(ExpressionParameters? parameters)
5151
(NumberValue left, TemperatureValue right) => left * right,
5252
(TemperatureValue left, NumberValue right) => left * right,
5353

54+
(NumberValue left, MassValue right) => left * right,
55+
(MassValue left, NumberValue right) => left * right,
56+
5457
(NumberValue left, Complex right) => left * right,
5558
(Complex left, NumberValue right) => left * right,
5659
(Complex left, Complex right) => left * right,

0 commit comments

Comments
 (0)