Package cofh.lib.world.biome

Source Code of cofh.lib.world.biome.BiomeInfoSet$Itr

package cofh.lib.world.biome;

import java.util.Arrays;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.Set;

import net.minecraft.world.biome.BiomeGenBase;

public class BiomeInfoSet implements Set<BiomeInfo> {

  protected BiomeInfo[] elementData;
  protected int size, modCount;

  public BiomeInfoSet() {
    this(10);
  }

  public BiomeInfoSet(int size) {
    elementData = new BiomeInfo[size];
  }

  public BiomeInfoSet(Collection<? extends BiomeInfo> c) {
    elementData = c.toArray(new BiomeInfo[c.size()]);
  }

  public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
      int newCapacity = (oldCapacity * 3)/2 + 1;
      if (newCapacity < minCapacity)
        newCapacity = minCapacity;
      elementData = Arrays.copyOf(elementData, newCapacity);
    }
  }

  @Override
  public int size() {
    return size;
  }

  @Override
  public boolean isEmpty() {
    return size == 0;
  }

  @Override
  public boolean contains(Object o) {
    BiomeInfo[] oldData = elementData;
    if (o instanceof BiomeGenBase) {
      BiomeGenBase bgb = (BiomeGenBase)o;
      for (int i = 0, e = size; i < e; ++i)
        if (oldData[i] != null && oldData[i].isBiomeEqual(bgb, null))
          return true;
      return false;
    }
    for (int i = 0, e = size; i < e; ++i)
      if (oldData[i] == o || (oldData[i] != null && o != null && oldData[i].equals(o)))
        return true;
    return false;
  }

  public boolean contains(BiomeGenBase bgb, Random rand) {
    BiomeInfo[] oldData = elementData;
    for (int i = 0, e = size; i < e; ++i)
      if (oldData[i] != null && oldData[i].isBiomeEqual(bgb, rand))
        return true;
    return false;
  }


  public BiomeInfo get(int i) {
    if ((i < 0) | i >= size)
      throw new IndexOutOfBoundsException();
    return elementData[i];
  }

  @Override
  public Iterator<BiomeInfo> iterator() {
    return new Itr();
  }

  @Override
  public Object[] toArray() {
    return Arrays.copyOf(elementData, size, Object[].class);
  }

  @Override
  public <T> T[] toArray(T[] a) {
    if (a.length < size)
      return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
      a[size] = null;
    return a;
  }

  @Override
  public boolean add(BiomeInfo e) {
    int i = size;
    ensureCapacity(size = i + 1);
    elementData[i] = e;
    return true;
  }

  @Override
  public boolean remove(Object o) {
    for (int i = 0, e = size; i < e; ++i)
      if (elementData[i] == o) {
        fastRemove(i);
        return true;
      }
    return false;
  }

  protected void fastRemove(int index) {
    modCount++;
    int numMoved = size - index - 1;
    if (numMoved > 0)
      System.arraycopy(elementData, index+1, elementData, index, numMoved);
    elementData[--size] = null;
  }

  @Override
  public boolean containsAll(Collection<?> c) {
    boolean r = true;
    for (Object i : c)
      r |= contains(i);
    return r;
  }

  @Override
  public boolean addAll(Collection<? extends BiomeInfo> c) {
    int oSize = c.size();
    if (oSize == 0)
      return false;
    BiomeInfo[] a = c.toArray(new BiomeInfo[oSize]);
    ensureCapacity(size + oSize);
    System.arraycopy(a, 0, elementData, size, oSize);
    size += oSize;
    return true;
  }

  @Override
  public boolean retainAll(Collection<?> c) {
    BiomeInfo[] oldData = elementData;
    int e = oldData.length;
    elementData = new BiomeInfo[c.size() / 2];
    size = 0;
    boolean r = true;
    for (Object o : c)
      for (int i = 0; i < e; ++i)
        if (oldData[i] == o || (oldData[i] != null && o != null && oldData[i].equals(o)))
          r |= add(oldData[i]);
    return r;
  }

  @Override
  public boolean removeAll(Collection<?> c) {
    boolean r = true;
    for (Object i : c)
      r |= remove(i);
    return r;
  }

  @Override
  public void clear() {
    modCount++;

    for (int i = 0; i < size; i++)
      elementData[i] = null;

    size = 0;
  }

  protected class Itr implements Iterator<BiomeInfo> {

    protected int cursor = 0;
    protected int expectedModCount = BiomeInfoSet.this.modCount;
    protected boolean lastRet = false;

    @Override
    public boolean hasNext() {
      return cursor != BiomeInfoSet.this.size;
    }

    @Override
    public BiomeInfo next() {
      checkForComodification();
      try {
        if (cursor < size) {
          lastRet = true;
          return BiomeInfoSet.this.elementData[cursor++];
        }
      } catch (IndexOutOfBoundsException e) {
        checkForComodification();
      }
      throw new NoSuchElementException();
    }

    @Override
    public void remove() {
      if (!lastRet)
        throw new IllegalStateException();
      checkForComodification();

      try {
        lastRet = false;
        BiomeInfoSet.this.remove(--cursor);
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException e) {
        throw new ConcurrentModificationException();
      }
    }

    protected final void checkForComodification() {
      if (BiomeInfoSet.this.modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }
  }
}
TOP

Related Classes of cofh.lib.world.biome.BiomeInfoSet$Itr

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.