package net.minecraft.src; import com.google.common.collect.Iterators; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import net.minecraft.util.BlockPos; import net.minecraft.util.LongHashMap; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.NextTickListEntry; public class NextTickHashSet extends TreeSet { private LongHashMap longHashMap = new LongHashMap(); private int minX = Integer.MIN_VALUE; private int minZ = Integer.MIN_VALUE; private int maxX = Integer.MIN_VALUE; private int maxZ = Integer.MIN_VALUE; private static final int UNDEFINED = Integer.MIN_VALUE; public NextTickHashSet(Set oldSet) { Iterator it = oldSet.iterator(); while (it.hasNext()) { Object obj = it.next(); this.add(obj); } } public boolean contains(Object obj) { if (!(obj instanceof NextTickListEntry)) { return false; } else { NextTickListEntry entry = (NextTickListEntry)obj; Set set = this.getSubSet(entry, false); return set == null ? false : set.contains(entry); } } public boolean add(Object obj) { if (!(obj instanceof NextTickListEntry)) { return false; } else { NextTickListEntry entry = (NextTickListEntry)obj; if (entry == null) { return false; } else { Set set = this.getSubSet(entry, true); boolean added = set.add(entry); boolean addedParent = super.add(obj); if (added != addedParent) { throw new IllegalStateException("Added: " + added + ", addedParent: " + addedParent); } else { return addedParent; } } } } public boolean remove(Object obj) { if (!(obj instanceof NextTickListEntry)) { return false; } else { NextTickListEntry entry = (NextTickListEntry)obj; Set set = this.getSubSet(entry, false); if (set == null) { return false; } else { boolean removed = set.remove(entry); boolean removedParent = super.remove(entry); if (removed != removedParent) { throw new IllegalStateException("Added: " + removed + ", addedParent: " + removedParent); } else { return removedParent; } } } } private Set getSubSet(NextTickListEntry entry, boolean autoCreate) { if (entry == null) { return null; } else { BlockPos pos = entry.field_180282_a; int cx = pos.getX() >> 4; int cz = pos.getZ() >> 4; return this.getSubSet(cx, cz, autoCreate); } } private Set getSubSet(int cx, int cz, boolean autoCreate) { long key = ChunkCoordIntPair.chunkXZ2Int(cx, cz); HashSet set = (HashSet)this.longHashMap.getValueByKey(key); if (set == null && autoCreate) { set = new HashSet(); this.longHashMap.add(key, set); } return set; } public Iterator iterator() { if (this.minX == Integer.MIN_VALUE) { return super.iterator(); } else if (this.size() <= 0) { return Iterators.emptyIterator(); } else { int cMinX = this.minX >> 4; int cMinZ = this.minZ >> 4; int cMaxX = this.maxX >> 4; int cMaxZ = this.maxZ >> 4; ArrayList listIterators = new ArrayList(); for (int x = cMinX; x <= cMaxX; ++x) { for (int z = cMinZ; z <= cMaxZ; ++z) { Set set = this.getSubSet(x, z, false); if (set != null) { listIterators.add(set.iterator()); } } } if (listIterators.size() <= 0) { return Iterators.emptyIterator(); } else if (listIterators.size() == 1) { return (Iterator)listIterators.get(0); } else { return Iterators.concat(listIterators.iterator()); } } } public void setIteratorLimits(int minX, int minZ, int maxX, int maxZ) { this.minX = Math.min(minX, maxX); this.minZ = Math.min(minZ, maxZ); this.maxX = Math.max(minX, maxX); this.maxZ = Math.max(minZ, maxZ); } public void clearIteratorLimits() { this.minX = Integer.MIN_VALUE; this.minZ = Integer.MIN_VALUE; this.maxX = Integer.MIN_VALUE; this.maxZ = Integer.MIN_VALUE; } }