Populate model/ hierarchy
[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 static final long serialVersionUID = 1L;
26
27     private final Class<N> numberClass;
28
29     protected AbstractYangXPathMathSupport(final Class<N> numberClass) {
30         this.numberClass = requireNonNull(numberClass);
31     }
32
33     @Override
34     public final N negateNumber(final YangNumberExpr number) {
35         checkArgument(numberClass.isInstance(requireNonNull(number)), "Expected %s have %s", numberClass, number);
36         return doNegateNumber(numberClass.cast(number));
37     }
38
39     @Override
40     public final Optional<YangExpr> tryEvaluate(final YangBinaryOperator operator, final YangNumberExpr left,
41             final YangNumberExpr right) {
42         if (!numberClass.isInstance(left) || !numberClass.isInstance(right)) {
43             requireNonNull(operator);
44             requireNonNull(left);
45             requireNonNull(right);
46             return Optional.empty();
47         }
48
49         return Optional.of(doEvaluate(requireNonNull(operator), numberClass.cast(left), numberClass.cast(right)));
50     }
51
52     /**
53      * Create a {@link YangNumberExpr} representing the negated value of a number.
54      *
55      * @param number input number
56      * @return negated number expression
57      */
58     protected abstract N doNegateNumber(N number);
59
60     /**
61      * Evaluate an  operator and its left- and right-handside.
62      *
63      * @param operator Operator to apply
64      * @param left Left hand-side
65      * @param right Right hand-side
66      * @return Evaluation result
67      */
68     protected abstract YangExpr doEvaluate(YangBinaryOperator operator, N left, N right);
69
70     protected abstract Object readResolve();
71 }