public virtual XPathResultType GetReturnType (BaseIterator iter) { return ReturnType; }
public abstract object Evaluate (BaseIterator iter);
- public BaseIterator EvaluateNodeSet (BaseIterator iter)
+ public virtual BaseIterator EvaluateNodeSet (BaseIterator iter)
{
XPathResultType type = GetReturnType (iter);
if (type == XPathResultType.NodeSet ||
throw new XPathException ("invalid node type: "+obj.GetType ().ToString ());
}
[MonoTODO]
- public double EvaluateNumber (BaseIterator iter)
+ public virtual double EvaluateNumber (BaseIterator iter)
{
object result;
XPathResultType type = GetReturnType (iter);
}
}
[MonoTODO]
- public string EvaluateString (BaseIterator iter)
+ public virtual string EvaluateString (BaseIterator iter)
{
object result = Evaluate (iter);
XPathResultType type = GetReturnType (iter);
}
}
[MonoTODO]
- public bool EvaluateBoolean (BaseIterator iter)
+ public virtual bool EvaluateBoolean (BaseIterator iter)
{
object result = Evaluate (iter);
XPathResultType type = GetReturnType (iter);
{
public ExprBoolean (Expression left, Expression right) : base (left, right) {}
public override XPathResultType ReturnType { get { return XPathResultType.Boolean; }}
+ public override object Evaluate (BaseIterator iter)
+ {
+ return EvaluateBoolean (iter);
+ }
}
internal class ExprOR : ExprBoolean
{
public ExprOR (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "or"; }}
- public override object Evaluate (BaseIterator iter)
+ public override bool EvaluateBoolean (BaseIterator iter)
{
if (_left.EvaluateBoolean (iter))
return true;
{
public ExprAND (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "and"; }}
- public override object Evaluate (BaseIterator iter)
+ public override bool EvaluateBoolean (BaseIterator iter)
{
if (!_left.EvaluateBoolean (iter))
return false;
{
public EqualityExpr (Expression left, Expression right) : base (left, right) {}
[MonoTODO]
- public override object Evaluate (BaseIterator iter)
+ public override bool EvaluateBoolean (BaseIterator iter)
{
XPathResultType typeL = _left.GetReturnType (iter);
XPathResultType typeR = _right.GetReturnType (iter);
{
public RelationalExpr (Expression left, Expression right) : base (left, right) {}
[MonoTODO]
- public override object Evaluate (BaseIterator iter)
+ public override bool EvaluateBoolean (BaseIterator iter)
{
XPathResultType typeL = _left.GetReturnType (iter);
XPathResultType typeR = _right.GetReturnType (iter);
{
public ExprNumeric (Expression left, Expression right) : base (left, right) {}
public override XPathResultType ReturnType { get { return XPathResultType.Number; }}
+
+ public override object Evaluate (BaseIterator iter)
+ {
+ return EvaluateNumber (iter);
+ }
}
internal class ExprPLUS : ExprNumeric
{
public ExprPLUS (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "+"; }}
- public override object Evaluate (BaseIterator iter)
+ public override double EvaluateNumber (BaseIterator iter)
{
return _left.EvaluateNumber (iter) + _right.EvaluateNumber (iter);
}
{
public ExprMINUS (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "-"; }}
- public override object Evaluate (BaseIterator iter)
+ public override double EvaluateNumber (BaseIterator iter)
{
return _left.EvaluateNumber (iter) - _right.EvaluateNumber (iter);
}
{
public ExprMULT (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "*"; }}
- public override object Evaluate (BaseIterator iter)
+ public override double EvaluateNumber (BaseIterator iter)
{
return _left.EvaluateNumber (iter) * _right.EvaluateNumber (iter);
}
{
public ExprDIV (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return " div "; }}
- public override object Evaluate (BaseIterator iter)
+ public override double EvaluateNumber (BaseIterator iter)
{
return _left.EvaluateNumber (iter) / _right.EvaluateNumber (iter);
}
public ExprMOD (Expression left, Expression right) : base (left, right) {}
protected override String Operator { get { return "%"; }}
[MonoTODO]
- public override object Evaluate (BaseIterator iter)
+ public override double EvaluateNumber (BaseIterator iter)
{
return _left.EvaluateNumber (iter) % _right.EvaluateNumber (iter); // TODO: spec?
}
{
return - _expr.EvaluateNumber (iter);
}
+
+ public override double EvaluateNumber (BaseIterator iter)
+ {
+ return - _expr.EvaluateNumber (iter);
+ }
}
{
return _value;
}
+
+ public override double EvaluateNumber (BaseIterator iter)
+ {
+ return _value;
+ }
}
internal class ExprLiteral : Expression
{
return _value;
}
+
+ public override string EvaluateString (BaseIterator iter)
+ {
+ return _value;
+ }
}
internal class ExprVariable : Expression
protected BaseIterator _iter;
protected Expression _pred;
protected int _pos;
+ protected XPathResultType resType;
public PredicateIterator (BaseIterator iter, Expression pred) : base (iter)
{
_iter = iter;
_pred = pred;
+ resType = pred.GetReturnType (iter);
}
protected PredicateIterator (PredicateIterator other) : base (other)
_iter = (BaseIterator) other._iter.Clone ();
_pred = other._pred;
_pos = other._pos;
+ resType = other.resType;
}
public override XPathNodeIterator Clone () { return new PredicateIterator (this); }
while (_iter.MoveNext ())
{
bool fTrue = true;
- object result = _pred.Evaluate ((BaseIterator) _iter.Clone ());
- if (result is double)
- {
- if ((double) result != _iter.CurrentPosition)
- continue;
+
+ switch (resType) {
+ case XPathResultType.Number:
+ if (_pred.EvaluateNumber (_iter) != _iter.CurrentPosition)
+ continue;
+ break;
+ case XPathResultType.Any: {
+ object result = _pred.Evaluate (_iter);
+ if (result is double)
+ {
+ if ((double) result != _iter.CurrentPosition)
+ continue;
+ }
+ else if (!XPathFunctions.ToBoolean (result))
+ continue;
+ }
+ break;
+ default:
+ if (!_pred.EvaluateBoolean (_iter))
+ continue;
+ break;
}
- else if (!XPathFunctions.ToBoolean (result))
- continue;
_pos ++;
return true;