/* * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.model.api.stmt; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; /** * YANG specification of a numeric value range. This object is used for {@link LengthStatement} and * {@link RangeStatement}. * * @author Robert Varga */ @Beta public abstract class ValueRange { private static final class Singleton extends ValueRange { private final @NonNull Number value; Singleton(final @NonNull Number value) { this.value = requireNonNull(value); } @Override public @NonNull Number lowerBound() { return value; } @Override public @NonNull Number upperBound() { return value; } @Override public String toString() { return value.toString(); } } private static final class Range extends ValueRange { private final @NonNull Number lower; private final @NonNull Number upper; Range(final Number lower, final Number upper) { this.lower = requireNonNull(lower); this.upper = requireNonNull(upper); } @Override public @NonNull Number lowerBound() { return lower; } @Override public @NonNull Number upperBound() { return upper; } @Override public String toString() { return lower + ".." + upper; } } public static ValueRange of(final @NonNull Number value) { return new Singleton(value); } public static ValueRange of(final @NonNull Number lower, final @NonNull Number upper) { return lower.equals(upper) ? of(lower) : new Range(lower, upper); } public abstract @NonNull Number lowerBound(); public abstract @NonNull Number upperBound(); @Override public final int hashCode() { return Objects.hash(lowerBound(), upperBound()); } @Override public final boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof ValueRange)) { return false; } final ValueRange other = (ValueRange) obj; return lowerBound().equals(other.lowerBound()) && upperBound().equals(other.upperBound()); } }