All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.testifyproject.google.common.collect.Constraints Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
/*
 * Copyright (C) 2007 The Guava Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in org.testifyproject.testifyprojectpliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org.testifyproject/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 org.testifyproject.testifyproject.google.org.testifyproject.testifyprojectmon.collect;

import static org.testifyproject.testifyproject.google.org.testifyproject.testifyprojectmon.base.Preconditions.checkNotNull;

import org.testifyproject.testifyproject.google.org.testifyproject.testifyprojectmon.annotations.GwtCompatible;

import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
import java.util.RandomAccess;
import java.util.Set;
import java.util.SortedSet;

/**
 * Factories and utilities pertaining to the {@link Constraint} interface.
 *
 * @author Mike Bostock
 * @author Jared Levy
 */
@GwtCompatible
final class Constraints {
  private Constraints() {}

  /**
   * Returns a constrained view of the specified collection, using the specified
   * constraint. Any operations that add new elements to the collection will
   * call the provided constraint. However, this method does not verify that
   * existing elements satisfy the constraint.
   *
   * 

The returned collection is not serializable. * * @param collection the collection to constrain * @param constraint the constraint that validates added elements * @return a constrained view of the collection */ public static Collection constrainedCollection( Collection collection, Constraint constraint) { return new ConstrainedCollection(collection, constraint); } /** @see Constraints#constrainedCollection */ static class ConstrainedCollection extends ForwardingCollection { private final Collection org.testifyproject.testifyprojectlegate; private final Constraint constraint; public ConstrainedCollection( Collection org.testifyproject.testifyprojectlegate, Constraint constraint) { this.org.testifyproject.testifyprojectlegate = checkNotNull(org.testifyproject.testifyprojectlegate); this.constraint = checkNotNull(constraint); } @Override protected Collection org.testifyproject.testifyprojectlegate() { return org.testifyproject.testifyprojectlegate; } @Override public boolean add(E element) { constraint.checkElement(element); return org.testifyproject.testifyprojectlegate.add(element); } @Override public boolean addAll(Collection elements) { return org.testifyproject.testifyprojectlegate.addAll(checkElements(elements, constraint)); } } /** * Returns a constrained view of the specified set, using the specified * constraint. Any operations that add new elements to the set will call the * provided constraint. However, this method does not verify that existing * elements satisfy the constraint. * *

The returned set is not serializable. * * @param set the set to constrain * @param constraint the constraint that validates added elements * @return a constrained view of the set */ public static Set constrainedSet( Set set, Constraint constraint) { return new ConstrainedSet(set, constraint); } /** @see Constraints#constrainedSet */ static class ConstrainedSet extends ForwardingSet { private final Set org.testifyproject.testifyprojectlegate; private final Constraint constraint; public ConstrainedSet(Set org.testifyproject.testifyprojectlegate, Constraint constraint) { this.org.testifyproject.testifyprojectlegate = checkNotNull(org.testifyproject.testifyprojectlegate); this.constraint = checkNotNull(constraint); } @Override protected Set org.testifyproject.testifyprojectlegate() { return org.testifyproject.testifyprojectlegate; } @Override public boolean add(E element) { constraint.checkElement(element); return org.testifyproject.testifyprojectlegate.add(element); } @Override public boolean addAll(Collection elements) { return org.testifyproject.testifyprojectlegate.addAll(checkElements(elements, constraint)); } } /** * Returns a constrained view of the specified sorted set, using the specified * constraint. Any operations that add new elements to the sorted set will * call the provided constraint. However, this method does not verify that * existing elements satisfy the constraint. * *

The returned set is not serializable. * * @param sortedSet the sorted set to constrain * @param constraint the constraint that validates added elements * @return a constrained view of the sorted set */ public static SortedSet constrainedSortedSet( SortedSet sortedSet, Constraint constraint) { return new ConstrainedSortedSet(sortedSet, constraint); } /** @see Constraints#constrainedSortedSet */ private static class ConstrainedSortedSet extends ForwardingSortedSet { final SortedSet org.testifyproject.testifyprojectlegate; final Constraint constraint; ConstrainedSortedSet( SortedSet org.testifyproject.testifyprojectlegate, Constraint constraint) { this.org.testifyproject.testifyprojectlegate = checkNotNull(org.testifyproject.testifyprojectlegate); this.constraint = checkNotNull(constraint); } @Override protected SortedSet org.testifyproject.testifyprojectlegate() { return org.testifyproject.testifyprojectlegate; } @Override public SortedSet headSet(E toElement) { return constrainedSortedSet(org.testifyproject.testifyprojectlegate.headSet(toElement), constraint); } @Override public SortedSet subSet(E fromElement, E toElement) { return constrainedSortedSet( org.testifyproject.testifyprojectlegate.subSet(fromElement, toElement), constraint); } @Override public SortedSet tailSet(E fromElement) { return constrainedSortedSet(org.testifyproject.testifyprojectlegate.tailSet(fromElement), constraint); } @Override public boolean add(E element) { constraint.checkElement(element); return org.testifyproject.testifyprojectlegate.add(element); } @Override public boolean addAll(Collection elements) { return org.testifyproject.testifyprojectlegate.addAll(checkElements(elements, constraint)); } } /** * Returns a constrained view of the specified list, using the specified * constraint. Any operations that add new elements to the list will call the * provided constraint. However, this method does not verify that existing * elements satisfy the constraint. * *

If {@code list} implements {@link RandomAccess}, so will the returned * list. The returned list is not serializable. * * @param list the list to constrain * @param constraint the constraint that validates added elements * @return a constrained view of the list */ public static List constrainedList( List list, Constraint constraint) { return (list instanceof RandomAccess) ? new ConstrainedRandomAccessList(list, constraint) : new ConstrainedList(list, constraint); } /** @see Constraints#constrainedList */ @GwtCompatible private static class ConstrainedList extends ForwardingList { final List org.testifyproject.testifyprojectlegate; final Constraint constraint; ConstrainedList(List org.testifyproject.testifyprojectlegate, Constraint constraint) { this.org.testifyproject.testifyprojectlegate = checkNotNull(org.testifyproject.testifyprojectlegate); this.constraint = checkNotNull(constraint); } @Override protected List org.testifyproject.testifyprojectlegate() { return org.testifyproject.testifyprojectlegate; } @Override public boolean add(E element) { constraint.checkElement(element); return org.testifyproject.testifyprojectlegate.add(element); } @Override public void add(int index, E element) { constraint.checkElement(element); org.testifyproject.testifyprojectlegate.add(index, element); } @Override public boolean addAll(Collection elements) { return org.testifyproject.testifyprojectlegate.addAll(checkElements(elements, constraint)); } @Override public boolean addAll(int index, Collection elements) { return org.testifyproject.testifyprojectlegate.addAll(index, checkElements(elements, constraint)); } @Override public ListIterator listIterator() { return constrainedListIterator(org.testifyproject.testifyprojectlegate.listIterator(), constraint); } @Override public ListIterator listIterator(int index) { return constrainedListIterator(org.testifyproject.testifyprojectlegate.listIterator(index), constraint); } @Override public E set(int index, E element) { constraint.checkElement(element); return org.testifyproject.testifyprojectlegate.set(index, element); } @Override public List subList(int fromIndex, int toIndex) { return constrainedList( org.testifyproject.testifyprojectlegate.subList(fromIndex, toIndex), constraint); } } /** @see Constraints#constrainedList */ static class ConstrainedRandomAccessList extends ConstrainedList implements RandomAccess { ConstrainedRandomAccessList( List org.testifyproject.testifyprojectlegate, Constraint constraint) { super(org.testifyproject.testifyprojectlegate, constraint); } } /** * Returns a constrained view of the specified list iterator, using the * specified constraint. Any operations that would add new elements to the * underlying list will be verified by the constraint. * * @param listIterator the iterator for which to return a constrained view * @param constraint the constraint for elements in the list * @return a constrained view of the specified iterator */ private static ListIterator constrainedListIterator( ListIterator listIterator, Constraint constraint) { return new ConstrainedListIterator(listIterator, constraint); } /** @see Constraints#constrainedListIterator */ static class ConstrainedListIterator extends ForwardingListIterator { private final ListIterator org.testifyproject.testifyprojectlegate; private final Constraint constraint; public ConstrainedListIterator( ListIterator org.testifyproject.testifyprojectlegate, Constraint constraint) { this.org.testifyproject.testifyprojectlegate = org.testifyproject.testifyprojectlegate; this.constraint = constraint; } @Override protected ListIterator org.testifyproject.testifyprojectlegate() { return org.testifyproject.testifyprojectlegate; } @Override public void add(E element) { constraint.checkElement(element); org.testifyproject.testifyprojectlegate.add(element); } @Override public void set(E element) { constraint.checkElement(element); org.testifyproject.testifyprojectlegate.set(element); } } static Collection constrainedTypePreservingCollection( Collection collection, Constraint constraint) { if (collection instanceof SortedSet) { return constrainedSortedSet((SortedSet) collection, constraint); } else if (collection instanceof Set) { return constrainedSet((Set) collection, constraint); } else if (collection instanceof List) { return constrainedList((List) collection, constraint); } else { return constrainedCollection(collection, constraint); } } /* * TODO(kevinb): For better performance, avoid making a copy of the elements * by having addAll() call add() repeatedly instead. */ private static Collection checkElements( Collection elements, Constraint constraint) { Collection copy = Lists.newArrayList(elements); for (E element : copy) { constraint.checkElement(element); } return copy; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy