Update yang-xpath-api design
[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 java.util.Optional;
14
15 abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr<N, ?>> implements YangXPathMathSupport<N> {
16     private final Class<N> numberClass;
17
18     AbstractYangXPathMathSupport(final Class<N> numberClass) {
19         this.numberClass = requireNonNull(numberClass);
20     }
21
22     @Override
23     public final N negateNumber(final YangNumberExpr<?, ?> number) {
24         checkArgument(numberClass.isInstance(requireNonNull(number)), "Expected %s have %s", numberClass, number);
25         return doNegate(numberClass.cast(number));
26     }
27
28
29     @Override
30     public final Optional<YangExpr> tryEvaluate(final YangBinaryOperator operator,
31             final YangNumberExpr<?, ?> left, final YangNumberExpr<?, ?> right) {
32         if (!numberClass.isInstance(left) || !numberClass.isInstance(right)) {
33             requireNonNull(operator);
34             requireNonNull(left);
35             requireNonNull(right);
36             return Optional.empty();
37         }
38
39         return Optional.of(evaluate(requireNonNull(operator), numberClass.cast(left), numberClass.cast(right)));
40     }
41
42     abstract N doNegate(N number);
43
44     /**
45      * Evaluate an  operator and its left- and right-handside.
46      *
47      * @param operator Operator to apply
48      * @param left Left hand-side
49      * @param right Right hand-side
50      * @return Evaluation result
51      */
52     abstract YangExpr evaluate(YangBinaryOperator operator, N left, N right);
53 }