Propagate namespaceContext/mathSupport to FunctionSupport
[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     public BigDecimalNumberExpr createNumber(final int value) {
42         switch (value) {
43             case 0:
44                 return ZERO;
45             case 1:
46                 return ONE;
47             case 10:
48                 return TEN;
49             default:
50                 return BigDecimalNumberExpr.of(BigDecimal.valueOf(value));
51         }
52     }
53
54     @Override
55     BigDecimalNumberExpr doNegate(final BigDecimalNumberExpr number) {
56         return BigDecimalNumberExpr.of(number.getNumber().negate());
57     }
58
59     @Override
60     YangExpr evaluate(final YangBinaryOperator operator, final BigDecimalNumberExpr left,
61             final BigDecimalNumberExpr right) {
62         final BigDecimal l = left.getNumber();
63         final BigDecimal r = right.getNumber();
64
65         final BigDecimal result;
66         switch (operator) {
67             case DIV:
68                 result = l.divide(r);
69                 break;
70             case EQUALS:
71                 return YangBooleanConstantExpr.of(l.equals(r));
72             case GT:
73                 return YangBooleanConstantExpr.of(l.compareTo(r) > 0);
74             case GTE:
75                 return YangBooleanConstantExpr.of(l.compareTo(r) >= 0);
76             case LT:
77                 return YangBooleanConstantExpr.of(l.compareTo(r) < 0);
78             case LTE:
79                 return YangBooleanConstantExpr.of(l.compareTo(r) <= 0);
80             case MINUS:
81                 result = l.subtract(r);
82                 break;
83             case MOD:
84                 result = l.remainder(r);
85                 break;
86             case MUL:
87                 result = l.multiply(r);
88                 break;
89             case NOT_EQUALS:
90                 return YangBooleanConstantExpr.of(!l.equals(r));
91             case PLUS:
92                 result = l.add(r);
93                 break;
94             default:
95                 throw new IllegalStateException("Unhandled operator " + operator);
96         }
97
98         return BigDecimalNumberExpr.of(result);
99     }
100 }