/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.lang;
import org.codehaus.groovy.runtime.
InvokerHelper;
import java.util.
AbstractList;
import java.util.
ArrayList;
import java.util.
Collection;
import java.util.
List;
/**
* Constructing Ranges like 0..<0
*/
public class
EmptyRange<T extends
Comparable> extends
AbstractList<T> implements
Range<T> {
/**
* The value at which the range originates (may be <code>null</code>).
*/
protected T
at;
/**
* Creates a new {@link EmptyRange}.
*
* @param at the value at which the range starts (may be <code>null</code>).
*/
public
EmptyRange(T
at) {
this.
at =
at;
}
/**
* {@inheritDoc}
*/
@
Override
public T
getFrom() {
return
at;
}
/**
* {@inheritDoc}
*/
@
Override
public T
getTo() {
return
at;
}
/**
* Never true for an empty range.
*
* @return <code>false</code>
*/
@
Override
public boolean
isReverse() {
return false;
}
/**
* Never true for an empty range.
*
* @return <code>false</code>
*/
@
Override
public boolean
containsWithinBounds(
Object o) {
return false;
}
/**
* {@inheritDoc}
*/
@
Override
public
String inspect() {
return
InvokerHelper.
inspect(
at) + "..<" +
InvokerHelper.
inspect(
at);
}
/**
* {@inheritDoc}
*/
public
String toString() {
return (null ==
at)
? "null..<null"
:
at + "..<" +
at;
}
/**
* Always 0 for an empty range.
*
* @return 0
*/
@
Override
public int
size() {
return 0;
}
/**
* Always throws <code>IndexOutOfBoundsException</code> for an empty range.
*
* @throws IndexOutOfBoundsException always
*/
@
Override
public T
get(int
index) {
throw new
IndexOutOfBoundsException("can't get values from Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException always
*/
@
Override
public boolean
add(T
o) {
throw new
UnsupportedOperationException("cannot add to Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public boolean
addAll(int
index,
Collection<? extends T>
c) {
throw new
UnsupportedOperationException("cannot add to Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public boolean
addAll(
Collection<? extends T>
c) {
throw new
UnsupportedOperationException("cannot add to Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public boolean
remove(
Object o) {
throw new
UnsupportedOperationException("cannot remove from Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public T
remove(int
index) {
throw new
UnsupportedOperationException("cannot remove from Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public boolean
removeAll(
Collection<?>
c) {
throw new
UnsupportedOperationException("cannot remove from Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public boolean
retainAll(
Collection<?>
c) {
throw new
UnsupportedOperationException("cannot retainAll in Empty Ranges");
}
/**
* Always throws <code>UnsupportedOperationException</code> for an empty range.
*
* @throws UnsupportedOperationException
*/
@
Override
public T
set(int
index, T
element) {
throw new
UnsupportedOperationException("cannot set in Empty Ranges");
}
/**
* Always does nothing for an empty range.
*/
@
Override
public void
step(int
step,
Closure closure) {
}
/**
* Always returns an empty list for an empty range.
*/
@
Override
public
List<T>
step(int
step) {
return new
ArrayList<T>();
}
}