Use switch expression to dispatch operators
[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         return switch (operator) {
64             case DIV -> BigDecimalNumberExpr.of(l.divide(r));
65             case EQUALS -> YangBooleanConstantExpr.of(l.equals(r));
66             case GT -> YangBooleanConstantExpr.of(l.compareTo(r) > 0);
67             case GTE -> YangBooleanConstantExpr.of(l.compareTo(r) >= 0);
68             case LT -> YangBooleanConstantExpr.of(l.compareTo(r) < 0);
69             case LTE -> YangBooleanConstantExpr.of(l.compareTo(r) <= 0);
70             case MINUS -> BigDecimalNumberExpr.of(l.subtract(r));
71             case MOD -> BigDecimalNumberExpr.of(l.remainder(r));
72             case MUL -> BigDecimalNumberExpr.of(l.multiply(r));
73             case NOT_EQUALS -> YangBooleanConstantExpr.of(!l.equals(r));
74             case PLUS -> BigDecimalNumberExpr.of(l.add(r));
75         };
76     }
77
78     @Override
79     protected Object readResolve() {
80         return INSTANCE;
81     }
82 }