import java.util.Vector; public class LinearAcc { // Field private int ACCELERATOR_SIZE; private Vector pairs ; private float velocity; private int maxVelocity; private boolean accelerated; private boolean connected; private boolean extract; private int m_input; private int m_output; private Accelerator m_acc; // Methods public void inject(Bunch bunch){ boolean locFilled = false; for(int i = 0 ; i < pairs.size() ; i++){ int injectionLocation = ((Pair)(pairs.elementAt(i))).location(); if(injectionLocation==m_input){ locFilled = true ; } } if(locFilled){ // Do nothing as we're not worried about merging Bunches // in this version. }else{ pairs.addElement(new Pair(bunch,m_input)); } } public void update(){ updateVelocity(); updateLocations(); } public float velocity(){ return velocity/(float)maxVelocity; } public void accelerate(){ accelerated = true; } public void stopAccelerate(){ accelerated = false ; } public void connectTo(Accelerator acc){ m_acc = acc; connected = true; } public void transfer(){ extract = true; } public Vector contents( ) { return pairs; } public int size(){ return ACCELERATOR_SIZE; } private void updateVelocity(){ if(accelerated){ if((int)velocity < maxVelocity){ velocity += 0.1F; }else{ velocity = (float)maxVelocity; } } } private void updateLocations(){ int spaces = accelerated ? (int)velocity : 1; for(int i = 0 ; i < pairs.size() ; i++){ int tempA = ((Pair)(pairs.elementAt(i))).location(); int tempB = tempA + spaces; if(((tempA=m_output))){ if(connected){ m_acc.inject(((Pair)(pairs.elementAt(i))).bunch()); } pairs.removeElementAt(i); }else{ ((Pair)(pairs.elementAt(i))).location(tempB); } } } // Constructors public LinearAcc(int size, int input,int output) { m_input = input; m_output = output; ACCELERATOR_SIZE = size; pairs = new Vector(size,1); velocity = 1F; maxVelocity = size/10+3; } public LinearAcc(int size){ this(size,0,size-1); } public LinearAcc(){ this(100); } }