Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2011 The Guava Authors
   *
   * Licensed 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 com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.BoundType.CLOSED;
 
 
 
 import  javax.annotation.Nullable;

An implementation of ContiguousSet that contains one or more elements.

Author(s):
Gregory Kick
 
 @GwtCompatible(emulated = true)
 @SuppressWarnings("unchecked"// allow ungenerified Comparable types
 final class RegularContiguousSet<C extends Comparableextends ContiguousSet<C> {
   private final Range<C> range;
 
   RegularContiguousSet(Range<C> rangeDiscreteDomain<C> domain) {
     super(domain);
     this. = range;
   }
 
   private ContiguousSet<C> intersectionInCurrentDomain(Range<C> other) {
     return (.isConnected(other))
         ? .intersection(other).asSet()
         : new EmptyContiguousSet<C>();
   }
 
   @Override ContiguousSet<C> headSetImpl(C toElementboolean inclusive) {
     return intersectionInCurrentDomain(Ranges.upTo(toElement, BoundType.forBoolean(inclusive)));
   }
 
   @Override ContiguousSet<C> subSetImpl(C fromElementboolean fromInclusive, C toElement,
       boolean toInclusive) {
     if (fromElement.compareTo(toElement) == 0 && !fromInclusive && !toInclusive) {
       // Range would reject our attempt to create (x, x).
       return new EmptyContiguousSet<C>();
     }
     return intersectionInCurrentDomain(Ranges.range(
         fromElement, BoundType.forBoolean(fromInclusive),
         toElement, BoundType.forBoolean(toInclusive)));
   }
 
   @Override ContiguousSet<C> tailSetImpl(C fromElementboolean inclusive) {
     return intersectionInCurrentDomain(Ranges.downTo(fromElement, BoundType.forBoolean(inclusive)));
   }
 
   @GwtIncompatible("not used by GWT emulation")
   @Override int indexOf(Object target) {
     return contains(target) ? (int.distance(first(), (C) target) : -1;
   }
 
   @Override public UnmodifiableIterator<C> iterator() {
     return new AbstractSequentialIterator<C>(first()) {
       final C last = last();
 
       @Override
       protected C computeNext(C previous) {
         return equalsOrThrow(previous) ? null : .next(previous);
       }
     };
   }
 
   private static boolean equalsOrThrow(Comparable<?> left, @Nullable Comparable<?> right) {
     return right != null && Range.compareOrThrow(leftright) == 0;
   }
 
   @Override boolean isPartialView() {
     return false;
   }
 
   @Override public C first() {
   }
 
   @Override public C last() {
   }
  @Override public int size() {
    long distance = .distance(first(), last());
    return (distance >= .) ? . : (intdistance + 1;
  }
  @Override public boolean contains(Object object) {
    if (object == null) {
      return false;
    }
    try {
      return .contains((C) object);
    } catch (ClassCastException e) {
      return false;
    }
  }
  @Override public boolean containsAll(Collection<?> targets) {
    return Collections2.containsAllImpl(thistargets);
  }
  @Override public boolean isEmpty() {
    return false;
  }
  // copied to make sure not to use the GWT-emulated version
  @Override public Object[] toArray() {
    return ObjectArrays.toArrayImpl(this);
  }
  // copied to make sure not to use the GWT-emulated version
  @Override public <T> T[] toArray(T[] other) {
    return ObjectArrays.toArrayImpl(thisother);
  }
  @Override public ContiguousSet<C> intersection(ContiguousSet<C> other) {
    checkNotNull(other);
    checkArgument(this..equals(other.domain));
    if (other.isEmpty()) {
      return other;
    } else {
      C lowerEndpoint = Ordering.natural().max(this.first(), other.first());
      C upperEndpoint = Ordering.natural().min(this.last(), other.last());
      return (lowerEndpoint.compareTo(upperEndpoint) < 0)
          ? Ranges.closed(lowerEndpointupperEndpoint).asSet()
          : new EmptyContiguousSet<C>();
    }
  }
  @Override public Range<C> range() {
    return range();
  }
  @Override public Range<C> range(BoundType lowerBoundTypeBoundType upperBoundType) {
    return Ranges.create(..withLowerBoundType(lowerBoundType),
        ..withUpperBoundType(upperBoundType));
  }
  @Override public boolean equals(Object object) {
    if (object == this) {
      return true;
    } else if (object instanceof RegularContiguousSet) {
      RegularContiguousSet<?> that = (RegularContiguousSet<?>) object;
      if (this..equals(that.domain)) {
        return this.first().equals(that.first())
            && this.last().equals(that.last());
      }
    }
    return super.equals(object);
  }
  // copied to make sure not to use the GWT-emulated version
  @Override public int hashCode() {
    return Sets.hashCodeImpl(this);
  }
  @GwtIncompatible("serialization")
  private static final class SerializedForm<C extends Comparableimplements Serializable {
    final Range<C> range;
    final DiscreteDomain<C> domain;
    private SerializedForm(Range<C> rangeDiscreteDomain<C> domain) {
      this. = range;
      this. = domain;
    }
    private Object readResolve() {
      return new RegularContiguousSet<C>();
    }
  }
  @GwtIncompatible("serialization")
    return new SerializedForm<C>();
  }
  private static final long serialVersionUID = 0;
  @GwtIncompatible("NavigableSet")
    return new DescendingContiguousSet();
  }
  @GwtIncompatible("NavigableSet")
  private final class DescendingContiguousSet extends ImmutableSortedSet<C> {
    private DescendingContiguousSet() {
      super(Ordering.natural().reverse());
    }
    @Override
    public C first() {
      return RegularContiguousSet.this.last();
    }
    @Override
    public C last() {
      return RegularContiguousSet.this.first();
    }
    @Override
    public int size() {
      return RegularContiguousSet.this.size();
    }
    @Override
    public UnmodifiableIterator<C> iterator() {
      return new AbstractSequentialIterator<C>(first()) {
        final C last = last();
        @Override
        protected C computeNext(C previous) {
          return equalsOrThrow(previous) ? null : .previous(previous);
        }
      };
    }
    @Override
    ImmutableSortedSet<C> headSetImpl(C toElementboolean inclusive) {
      return RegularContiguousSet.this.tailSetImpl(toElementinclusive).descendingSet();
    }
    @Override
        C fromElement,
        boolean fromInclusive,
        C toElement,
        boolean toInclusive) {
      return RegularContiguousSet.this.subSetImpl(
          toElement,
          toInclusive,
          fromElement,
          fromInclusive).descendingSet();
    }
    @Override
    ImmutableSortedSet<C> tailSetImpl(C fromElementboolean inclusive) {
      return RegularContiguousSet.this.headSetImpl(fromElementinclusive).descendingSet();
    }
    @Override
      return RegularContiguousSet.this;
    }
    @Override
    int indexOf(Object target) {
      return contains(target) ? (int.distance(last(), (C) target) : -1;
    }
    @Override
    boolean isPartialView() {
      return false;
    }
  }
New to GrepCode? Check out our FAQ X