idiv method

  1. @override
XPathInteger idiv(
  1. XPathNumeric other
)
override

Implementation

@override
XPathInteger idiv(XPathNumeric other) => switch (other) {
  final XPathInteger i => idiv(i.toDecimal()),
  final XPathDecimal d =>
    d.unscaledValue == BigInt.zero
        ? throw XPathEvaluationException(
            XPathErrorCode.FOAR0001,
            'Division by zero in idiv',
          )
        : () {
            final maxScale = math.max(scale, d.scale);
            final u1 = unscaledValue * _ten.pow(maxScale - scale);
            final u2 = d.unscaledValue * _ten.pow(maxScale - d.scale);
            return XPathInteger(u1 ~/ u2);
          }(),
  final XPathDouble d =>
    d.value == 0
        ? throw XPathEvaluationException(
            XPathErrorCode.FOAR0001,
            'Division by zero in idiv',
          )
        : d.value.isNaN
        ? throw XPathEvaluationException(
            XPathErrorCode.FOAR0002,
            'NaN in idiv',
          )
        : d.value.isInfinite
        ? XPathInteger(BigInt.zero)
        : XPathDouble(toDouble()).idiv(d),
};