示例#1
0
 protected override ValueProxy Mul(ValueProxy value)
 {
     if (value.IsNumeric())
     {
         return(new Proxy(DayTimeDurationValue.Multiply(_value, Convert.ToDouble(value))));
     }
     throw new XPath2Exception("", Properties.Resources.BinaryOperatorNotDefined, "op:mul",
                               new SequenceType(_value.GetType(), XmlTypeCardinality.One),
                               new SequenceType(value.Value.GetType(), XmlTypeCardinality.One));
 }
示例#2
0
 protected override ValueProxy Promote(ValueProxy val)
 {
     if (val.IsNumeric())
     {
         return(new ShadowProxy(val));
     }
     if (val.GetValueCode() == DurationValue.ProxyValueCode)
     {
         DurationValue duration = (DurationValue)val.Value;
         return(new Proxy(new DayTimeDurationValue(duration.LowPartValue)));
     }
     throw new InvalidCastException();
 }
示例#3
0
 protected override ValueProxy Div(ValueProxy value)
 {
     if (value.IsNumeric())
     {
         return(new Proxy(DayTimeDurationValue.Divide(_value, Convert.ToDouble(value))));
     }
     else if (value.GetValueCode() == DayTimeDurationValue.ProxyValueCode)
     {
         return(new DecimalProxy(DayTimeDurationValue.Divide(_value, (DayTimeDurationValue)value.Value)));
     }
     else
     {
         throw new XPath2Exception("", Properties.Resources.BinaryOperatorNotDefined, "op:div",
                                   new SequenceType(_value.GetType(), XmlTypeCardinality.One),
                                   new SequenceType(value.Value.GetType(), XmlTypeCardinality.One));
     }
 }
        private IEnumerable <XPathItem> CreateEnumerator(object[] dataPool, AbstractNode expr,
                                                         XPath2NodeIterator baseIter)
        {
            XPath2NodeIterator iter    = baseIter.Clone();
            ValueNode          numexpr = expr as ValueNode;

            if (numexpr != null && numexpr.Content is Integer)
            {
                Integer pos = (Integer)numexpr.Content;
                foreach (XPathItem item in iter)
                {
                    if (pos == 1)
                    {
                        yield return(item);

                        break;
                    }
                    else
                    {
                        pos--;
                    }
                }
            }
            else
            {
                ContextProvider provider = new ContextProvider(iter);
                object          res      = Undefined.Value;
                while (iter.MoveNext())
                {
                    if (m_contextSensitive || res == Undefined.Value)
                    {
                        res = expr.Execute(provider, dataPool);
                    }
                    if (res == Undefined.Value)
                    {
                        if (!m_contextSensitive)
                        {
                            break;
                        }
                        continue;
                    }
                    XPath2NodeIterator iter2 = res as XPath2NodeIterator;
                    XPathItem          item;
                    if (iter2 != null)
                    {
                        iter2 = iter2.Clone();
                        if (!iter2.MoveNext())
                        {
                            continue;
                        }
                        item = iter2.Current.Clone();
                        if (!item.IsNode && iter2.MoveNext())
                        {
                            throw new XPath2Exception("FORG0006", Resources.FORG0006, "fn:boolean()",
                                                      new SequenceType(XmlTypeCode.AnyAtomicType, XmlTypeCardinality.OneOrMore));
                        }
                    }
                    else
                    {
                        item = res as XPathItem;
                        if (item == null)
                        {
                            item = new XPath2Item(res);
                        }
                    }
                    if (item.IsNode)
                    {
                        yield return(iter.Current);
                    }
                    else
                    {
                        if (ValueProxy.IsNumeric(item.ValueType))
                        {
                            if (CoreFuncs.OperatorEq(iter.CurrentPosition + 1, item.GetTypedValue()) == CoreFuncs.True)
                            {
                                yield return(iter.Current);

                                if (!m_contextSensitive)
                                {
                                    break;
                                }
                            }
                        }
                        else if (CoreFuncs.GetBooleanValue(item))
                        {
                            yield return(iter.Current);
                        }
                    }
                }
            }
        }
示例#5
0
 public ShadowProxy(ValueProxy proxy)
 {
     _value     = proxy.Value;
     _valueCode = proxy.GetValueCode();
     _isNumeric = proxy.IsNumeric();
 }