using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using BaseTypes;
using FormulaEditor.Interfaces;
namespace FormulaEditor
{
public class ExtendedFormulaCreator : ElementaryObjectsCreator
{
const Double a = 0;
const Int32 it = 0;
#region Ctor
protected ExtendedFormulaCreator(Hashtable table)
: base(table, false)
{
opDetectors = new IOperationDetector[] { new OneVariableFunctionDetector(table), new ExtendedOperationDetector(table, this) };
ElementaryBinaryDetector plus = new ElementaryBinaryDetector('+');
plus.Add(StringConcatOperation.Object);
plus.Add(StringObjectConcatOperation.Object);
LikeOperation like = new LikeOperation();
like.Add(LikeObjectOperation.Object);
detectors = new IBinaryDetector[]
{
new LogicalDetector('\u2217'), new LogicalDetector('\u2216'),
LogicalEqualityDetector.Object,
new BitDetector('|'), new BitDetector('&'), new BitDetector('^'),
new BitDetector('\u2266'), new BitDetector('\u2267'),
ComparationDetector.Object, like, RealMatrixBinary.Singleton,
RealVectorBinary.Singleton,
plus, new ElementaryBinaryDetector('-'),
RealMatrixMultiplication.Singleton,
new ElementaryBinaryDetector('*'),
Vector3DProduct.Object
};
}
protected ExtendedFormulaCreator(IVariableDetector detector)
: base(detector, false)
{
opDetectors = new IOperationDetector[] { new OneVariableFunctionDetector(detector), new ExtendedOperationDetector(detector, this) };
ElementaryBinaryDetector plus = new ElementaryBinaryDetector('+');
plus.Add(StringConcatOperation.Object);
plus.Add(StringObjectConcatOperation.Object);
LikeOperation like = new LikeOperation();
like.Add(LikeObjectOperation.Object);
detectors = new IBinaryDetector[]
{
new LogicalDetector('\u2217'), new LogicalDetector('\u2216'),
LogicalEqualityDetector.Object,
new BitDetector('|'), new BitDetector('&'), new BitDetector('^'),
new BitDetector('\u2266'), new BitDetector('\u2267'),
ComparationDetector.Object, like, RealMatrixBinary.Singleton,
RealVectorBinary.Singleton,
plus, new ElementaryBinaryDetector('-'),
RealMatrixMultiplication.Singleton,
new ElementaryBinaryDetector('*'),
Vector3DProduct.Object
};
}
#endregion
#region Overriden Members
public override IObjectOperation GetPowerOperation(object valType, object powType)
{
if (powType == VirtualTranspose.Singleton)
{
if (valType is ArrayReturnType)
{
ArrayReturnType at = valType as ArrayReturnType;
if (!at.IsObjectType)
{
int[] dim = at.Dimension;
if (at.ElementType.Equals(a) & dim.Length == 2)
{
return new TransposeRealMatrix(dim[0], dim[1]);
}
}
}
}
if (valType is ArrayReturnType)
{
ArrayReturnType at = valType as ArrayReturnType;
if (!at.IsObjectType)
{
int[] dim = at.Dimension;
if (at.ElementType.Equals(a) & dim.Length == 2)
{
if (dim[0] == dim[1])
{
if (powType.Equals(a) | powType.Equals(it))
{
return new RealMatrixPower(dim[0]);
}
}
}
}
}
return base.GetPowerOperation(valType, powType);
}
public override IOperationDetector GetDetector(int i)
{
if (i == 0)
{
return VirtualTranspose.Singleton;
}
return base.GetDetector(i - 1);
}
public override int OperationCount
{
get
{
return base.OperationCount + 1;
}
}
#endregion
#region Specific members
public static IFormulaObjectCreator GetCreator(Hashtable table)
{
ExtendedFormulaCreator prot = new ExtendedFormulaCreator(table);
prot.Add(ElementaryRealDetector.Object);
IFormulaObjectCreator creator = new FormulaArrayObjectCreator(prot);
return creator;
}
public static IFormulaObjectCreator GetCreator(IVariableDetector detector)
{
ExtendedFormulaCreator prot = new ExtendedFormulaCreator(detector);
prot.Add(ElementaryRealDetector.Object);
IFormulaObjectCreator creator = new FormulaArrayObjectCreator(prot);
return creator;
}
public static IFormulaObjectCreator GetCreator(IVariableDetector detector, IOperationDetector[] additional)
{
ExtendedFormulaCreator prot = new ExtendedFormulaCreator(detector);
prot.Add(ElementaryRealDetector.Object);
foreach (IOperationDetector d in additional)
{
prot.Add(d);
}
IFormulaObjectCreator creator = new FormulaArrayObjectCreator(prot);
return creator;
}
#endregion
}
}