Skip to content

Commit 5477138

Browse files
committed
#514 - Length Units.
1 parent 73fc389 commit 5477138

File tree

79 files changed

+2818
-86
lines changed

Some content is hidden

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

79 files changed

+2818
-86
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ public virtual TResult Analyze(Temperature exp, TContext context)
121121
public virtual TResult Analyze(Mass exp, TContext context)
122122
=> Analyze(exp as IExpression, context);
123123

124+
/// <inheritdoc />
125+
public virtual TResult Analyze(Length exp, TContext context)
126+
=> Analyze(exp as IExpression, context);
127+
124128
/// <inheritdoc />
125129
public virtual TResult Analyze(ToDegree exp, TContext context)
126130
=> Analyze(exp as IExpression, context);

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

+4
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ public virtual TResult Analyze(Temperature exp)
120120
public virtual TResult Analyze(Mass exp)
121121
=> Analyze(exp as IExpression);
122122

123+
/// <inheritdoc />
124+
public virtual TResult Analyze(Length exp)
125+
=> Analyze(exp as IExpression);
126+
123127
/// <inheritdoc />
124128
public virtual TResult Analyze(ToDegree exp)
125129
=> Analyze(exp as IExpression);

xFunc.Maths/Analyzers/Differentiator.cs

+8
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,14 @@ public override IExpression Analyze(Mass exp, DifferentiatorContext context)
242242
return Number.Zero;
243243
}
244244

