Populate data/ hierarchy
[yangtools.git] / yang / yang-model-api / src / main / java / org / opendaylight / yangtools / yang / model / api / stmt / ValueRange.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  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.model.api.stmt;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import java.util.Objects;
14 import org.eclipse.jdt.annotation.NonNull;
15
16 /**
17  * YANG specification of a numeric value range. This object is used for {@link LengthStatement} and
18  * {@link RangeStatement}.
19  *
20  * @author Robert Varga
21  */
22 @Beta
23 public abstract class ValueRange {
24     private static final class Singleton extends ValueRange {
25         private final @NonNull Number value;
26
27         Singleton(final @NonNull Number value) {
28             this.value = requireNonNull(value);
29         }
30
31         @Override
32         public @NonNull Number lowerBound() {
33             return value;
34         }
35
36         @Override
37         public @NonNull Number upperBound() {
38             return value;
39         }
40
41         @Override
42         public String toString() {
43             return value.toString();
44         }
45     }
46
47     private static final class Range extends ValueRange {
48         private final @NonNull Number lower;
49         private final @NonNull Number upper;
50
51         Range(final Number lower, final Number upper) {
52             this.lower = requireNonNull(lower);
53             this.upper = requireNonNull(upper);
54         }
55
56         @Override
57         public @NonNull Number lowerBound() {
58             return lower;
59         }
60
61         @Override
62         public @NonNull Number upperBound() {
63             return upper;
64         }
65
66         @Override
67         public String toString() {
68             return lower + ".." + upper;
69         }
70     }
71
72     public static ValueRange of(final @NonNull Number value) {
73         return new Singleton(value);
74     }
75
76     public static ValueRange of(final @NonNull Number lower, final @NonNull Number upper) {
77         return lower.equals(upper) ? of(lower) : new Range(lower, upper);
78     }
79
80     public abstract @NonNull Number lowerBound();
81
82     public abstract @NonNull Number upperBound();
83
84     @Override
85     public final int hashCode() {
86         return Objects.hash(lowerBound(), upperBound());
87     }
88
89     @Override
90     public final boolean equals(final Object obj) {
91         if (this == obj) {
92             return true;
93         }
94         if (!(obj instanceof ValueRange)) {
95             return false;
96         }
97         final ValueRange other = (ValueRange) obj;
98         return lowerBound().equals(other.lowerBound()) && upperBound().equals(other.upperBound());
99     }
100 }