using System;
using System.Collections.Generic;
using System.Text;
using BaseTypes;
using BaseTypes.Interfaces;
using FormulaEditor.Interfaces;
namespace FormulaEditor
{
/// <summary>
/// Binary operation acceptor with array
/// </summary>
public class BinaryArrayOperationAcceptor : IBinaryAcceptor
{
#region Fields
/// <summary>
/// Operation acceptor
/// </summary>
private IBinaryAcceptor acceptor;
#endregion
#region Constructors
/// <summary>
/// Constructor
/// </summary>
/// <param name="acceptor">Prototype acceptor</param>
public BinaryArrayOperationAcceptor(IBinaryAcceptor acceptor)
{
this.acceptor = acceptor;
}
#endregion
#region IBinaryAcceptor Members
IObjectOperation IBinaryAcceptor.Accept(object typeA, object typeB)
{
object[] t = new object[] { typeA, typeB };
if (!(typeA is ArrayReturnType) & !(typeB is ArrayReturnType))
{
return acceptor.Accept(typeA, typeB);
}
IObjectOperation ownOp = acceptor.Accept(typeA, typeB);
if (ownOp != null)
{
return ownOp;
}
for (int i = 0; i < t.Length; i++)
{
if (t[i] is ArrayReturnType)
{
ArrayReturnType at = t[i] as ArrayReturnType;
if (!at.IsObjectType)
{
IObjectOperation opb = acceptor.Accept(typeA, typeB);
if (opb != null)
{
return opb;
}
}
}
}
object[] types = new object[] { typeA, typeB };
for (int i = 0; i < 2; i++)
{
types[i] = ArrayReturnType.GetBaseType(types[i]);
}
IObjectOperation op = acceptor.Accept(types[0], types[1]);
if (op != null)
{
return new BinaryArrayOperation(op, typeA, typeB);
}
return null;
}
#endregion
}
}