245+
/// <inheritdoc />
246+
public override IExpression Analyze(Length exp, DifferentiatorContext context)
247+
{
248+
ValidateArguments(exp, context);
249+
250+
return Number.Zero;
251+
}
252+
245253
/// <inheritdoc />
246254
public override IExpression Analyze(Pow exp, DifferentiatorContext context)
247255
{

xFunc.Maths/Analyzers/Formatters/CommonFormatter.cs

+4
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ public virtual string Analyze(Temperature exp)
165165
public virtual string Analyze(Mass exp)
166166
=> exp.Value.ToString();
167167

168+
/// <inheritdoc />
169+
public virtual string Analyze(Length exp)
170+
=> exp.Value.ToString();
171+
168172
/// <inheritdoc />
169173
public virtual string Analyze(ToDegree exp)
170174
=> ToString(exp, "todegree({0})");

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

+8
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,14 @@ public interface IAnalyzer<out TResult, in TContext>
220220
/// <returns>The result of analysis.</returns>
221221
TResult Analyze(Mass exp, TContext context);
222222

223+
/// <summary>
224+
/// Analyzes the specified expression.
225+
/// </summary>
226+
/// <param name="exp">The expression.</param>
227+
/// <param name="context">The context.</param>
228+
/// <returns>The result of analysis.</returns>
229+
TResult Analyze(Length exp, TContext context);
230+
223231
/// <summary>
224232
/// Analyzes the specified expression.
225233
/// </summary>

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

+7
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,13 @@ public interface IAnalyzer<out TResult>
193193
/// <returns>The result of analysis.</returns>
194194
TResult Analyze(Mass exp);
195195

196+
/// <summary>
197+
/// Analyzes the specified expression.
198+
/// </summary>
199+
/// <param name="exp">The expression.</param>
200+
/// <returns>The result of analysis.</returns>
201+
TResult Analyze(Length exp);
202+
196203
/// <summary>
197204
/// Analyzes the specified expression.
198205
/// </summary>

xFunc.Maths/Analyzers/Simplifier.cs

+25
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,13 @@ public override IExpression Analyze(Add exp)
207207
(Mass left, Mass right)
208208
=> (left.Value + right.Value).AsExpression(),
209209

210+
(Number left, Length right)
211+
=> (left.Value + right.Value).AsExpression(),
212+
(Length left, Number right)
213+
=> (left.Value + right.Value).AsExpression(),
214+
(Length left, Length right)
215+
=> (left.Value + right.Value).AsExpression(),
216+
210217
// x + x
211218
(Variable left, Variable right) when left.Name == right.Name
212219
=> new Mul(Number.Two, left),
@@ -323,6 +330,8 @@ public override IExpression Analyze(Div exp)
323330
=> (left.Value / right.Value).AsExpression(),
324331
(Mass left, Number right)
325332
=> (left.Value / right.Value).AsExpression(),
333+
(Length left, Number right)
334+
=> (left.Value / right.Value).AsExpression(),
326335

327336
// x / x
328337
(Variable left, Variable right) when left.Equals(right)
@@ -520,6 +529,11 @@ public override IExpression Analyze(Mul exp)
520529
(Mass left, Number right)
521530
=> (left.Value * right.Value).AsExpression(),
522531

532+
(Number left, Length right)
533+
=> (left.Value * right.Value).AsExpression(),
534+
(Length left, Number right)
535+
=> (left.Value * right.Value).AsExpression(),
536+
523537
// x * -y
524538
(var left, UnaryMinus minus)
525539
=> new UnaryMinus(new Mul(left, minus.Argument)),
@@ -646,6 +660,10 @@ public override IExpression Analyze(ToNumber exp)
646660
return argument switch
647661
{
648662
Angle(var angle) => new Number(angle.Angle),
663+
Power(var power) => new Number(power.Value),
664+
Temperature(var temperature) => new Number(temperature.Value),
665+
Mass(var mass) => new Number(mass.Value),
666+
Length(var length) => new Number(length.Value),
649667
var arg when IsChanged(exp, arg) => new ToNumber(arg),
650668
_ => exp,
651669
};
@@ -768,6 +786,13 @@ public override IExpression Analyze(Sub exp)
768786
(Mass left, Mass right)
769787
=> (left.Value - right.Value).AsExpression(),
770788

789+
(Number left, Length right)
790+
=> (left.Value - right.Value).AsExpression(),
791+
(Length left, Number right)
792+
=> (left.Value - right.Value).AsExpression(),
793+
(Length left, Length right)
794+
=> (left.Value - right.Value).AsExpression(),
795+
771796
// x + x
772797
(Variable left, Variable right) when left.Name == right.Name
773798
=> Number.Zero,

xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ public enum ResultTypes
7676
/// </summary>
7777
MassNumber = 1 << 11,
7878

79+
/// <summary>
80+
/// The expression returns a length number.
81+
/// </summary>
82+
LengthNumber = 1 << 12,
83+
7984
/// <summary>
8085
/// The expression returns a number or a complex number.
8186
/// </summary>
@@ -101,7 +106,7 @@ public enum ResultTypes
101106
/// <summary>
102107
/// The expression returns any type of number.
103108
/// </summary>
104-
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber,
109+
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber | LengthNumber,
105110

106111
/// <summary>
107112
/// The expression returns a number or a angle number or a complex number or a vector.

xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs

+31-1
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.LengthNumber => ResultTypes.LengthNumber,
312313
ResultTypes.MassNumber => ResultTypes.MassNumber,
313314
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
314315
};
@@ -351,6 +352,11 @@ public virtual ResultTypes Analyze(Add exp)
351352
(ResultTypes.MassNumber, ResultTypes.MassNumber)
352353
=> ResultTypes.MassNumber,
353354

355+
(ResultTypes.Number, ResultTypes.LengthNumber) or
356+
(ResultTypes.LengthNumber, ResultTypes.Number) or
357+
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
358+
=> ResultTypes.LengthNumber,
359+
354360
(ResultTypes.Number, ResultTypes.ComplexNumber) or
355361
(ResultTypes.ComplexNumber, ResultTypes.Number) or
356362
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -395,6 +401,7 @@ public virtual ResultTypes Analyze(Ceil exp)
395401
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
396402
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
397403
ResultTypes.MassNumber => ResultTypes.MassNumber,
404+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
398405
_ => ResultTypes.Numbers.ThrowFor(result),
399406
};
400407
}
@@ -454,6 +461,9 @@ public virtual ResultTypes Analyze(Div exp)
454461
(ResultTypes.MassNumber, ResultTypes.Number)
455462
=> ResultTypes.MassNumber,
456463

