2 * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.model.api.stmt;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.annotations.Beta;
13 import java.util.Objects;
14 import org.eclipse.jdt.annotation.NonNull;
17 * YANG specification of a numeric value range. This object is used for {@link LengthStatement} and
18 * {@link RangeStatement}.
20 * @author Robert Varga
23 public abstract class ValueRange {
24 private static final class Singleton extends ValueRange {
25 private final @NonNull Number value;
27 Singleton(final @NonNull Number value) {
28 this.value = requireNonNull(value);
32 public @NonNull Number lowerBound() {
37 public @NonNull Number upperBound() {
42 public String toString() {
43 return value.toString();
47 private static final class Range extends ValueRange {
48 private final @NonNull Number lower;
49 private final @NonNull Number upper;
51 Range(final Number lower, final Number upper) {
52 this.lower = requireNonNull(lower);
53 this.upper = requireNonNull(upper);
57 public @NonNull Number lowerBound() {
62 public @NonNull Number upperBound() {
67 public String toString() {
68 return lower + ".." + upper;
72 public static ValueRange of(final @NonNull Number value) {
73 return new Singleton(value);
76 public static ValueRange of(final @NonNull Number lower, final @NonNull Number upper) {
77 return lower.equals(upper) ? of(lower) : new Range(lower, upper);
80 public abstract @NonNull Number lowerBound();
82 public abstract @NonNull Number upperBound();
85 public final int hashCode() {
86 return Objects.hash(lowerBound(), upperBound());
90 public final boolean equals(final Object obj) {
94 if (!(obj instanceof ValueRange)) {
97 final ValueRange other = (ValueRange) obj;
98 return lowerBound().equals(other.lowerBound()) && upperBound().equals(other.upperBound());