437ff0dc50add0f1dc3d7285d8af33cf7555068a
[yangtools.git] / xpath / 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     static final BigDecimalXPathMathSupport INSTANCE = new BigDecimalXPathMathSupport();
14
15     private static final long serialVersionUID = 1L;
16     private static final BigDecimalNumberExpr ZERO = BigDecimalNumberExpr.of(BigDecimal.ZERO);
17     private static final BigDecimalNumberExpr ONE = BigDecimalNumberExpr.of(BigDecimal.ONE);
18     private static final BigDecimalNumberExpr TEN = BigDecimalNumberExpr.of(BigDecimal.TEN);
19
20     private BigDecimalXPathMathSupport() {
21         super(BigDecimalNumberExpr.class);
22     }
23
24     @Override
25     public BigDecimalNumberExpr createNumber(final String str) {
26         switch (str) {
27             case "0":
28                 return ZERO;
29             case "1":
30                 return ONE;
31             case "10":
32                 return TEN;
33             default:
34                 return BigDecimalNumberExpr.of(new BigDecimal(str));
35         }
36     }
37
38     @Override
39     public BigDecimalNumberExpr createNumber(final int value) {
40         switch (value) {
41             case 0:
42                 return ZERO;
43             case 1:
44                 return ONE;
45             case 10:
46                 return TEN;
47             default:
48                 return BigDecimalNumberExpr.of(BigDecimal.valueOf(value));
49         }
50     }
51
52     @Override
53     protected BigDecimalNumberExpr doNegateNumber(final BigDecimalNumberExpr number) {
54         return BigDecimalNumberExpr.of(number.getNumber().negate());
55     }
56
57     @Override
58     protected YangExpr doEvaluate(final YangBinaryOperator operator, final BigDecimalNumberExpr left,
59             final BigDecimalNumberExpr right) {
60         final BigDecimal l = left.getNumber();
61         final BigDecimal r = right.getNumber();
62
63         final BigDecimal result;
64         switch (operator) {
65             case DIV:
66                 result = l.divide(r);
67                 break;
68             case EQUALS:
69                 return YangBooleanConstantExpr.of(l.equals(r));
70             case GT:
71                 return YangBooleanConstantExpr.of(l.compareTo(r) > 0);
72             case GTE:
73                 return YangBooleanConstantExpr.of(l.compareTo(r) >= 0);
74             case LT:
75                 return YangBooleanConstantExpr.of(l.compareTo(r) < 0);
76             case LTE:
77                 return YangBooleanConstantExpr.of(l.compareTo(r) <= 0);
78             case MINUS:
79                 result = l.subtract(r);
80                 break;
81             case MOD:
82                 result = l.remainder(r);
83                 break;
84             case MUL:
85                 result = l.multiply(r);
86                 break;
87             case NOT_EQUALS:
88                 return YangBooleanConstantExpr.of(!l.equals(r));
89             case PLUS:
90                 result = l.add(r);
91                 break;
92             default:
93                 throw new IllegalStateException("Unhandled operator " + operator);
94         }
95
96         return BigDecimalNumberExpr.of(result);
97     }
98
99     @Override
100     protected Object readResolve() {
101         return INSTANCE;
102     }
103 }