464+
(ResultTypes.LengthNumber, ResultTypes.Number)
465+
=> ResultTypes.LengthNumber,
466+
457467
(ResultTypes.Number, ResultTypes.ComplexNumber) or
458468
(ResultTypes.ComplexNumber, ResultTypes.Number) or
459469
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -515,6 +525,7 @@ public virtual ResultTypes Analyze(Floor exp)
515525
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
516526
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
517527
ResultTypes.MassNumber => ResultTypes.MassNumber,
528+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
518529
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
519530
};
520531
}
@@ -535,6 +546,7 @@ public virtual ResultTypes Analyze(Trunc exp)
535546
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
536547
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
537548
ResultTypes.MassNumber => ResultTypes.MassNumber,
549+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
538550
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
539551
};
540552
}
@@ -555,6 +567,7 @@ public virtual ResultTypes Analyze(Frac exp)
555567
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
556568
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
557569
ResultTypes.MassNumber => ResultTypes.MassNumber,
570+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
558571
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
559572
};
560573
}
@@ -727,6 +740,10 @@ public virtual ResultTypes Analyze(Mul exp)
727740
(ResultTypes.MassNumber, ResultTypes.Number)
728741
=> ResultTypes.MassNumber,
729742

743+
(ResultTypes.Number, ResultTypes.LengthNumber) or
744+
(ResultTypes.LengthNumber, ResultTypes.Number)
745+
=> ResultTypes.LengthNumber,
746+
730747
(ResultTypes.Number, ResultTypes.ComplexNumber) or
731748
(ResultTypes.ComplexNumber, ResultTypes.Number) or
732749
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -780,6 +797,10 @@ public virtual ResultTypes Analyze(Temperature exp)
780797
public virtual ResultTypes Analyze(Mass exp)
781798
=> CheckArgument(exp, ResultTypes.MassNumber);
782799

800+
/// <inheritdoc />
801+
public virtual ResultTypes Analyze(Length exp)
802+
=> CheckArgument(exp, ResultTypes.LengthNumber);
803+
783804
/// <inheritdoc />
784805
public virtual ResultTypes Analyze(ToDegree exp)
785806
=> AngleConversion(exp);
@@ -806,7 +827,8 @@ ResultTypes.Undefined or
806827
ResultTypes.AngleNumber or
807828
ResultTypes.PowerNumber or
808829
ResultTypes.TemperatureNumber or
809-
ResultTypes.MassNumber
830+
ResultTypes.MassNumber or
831+
ResultTypes.LengthNumber
810832
=> ResultTypes.Number,
811833
_ => ResultTypes.AngleNumber.ThrowFor(result),
812834
};
@@ -885,6 +907,7 @@ public virtual ResultTypes Analyze(Round exp)
885907
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
886908
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
887909
ResultTypes.MassNumber => ResultTypes.MassNumber,
910+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
888911
_ => throw new DifferentParameterTypeMismatchException(
889912
ResultTypes.Undefined | ResultTypes.Numbers,
890913
number,
@@ -943,6 +966,11 @@ public virtual ResultTypes Analyze(Sub exp)
943966
(ResultTypes.MassNumber, ResultTypes.MassNumber)
944967
=> ResultTypes.MassNumber,
945968

969+
(ResultTypes.Number, ResultTypes.LengthNumber) or
970+
(ResultTypes.LengthNumber, ResultTypes.Number) or
971+
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
972+
=> ResultTypes.LengthNumber,
973+
946974
(ResultTypes.Number, ResultTypes.ComplexNumber) or
947975
(ResultTypes.ComplexNumber, ResultTypes.Number) or
948976
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
@@ -983,6 +1011,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
9831011
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
9841012
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
9851013
ResultTypes.MassNumber => ResultTypes.MassNumber,
1014+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
9861015
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
9871016
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
9881017
};
@@ -1057,6 +1086,7 @@ ResultTypes.Undefined or
10571086
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
10581087
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
10591088
ResultTypes.MassNumber => ResultTypes.MassNumber,
1089+
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
10601090

10611091
_ => ResultTypes.Numbers.ThrowFor(valueResult),
10621092
};

