Add yang-xpath-api
[yangtools.git] / yang / yang-xpath-api / src / main / java / org / opendaylight / yangtools / yang / xpath / api / YangNumberExpr.java
1 /*
2  * Copyright (c) 2018 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 java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import java.math.BigDecimal;
14 import org.eclipse.jdt.annotation.Nullable;
15
16 /**
17  * A number-bearing expression.
18  */
19 @Beta
20 public abstract class YangNumberExpr<T extends YangNumberExpr<T, N>, N extends Number> implements YangExpr {
21     public static final class YangBigDecimal extends YangNumberExpr<YangBigDecimal, BigDecimal> {
22         private static final long serialVersionUID = 1L;
23
24         private final BigDecimal number;
25
26         YangBigDecimal(final BigDecimal number) {
27             this.number = requireNonNull(number);
28         }
29
30         @Override
31         public BigDecimal getNumber() {
32             return number;
33         }
34
35         @Override
36         public int hashCode() {
37             return number.hashCode();
38         }
39
40         @Override
41         public boolean equals(final @Nullable Object obj) {
42             return this == obj || obj instanceof YangBigDecimal
43                     && number.equals(((YangBigDecimal) obj).number);
44         }
45
46         @Override
47         public String toString() {
48             return number.toString();
49         }
50     }
51
52     public static final class YangDouble extends YangNumberExpr<YangDouble, Double> {
53         private static final long serialVersionUID = 1L;
54
55         private final double value;
56
57         YangDouble(final double value) {
58             this.value = value;
59         }
60
61         public double getValue() {
62             return value;
63         }
64
65         @Override
66         public Double getNumber() {
67             return value;
68         }
69
70         @Override
71         public int hashCode() {
72             return Double.hashCode(value);
73         }
74
75         @Override
76         public boolean equals(final @Nullable Object obj) {
77             return this == obj || obj instanceof YangDouble && value == ((YangDouble) obj).value;
78         }
79
80         @Override
81         public String toString() {
82             return String.valueOf(value);
83         }
84     }
85
86
87     private static final long serialVersionUID = 1L;
88
89     YangNumberExpr() {
90         // Hidden to prevent external subclassing
91     }
92
93     public static YangBigDecimal of(final BigDecimal number) {
94         return new YangBigDecimal(number);
95     }
96
97     public static YangDouble of(final double value) {
98         return new YangDouble(value);
99     }
100
101     public abstract N getNumber();
102 }