Fix XPathExpr parsing
[yangtools.git] / yang / yang-xpath-api / src / main / java / org / opendaylight / yangtools / yang / xpath / api / AbstractYangXPathMathSupport.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 static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.annotations.Beta;
14 import java.util.Optional;
15
16 /**
17  * Type-safe shim to ensure concrete {@link YangXPathMathSupport} implementations get handed properly-typed
18  * YangNumberExprs.
19  *
20  * @param <N> Type of YangNumberExpr
21  * @author Robert Varga
22  */
23 @Beta
24 public abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr> implements YangXPathMathSupport {
25     private final Class<N> numberClass;
26
27     protected AbstractYangXPathMathSupport(final Class<N> numberClass) {
28         this.numberClass = requireNonNull(numberClass);
29     }
30
31     @Override
32     public final N negateNumber(final YangNumberExpr number) {
33         checkArgument(numberClass.isInstance(requireNonNull(number)), "Expected %s have %s", numberClass, number);
34         return doNegateNumber(numberClass.cast(number));
35     }
36
37     @Override
38     public final Optional<YangExpr> tryEvaluate(final YangBinaryOperator operator, final YangNumberExpr left,
39             final YangNumberExpr right) {
40         if (!numberClass.isInstance(left) || !numberClass.isInstance(right)) {
41             requireNonNull(operator);
42             requireNonNull(left);
43             requireNonNull(right);
44             return Optional.empty();
45         }
46
47         return Optional.of(doEvaluate(requireNonNull(operator), numberClass.cast(left), numberClass.cast(right)));
48     }
49
50     /**
51      * Create a {@link YangNumberExpr} representing the negated value of a number.
52      *
53      * @param number input number
54      * @return negated number expression
55      */
56     protected abstract N doNegateNumber(N number);
57
58     /**
59      * Evaluate an  operator and its left- and right-handside.
60      *
61      * @param operator Operator to apply
62      * @param left Left hand-side
63      * @param right Right hand-side
64      * @return Evaluation result
65      */
66     protected abstract YangExpr doEvaluate(YangBinaryOperator operator, N left, N right);
67 }