xFunc.Maths/Expressions/Abs.cs

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public override object Execute(ExpressionParameters? parameters)
4444
PowerValue power => PowerValue.Abs(power),
4545
TemperatureValue temperature => TemperatureValue.Abs(temperature),
4646
MassValue mass => MassValue.Abs(mass),
47+
LengthValue length => LengthValue.Abs(length),
4748
Complex complex => Complex.Abs(complex),
4849
Vector vector => vector.Abs(parameters),
4950
_ => throw new ResultIsNotSupportedException(this, result),

xFunc.Maths/Expressions/Add.cs

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ public override object Execute(ExpressionParameters? parameters)
5959
(MassValue left, NumberValue right) => left + right,
6060
(MassValue left, MassValue right) => left + right,
6161

62+
(NumberValue left, LengthValue right) => left + right,
63+
(LengthValue left, NumberValue right) => left + right,
64+
(LengthValue left, LengthValue right) => left + right,
65+
6266
(NumberValue left, Complex right) => left + right,
6367
(Complex left, NumberValue right) => left + right,
6468
(Complex left, Complex right) => left + right,

xFunc.Maths/Expressions/Ceil.cs

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
4242
PowerValue power => PowerValue.Ceiling(power),
4343
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
4444
MassValue mass => MassValue.Ceiling(mass),
45+
LengthValue length => LengthValue.Ceiling(length),
4546
_ => throw new ResultIsNotSupportedException(this, result),
4647
};
4748
}

xFunc.Maths/Expressions/Collections/ParameterValue.cs

+11
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ public ParameterValue(MassValue value)
4848
{
4949
}
5050

51+
/// <inheritdoc cref="ParameterValue(object)"/>
52+
public ParameterValue(LengthValue value)
53+
: this(value as object)
54+
{
55+
}
56+
5157
/// <inheritdoc cref="ParameterValue(object)"/>
5258
public ParameterValue(Complex value)
5359
: this(value as object)
@@ -93,6 +99,7 @@ or AngleValue
9399
or PowerValue
94100
or TemperatureValue
95101
or MassValue
102+
or LengthValue
96103
or Complex
97104
or bool
98105
or Vector
@@ -131,6 +138,10 @@ public static implicit operator ParameterValue(TemperatureValue value)
131138
public static implicit operator ParameterValue(MassValue value)
132139
=> new ParameterValue(value);
133140

141+
/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
142+
public static implicit operator ParameterValue(LengthValue value)
143+
=> new ParameterValue(value);
144+
134145
/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
135146
public static implicit operator ParameterValue(Complex value)
136147
=> new ParameterValue(value);

xFunc.Maths/Expressions/Div.cs

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
4545
(PowerValue left, NumberValue right) => left / right,
4646
(TemperatureValue left, NumberValue right) => left / right,
4747
(MassValue left, NumberValue right) => left / right,
48+
(LengthValue left, NumberValue right) => left / right,
4849

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

xFunc.Maths/Expressions/Floor.cs

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
4242
PowerValue power => PowerValue.Floor(power),
4343
TemperatureValue temperature => TemperatureValue.Floor(temperature),
4444
MassValue mass => MassValue.Floor(mass),
45+
LengthValue length => LengthValue.Floor(length),
4546
_ => throw new ResultIsNotSupportedException(this, result),
4647
};
4748
}

xFunc.Maths/Expressions/Frac.cs

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
4242
PowerValue power => PowerValue.Frac(power),
4343
TemperatureValue temperature => TemperatureValue.Frac(temperature),
4444
MassValue mass => MassValue.Frac(mass),
45+
LengthValue length => LengthValue.Frac(length),
4546
_ => throw new ResultIsNotSupportedException(this, result),
4647
};
4748
}

xFunc.Maths/Expressions/Mul.cs

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ public override object Execute(ExpressionParameters? parameters)
5454
(NumberValue left, MassValue right) => left * right,
5555
(MassValue left, NumberValue right) => left * right,
5656

57+
(NumberValue left, LengthValue right) => left * right,
58+
(LengthValue left, NumberValue right) => left * right,
59+
5760
(NumberValue left, Complex right) => left * right,
5861
(Complex left, NumberValue right) => left * right,
5962
(Complex left, Complex right) => left * right,

0 commit comments

Comments
 (0)