/* * 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 net.jini.core.constraint; import java.lang.reflect.Array; import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; /** * An immutable set backed by an array. Any attempts to modify the set * result in UnsupportedOperationException being thrown. * * @author Sun Microsystems, Inc. * */ final class ArraySet implements Set { /** * The array. */ private final Object[] elements; /** * Creates an instance from an array. The array is not copied. */ ArraySet(Object[] elements) { this.elements = elements; } /* inherit javadoc */ public int size() { return elements.length; } /* inherit javadoc */ public boolean isEmpty() { return elements.length == 0; } /* inherit javadoc */ public boolean contains(Object o) { for (int i = elements.length; --i >= 0; ) { if (elements[i].equals(o)) { return true; } } return false; } /* inherit javadoc */ public Iterator iterator() { return new Iter(); } /** * Simple iterator. */ private final class Iter implements Iterator { /** * Index into the array. */ private int idx = 0; // compiler would generate crud because default constructor is private Iter() { } /* inherit javadoc */ public boolean hasNext() { return idx < elements.length; } /* inherit javadoc */ public Object next() { if (idx < elements.length) { return elements[idx++]; } throw new NoSuchElementException(); } /** * Always throws UnsupportedOperationException. */ public void remove() { throw new UnsupportedOperationException(); } } /* inherit javadoc */ public Object[] toArray() { Object[] a = new Object[elements.length]; System.arraycopy(elements, 0, a, 0, elements.length); return a; } /* inherit javadoc */ public Object[] toArray(Object a[]) { if (a.length < elements.length) { a = (Object[]) Array.newInstance(a.getClass().getComponentType(), elements.length); } System.arraycopy(elements, 0, a, 0, elements.length); if (a.length > elements.length) { a[elements.length] = null; } return a; } /** * Always throws UnsupportedOperationException. */ public boolean add(Object o) { throw new UnsupportedOperationException(); } /** * Always throws UnsupportedOperationException. */ public boolean remove(Object o) { throw new UnsupportedOperationException(); } /* inherit javadoc */ public boolean containsAll(Collection c) { Iterator iter = c.iterator(); while (iter.hasNext()) { if (!contains(iter.next())) { return false; } } return true; } /** * Always throws UnsupportedOperationException. */ public boolean addAll(Collection c) { throw new UnsupportedOperationException(); } /** * Always throws UnsupportedOperationException. */ public boolean retainAll(Collection c) { throw new UnsupportedOperationException(); } /** * Always throws UnsupportedOperationException. */ public boolean removeAll(Collection c) { throw new UnsupportedOperationException(); } /** * Always throws UnsupportedOperationException. */ public void clear() { throw new UnsupportedOperationException(); } /* inherit javadoc */ public boolean equals(Object o) { return (this == o || (o instanceof Set && ((Collection) o).size() == elements.length && containsAll((Collection) o))); } /* inherit javadoc */ public int hashCode() { return Constraint.hash(elements); } /* inherit javadoc */ public String toString() { return Constraint.toString(elements); } }