Update yang-xpath-api design
[yangtools.git] / yang / yang-xpath-api / src / main / java / org / opendaylight / yangtools / yang / xpath / api / BigDecimalXPathMathSupport.java
1 /*
2  * Copyright (c) 2019 Pantheon Technologies, s.r.o.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.xpath.api;
9
10 import java.math.BigDecimal;
11
12 final class BigDecimalXPathMathSupport extends AbstractYangXPathMathSupport<BigDecimalNumberExpr> {
13     private static final BigDecimalXPathMathSupport INSTANCE = new BigDecimalXPathMathSupport();
14     private static final BigDecimalNumberExpr ZERO = BigDecimalNumberExpr.of(BigDecimal.ZERO);
15     private static final BigDecimalNumberExpr ONE = BigDecimalNumberExpr.of(BigDecimal.ONE);
16     private static final BigDecimalNumberExpr TEN = BigDecimalNumberExpr.of(BigDecimal.TEN);
17
18     private BigDecimalXPathMathSupport() {
19         super(BigDecimalNumberExpr.class);
20     }
21
22     static BigDecimalXPathMathSupport getInstance() {
23         return INSTANCE;
24     }
25
26     @Override
27     public BigDecimalNumberExpr createNumber(final String str) {
28         switch (str) {
29             case "0":
30                 return ZERO;
31             case "1":
32                 return ONE;
33             case "10":
34                 return TEN;
35             default:
36                 return BigDecimalNumberExpr.of(new BigDecimal(str));
37         }
38     }
39
40     @Override
41     BigDecimalNumberExpr doNegate(final BigDecimalNumberExpr number) {
42         return BigDecimalNumberExpr.of(number.getNumber().negate());
43     }
44
45     @Override
46     YangExpr evaluate(final YangBinaryOperator operator, final BigDecimalNumberExpr left,
47             final BigDecimalNumberExpr right) {
48         final BigDecimal l = left.getNumber();
49         final BigDecimal r = right.getNumber();
50
51         final BigDecimal result;
52         switch (operator) {
53             case DIV:
54                 result = l.divide(r);
55                 break;
56             case EQUALS:
57                 return YangBooleanConstantExpr.of(l.equals(r));
58             case GT:
59                 return YangBooleanConstantExpr.of(l.compareTo(r) > 0);
60             case GTE:
61                 return YangBooleanConstantExpr.of(l.compareTo(r) >= 0);
62             case LT:
63                 return YangBooleanConstantExpr.of(l.compareTo(r) < 0);
64             case LTE:
65                 return YangBooleanConstantExpr.of(l.compareTo(r) <= 0);
66             case MINUS:
67                 result = l.subtract(r);
68                 break;
69             case MOD:
70                 result = l.remainder(r);
71                 break;
72             case MUL:
73                 result = l.multiply(r);
74                 break;
75             case NOT_EQUALS:
76                 return YangBooleanConstantExpr.of(!l.equals(r));
77             case PLUS:
78                 result = l.add(r);
79                 break;
80             default:
81                 throw new IllegalStateException("Unhandled operator " + operator);
82         }
83
84         return BigDecimalNumberExpr.of(result);
85     }
86 }