2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.xpath.impl;
10 import java.math.BigDecimal;
11 import java.util.Optional;
12 import java.util.function.Function;
13 import org.opendaylight.yangtools.yang.common.QNameModule;
14 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator;
15 import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
16 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
17 import org.opendaylight.yangtools.yang.xpath.api.YangNumberExpr.YangBigDecimal;
19 final class BigDecimalXPathParser extends XPathParser<YangBigDecimal> {
20 private static final YangBigDecimal ZERO = YangBigDecimal.of(BigDecimal.ZERO);
21 private static final YangBigDecimal ONE = YangBigDecimal.of(BigDecimal.ONE);
22 private static final YangBigDecimal TEN = YangBigDecimal.of(BigDecimal.TEN);
24 BigDecimalXPathParser(final QNameModule implicitNamespace, final Function<String, QNameModule> prefixes) {
25 super(implicitNamespace, prefixes);
29 YangBigDecimal createNumber(final String str) {
38 return YangBigDecimal.of(new BigDecimal(str));
43 YangBigDecimal negateNumber(final YangBigDecimal number) {
44 return YangBigDecimal.of(number.getNumber().negate());
48 Optional<YangExpr> simplifyNumbers(final YangBinaryOperator operator, final YangBigDecimal left,
49 final YangBigDecimal right) {
50 final BigDecimal l = left.getNumber();
51 final BigDecimal r = right.getNumber();
53 final BigDecimal result;
59 return of(l.equals(r));
61 return of(l.compareTo(r) > 0);
63 return of(l.compareTo(r) >= 0);
65 return of(l.compareTo(r) < 0);
67 return of(l.compareTo(r) <= 0);
69 result = l.subtract(r);
72 result = l.remainder(r);
75 result = l.multiply(r);
78 return of(!l.equals(r));
83 throw new IllegalStateException("Unhandled operator " + operator);
86 return Optional.of(YangBigDecimal.of(result));
89 private static Optional<YangExpr> of(final boolean value) {
90 return Optional.of(YangBooleanConstantExpr.of(value));