namespace com.azkoss.excellite
{
using System;
internal sealed class FormulaTokensFactory
{
// Methods
///
///Initializes a new instance of the class.
///
private FormulaTokensFactory()
{
}
///
///Creates formula token from rpn bytes and the code read from that bytes.
///
///The RPN bytes.
///The start index to read code from the RPN bytes.
///created formula token
public static FormulaToken CreateFrom(byte[] rpnBytes, int startIndex)
{
byte num1 = rpnBytes[startIndex];
FormulaToken token1 = FormulaTokensFactory.CreateFromCode(num1);
token1.Read(rpnBytes, startIndex + 1);
return token1;
}
///
///Creates formula token from code.
///
///The token code.
///created formula token
public static FormulaToken CreateFromCode(FormulaTokenCode tokenCode)
{
FormulaToken token1 = null;
switch (tokenCode)
{
case FormulaTokenCode.Exp:
case FormulaTokenCode.Tbl:
case FormulaTokenCode.Attr:
{
return new ControlFormulaToken(tokenCode);
}
case FormulaTokenCode.Add:
case FormulaTokenCode.Sub:
case FormulaTokenCode.Mul:
case FormulaTokenCode.Div:
case FormulaTokenCode.Power:
case FormulaTokenCode.Concat:
case FormulaTokenCode.Lt:
case FormulaTokenCode.Le:
case FormulaTokenCode.Eq:
case FormulaTokenCode.Ge:
case FormulaTokenCode.Gt:
case FormulaTokenCode.Ne:
case FormulaTokenCode.Isect:
case FormulaTokenCode.List:
case FormulaTokenCode.Range:
{
return new BinaryOperatorFormulaToken(tokenCode);
}
case FormulaTokenCode.Uplus:
case FormulaTokenCode.Uminus:
case FormulaTokenCode.Percent:
case FormulaTokenCode.Parentheses:
{
return new UnaryOperatorFormulaToken(tokenCode);
}
case FormulaTokenCode.MissArg:
{
return new MissArgFormulaToken();
}
case FormulaTokenCode.Str:
{
return new StrFormulaToken();
}
case FormulaTokenCode.Err:
{
return new ErrFormulaToken();
}
case FormulaTokenCode.Bool:
{
return new BoolFormulaToken();
}
case FormulaTokenCode.Int:
{
return new IntFormulaToken();
}
case FormulaTokenCode.Num:
{
return new NumFormulaToken();
}
case FormulaTokenCode.Array1:
case FormulaTokenCode.Array2:
case FormulaTokenCode.Array3:
{
return new ArrayFormulaToken(tokenCode);
}
case FormulaTokenCode.Func1:
case FormulaTokenCode.Func2:
case FormulaTokenCode.Func3:
{
return new FunctionFormulaToken(tokenCode);
}
case FormulaTokenCode.FuncVar1:
case FormulaTokenCode.FuncVar2:
case FormulaTokenCode.FuncVar3:
{
return new FunctionVarFormulaToken(tokenCode);
}
case FormulaTokenCode.Name1:
case FormulaTokenCode.Name2:
case FormulaTokenCode.Name3:
{
return new NameFormulaToken(tokenCode);
}
case FormulaTokenCode.Ref1:
case FormulaTokenCode.Ref2:
case FormulaTokenCode.Ref3:
{
return new RefFormulaToken(tokenCode);
}
case FormulaTokenCode.Area1:
case FormulaTokenCode.Area2:
case FormulaTokenCode.Area3:
{
return new AreaFormulaToken(tokenCode);
}
case FormulaTokenCode.RefErr1:
case FormulaTokenCode.RefErr2:
case FormulaTokenCode.RefErr3:
{
return new RefErrFormulaToken(tokenCode);
}
case FormulaTokenCode.Ref3d1:
case FormulaTokenCode.Ref3d2:
case FormulaTokenCode.Ref3d3:
{
return new Ref3dFormulaToken(tokenCode);
}
case FormulaTokenCode.Area3d1:
case FormulaTokenCode.Area3d2:
case FormulaTokenCode.Area3d3:
{
return new Area3dFormulaToken(tokenCode);
}
case FormulaTokenCode.RefErr3d1:
case FormulaTokenCode.RefErr3d2:
case FormulaTokenCode.RefErr3d3:
{
return new RefErr3dFormulaToken(tokenCode);
}
case FormulaTokenCode.AreaErr3d1:
case FormulaTokenCode.AreaErr3d2:
case FormulaTokenCode.AreaErr3d3:
{
return new AreaErr3dFormulaToken(tokenCode);
}
}
throw new ArgumentException("We don't support specified formula token: " + tokenCode);
}
///
///Creates formula token from byte code.
///
///The byte code.
///created formula token
public static FormulaToken CreateFromCode(byte code)
{
return FormulaTokensFactory.CreateFromCode((FormulaTokenCode) code);
}
///
///Creates formula token form the name of the function.
///
///The name of the function.
///The token class.
///The arguments count for the function.
///created formula token
public static FormulaToken CreateFunctionFromName(string name, FormulaTokenClass tokenClass, byte argumentsCount)
{
FormulaToken token1 = null;
FormulaTokenClass class1;
object[] objArray1;
if (!FormulaFunctionsTable.Instance[name].IsFixedArgumentCount)
{
class1 = tokenClass;
switch (class1)
{
case FormulaTokenClass.Reference:
{
token1 = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar1);
goto Label_008C;
}
case FormulaTokenClass.Variable:
{
token1 = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar2);
goto Label_008C;
}
case FormulaTokenClass.Array:
{
token1 = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar3);
goto Label_008C;
}
}
}
else
{
class1 = tokenClass;
switch (class1)
{
case FormulaTokenClass.Reference:
{
token1 = new FunctionFormulaToken(FormulaTokenCode.Func1);
break;
}
case FormulaTokenClass.Variable:
{
token1 = new FunctionFormulaToken(FormulaTokenCode.Func2);
break;
}
case FormulaTokenClass.Array:
{
token1 = new FunctionFormulaToken(FormulaTokenCode.Func3);
break;
}
}
objArray1 = new object[] { name } ;
token1.DelayInitialize(objArray1);
return token1;
}
Label_008C:
objArray1 = new object[2];
objArray1[0] = name;
objArray1[1] = argumentsCount;
token1.DelayInitialize(objArray1);
return token1;
}
}
}