Skip to content

Commit

Permalink
#516 - Volume: cm³, m³, l, in³, gal, ft³, yd³.
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed May 2, 2022
1 parent 06455c4 commit cb8b20a
Show file tree
Hide file tree
Showing 76 changed files with 1,965 additions and 14 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 @@ -133,6 +133,10 @@ public virtual TResult Analyze(Length exp, TContext context)
public virtual TResult Analyze(Time exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(Volume 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 @@ -132,6 +132,10 @@ public virtual TResult Analyze(Length exp)
public virtual TResult Analyze(Time exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(Volume 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 @@ -266,6 +266,14 @@ public override IExpression Analyze(Time exp, DifferentiatorContext context)
return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Volume 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 @@ -177,6 +177,10 @@ public virtual string Analyze(Length exp)
public virtual string Analyze(Time exp)
=> exp.Value.ToString();

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

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

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
22 changes: 22 additions & 0 deletions xFunc.Maths/Analyzers/Simplifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,13 @@ public override IExpression Analyze(Add exp)
(Area left, Area right)
=> (left.Value + right.Value).AsExpression(),

(Number left, Volume right)
=> (left.Value + right.Value).AsExpression(),
(Volume left, Number right)
=> (left.Value + right.Value).AsExpression(),
(Volume left, Volume right)
=> (left.Value + right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
=> new Mul(Number.Two, left),
Expand Down Expand Up @@ -350,6 +357,8 @@ public override IExpression Analyze(Div exp)
=> (left.Value / right.Value).AsExpression(),
(Area left, Number right)
=> (left.Value / right.Value).AsExpression(),
(Volume left, Number right)
=> (left.Value / right.Value).AsExpression(),

// x / x
(Variable left, Variable right) when left.Equals(right)
Expand Down Expand Up @@ -562,6 +571,11 @@ public override IExpression Analyze(Mul exp)
(Area left, Number right)
=> (left.Value * right.Value).AsExpression(),

(Number left, Volume right)
=> (left.Value * right.Value).AsExpression(),
(Volume left, Number right)
=> (left.Value * right.Value).AsExpression(),

// x * -y
(var left, UnaryMinus minus)
=> new UnaryMinus(new Mul(left, minus.Argument)),
Expand Down Expand Up @@ -694,6 +708,7 @@ public override IExpression Analyze(ToNumber exp)
Length(var length) => new Number(length.Value),
Time(var time) => new Number(time.Value),
Area(var area) => new Number(area.Value),
Volume(var volume) => new Number(volume.Value),
var arg when IsChanged(exp, arg) => new ToNumber(arg),
_ => exp,
};
Expand Down Expand Up @@ -837,6 +852,13 @@ public override IExpression Analyze(Sub exp)
(Area left, Area right)
=> (left.Value - right.Value).AsExpression(),

(Number left, Volume right)
=> (left.Value - right.Value).AsExpression(),
(Volume left, Number right)
=> (left.Value - right.Value).AsExpression(),
(Volume left, Volume right)
=> (left.Value - right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
=> Number.Zero,
Expand Down
15 changes: 14 additions & 1 deletion xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ public enum ResultTypes
/// </summary>
AreaNumber = 1 << 14,

/// <summary>
/// The expression returns a volume number.
/// </summary>
VolumeNumber = 1 << 15,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
Expand All @@ -114,7 +119,15 @@ public enum ResultTypes
/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber | LengthNumber | TimeNumber | AreaNumber,
Numbers = Number |
AngleNumber |
PowerNumber |
TemperatureNumber |
MassNumber |
LengthNumber |
TimeNumber |
AreaNumber |
VolumeNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
Expand Down
34 changes: 32 additions & 2 deletions xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ public virtual ResultTypes Analyze(Abs exp)
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
};
}
Expand Down Expand Up @@ -369,6 +370,11 @@ public virtual ResultTypes Analyze(Add exp)
(ResultTypes.AreaNumber, ResultTypes.AreaNumber)
=> ResultTypes.AreaNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -416,6 +422,7 @@ public virtual ResultTypes Analyze(Ceil exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}
Expand Down Expand Up @@ -484,6 +491,9 @@ public virtual ResultTypes Analyze(Div exp)
(ResultTypes.AreaNumber, ResultTypes.Number)
=> ResultTypes.AreaNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -548,6 +558,7 @@ public virtual ResultTypes Analyze(Floor exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -571,6 +582,7 @@ public virtual ResultTypes Analyze(Trunc exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -594,6 +606,7 @@ public virtual ResultTypes Analyze(Frac exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand Down Expand Up @@ -778,6 +791,10 @@ public virtual ResultTypes Analyze(Mul exp)
(ResultTypes.AreaNumber, ResultTypes.Number)
=> ResultTypes.AreaNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -843,6 +860,10 @@ public virtual ResultTypes Analyze(Length exp)
public virtual ResultTypes Analyze(Time exp)
=> CheckArgument(exp, ResultTypes.TimeNumber);

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

/// <inheritdoc />
public virtual ResultTypes Analyze(ToDegree exp)
=> AngleConversion(exp);
Expand Down Expand Up @@ -872,7 +893,8 @@ ResultTypes.TemperatureNumber or
ResultTypes.MassNumber or
ResultTypes.LengthNumber or
ResultTypes.TimeNumber or
ResultTypes.AreaNumber
ResultTypes.AreaNumber or
ResultTypes.VolumeNumber
=> ResultTypes.Number,
_ => ResultTypes.AngleNumber.ThrowFor(result),
};
Expand Down Expand Up @@ -954,6 +976,7 @@ public virtual ResultTypes Analyze(Round exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
_ => throw new DifferentParameterTypeMismatchException(
ResultTypes.Undefined | ResultTypes.Numbers,
number,
Expand Down Expand Up @@ -1027,6 +1050,11 @@ public virtual ResultTypes Analyze(Sub exp)
(ResultTypes.AreaNumber, ResultTypes.AreaNumber)
=> ResultTypes.AreaNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -1070,6 +1098,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.AreaNumber => ResultTypes.AreaNumber,
ResultTypes.VolumeNumber => ResultTypes.VolumeNumber,
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
};
Expand Down Expand Up @@ -1109,7 +1138,8 @@ ResultTypes.TemperatureNumber or
ResultTypes.MassNumber or
ResultTypes.LengthNumber or
ResultTypes.TimeNumber or
ResultTypes.AreaNumber
ResultTypes.AreaNumber or
ResultTypes.VolumeNumber
=> ResultTypes.Number,

_ => ResultTypes.Numbers.ThrowFor(result),
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 @@ -47,6 +47,7 @@ public override object Execute(ExpressionParameters? parameters)
LengthValue length => LengthValue.Abs(length),
TimeValue time => TimeValue.Abs(time),
AreaValue area => AreaValue.Abs(area),
VolumeValue volume => VolumeValue.Abs(volume),
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 @@ -71,6 +71,10 @@ public override object Execute(ExpressionParameters? parameters)
(AreaValue left, NumberValue right) => left + right,
(AreaValue left, AreaValue right) => left + right,

(NumberValue left, VolumeValue right) => left + right,
(VolumeValue left, NumberValue right) => left + right,
(VolumeValue left, VolumeValue 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 @@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
LengthValue length => LengthValue.Ceiling(length),
TimeValue time => TimeValue.Ceiling(time),
AreaValue area => AreaValue.Ceiling(area),
VolumeValue volume => VolumeValue.Ceiling(volume),
_ => 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 @@ -66,6 +66,12 @@ public ParameterValue(AreaValue value)
{
}

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

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(Complex value)
: this(value as object)
Expand Down Expand Up @@ -114,6 +120,7 @@ or MassValue
or LengthValue
or TimeValue
or AreaValue
or VolumeValue
or Complex
or bool
or Vector
Expand Down Expand Up @@ -164,6 +171,10 @@ or Matrix
public static implicit operator ParameterValue(AreaValue value)
=> new ParameterValue(value);

/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
public static implicit operator ParameterValue(VolumeValue 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 @@ -48,6 +48,7 @@ public override object Execute(ExpressionParameters? parameters)
(LengthValue left, NumberValue right) => left / right,
(TimeValue left, NumberValue right) => left / right,
(AreaValue left, NumberValue right) => left / right,
(VolumeValue 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 @@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
LengthValue length => LengthValue.Floor(length),
TimeValue time => TimeValue.Floor(time),
AreaValue area => AreaValue.Floor(area),
VolumeValue volume => VolumeValue.Floor(volume),
_ => 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 @@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
LengthValue length => LengthValue.Frac(length),
TimeValue time => TimeValue.Frac(time),
AreaValue area => AreaValue.Frac(area),
VolumeValue volume => VolumeValue.Frac(volume),
_ => 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 @@ -63,6 +63,9 @@ public override object Execute(ExpressionParameters? parameters)
(NumberValue left, AreaValue right) => left * right,
(AreaValue left, NumberValue right) => left * right,

(NumberValue left, VolumeValue right) => left * right,
(VolumeValue 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 cb8b20a

Please sign in to comment.