/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.util.collections; import com.google.common.collect.ForwardingQueue; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Queue; import net.minecraft.util.Vec3; /** * * @author CovertJaguar <http://www.railcraft.info> */ public class CircularVec3Queue extends ForwardingQueue<Vec3> { private final Vec3[] pool; private final ArrayDeque<Vec3> queue; private final int maxSize; private int poolIndex; public CircularVec3Queue(int maxSize) { this.maxSize = maxSize; pool = new Vec3[maxSize * 2]; queue = new ArrayDeque<Vec3>(maxSize); } @Override protected Queue<Vec3> delegate() { return queue; } public boolean add(double x, double y, double z) { if (maxSize == 0) return true; if (size() == maxSize) queue.remove(); queue.add(getNextVec3(x, y, z)); return true; } private Vec3 getNextVec3(double x, double y, double z) { if (poolIndex >= pool.length) poolIndex = 0; if (pool[poolIndex] == null) return pool[poolIndex++] = Vec3.createVectorHelper(x, y, z); else { pool[poolIndex].xCoord = x; pool[poolIndex].yCoord = y; pool[poolIndex].zCoord = z; return pool[poolIndex++]; } } public Iterator<Vec3> descendingIterator() { return queue.descendingIterator(); } public Iterable<Vec3> descendingIterable() { return new Iterable<Vec3>() { @Override public Iterator<Vec3> iterator() { return queue.descendingIterator(); } }; } }