package buffalo.twoTasksAnalysis; import buffalo.dataStructures.*; import java.util.Vector; /** Ensemble d'expressions sur les dimensions de chaque couple de buffers. */ public class BufferPairCollection { private BufferPairExpression[] expressions; private Vector oneWayBuffers; private Vector twoWaysBuffers; private Task task1; private Task task2; /*-----------------------------------------------------*/ /** Se crée avec les deux valeurs et l'expression à laquelle on l'ajoute. */ public BufferPairCollection(Task firstTask, Task secondTask) { this.task1 = firstTask; this.task2 = secondTask; this.oneWayBuffers = initOneWayBuffers(task1, task2); this.twoWaysBuffers = initTwoWaysBuffers(task1, task2); expressions = new BufferPairExpression [oneWayBuffers.size() + twoWaysBuffers.size()]; } /*-----------------------------------------------------*/ /** Retourne la <CODE>BufferPairExpression</CODE> correspondant aux deux buffers passés en paramètre. */ public BufferPairExpression getBufferPairExpression (Buffer firstBuffer, Buffer secondBuffer) { return expressions[getHashValue(firstBuffer, secondBuffer)]; } /*-----------------------------------------------------*/ /** Retourne la valeur de hachage dans la table des expressions correspondant aux deux buffers passés en paramètre. */ private int getHashValue(Buffer firstBuffer, Buffer secondBuffer) { return (firstBuffer.getIndex() * (Buffer.getNbBuffers() - 1) + secondBuffer.getIndex() + k(firstBuffer, secondBuffer) ); } /*-----------------------------------------------------*/ /** Retourne la valeur de l'application <CODE>k<CODE> décrite dans le rapport. */ private int k(Buffer firstBuffer, Buffer secondBuffer) { if(firstBuffer.getIndex() > secondBuffer.getIndex()) { return 0; } else { return -1; } } /*-----------------------------------------------------*/ /** Ajoute <CODE>aNewBufferPairExpression</CODE> dans <CODE>this</CODE>. */ public void addBufferPairExpression(BufferPairExpression aNewBufferPairExpression) { Buffer firstBuffer = aNewBufferPairExpression.getFirstBuffer(); Buffer secondBuffer = aNewBufferPairExpression.getSecondBuffer(); int indexOfBufferPairExpression = getHashValue(firstBuffer, secondBuffer); expressions[indexOfBufferPairExpression] = aNewBufferPairExpression; aNewBufferPairExpression.setIndex(indexOfBufferPairExpression); } /*-----------------------------------------------------*/ /** Retourne la <CODE>index</CODE>-ième <CODE>BufferPairExpression</CODE> stockée dans la collection courante. */ public BufferPairExpression getBufferPairExpression (int index) { return expressions[index]; } /*-----------------------------------------------------*/ /** Retourne le nombre de <CODE>BufferPairExpression</CODE> stockées dans la collection courante. */ public int getNbBufferPairExpression() { return expressions.length; } /*-----------------------------------------------------*/ /** Retourne l'instance courante au format chaîne de caractères. */ public String toString() { String results = "\n"; int nbExpressions = getNbBufferPairExpression(); BufferPairExpression myBufferPairExpression; for(int i = 0 ; i < nbExpressions ; i++) { myBufferPairExpression = getBufferPairExpression(i); if(myBufferPairExpression != null) { results += myBufferPairExpression.toString()+"\n"; } } results += "\n"; return results; } /*-----------------------------------------------------*/ /** Retourne la première <CODE>tâche</CODE> concernée par cette <CODE>BufferCollection</CODE>. */ public Task getFirstTask() { return task1; } /*-----------------------------------------------------*/ /** Retourne la deuxième <CODE>tâche</CODE> concernée par cette <CODE>BufferCollection</CODE>. */ public Task getSecondTask() { return task2; } /*-------------------------------------------------------*/ /** Retourne les <CODE>n</CODE> couples de buffers de même direction entre les buffers un et deux. Ils sont disposés dans <CODE>2n</CODE> cases du vecteur. Le <CODE>i</CODE>-ième couple se trouve dans les cases <CODE>2i - 3</CODE> et <CODE>2i - 2</CODE>. */ private static Vector initOneWayBuffers(Task task1, Task task2) { Vector results = new Vector(); Vector validBuffersTask1 = new Vector(); Vector validBuffersTask2 = new Vector(); Buffer myBuffer; int nbBuffers = task1.getNbReadBuffer(); for(int i = 0; i < nbBuffers ; i++) { myBuffer = task1.getReadBuffer(i); if (myBuffer.getWritingTask() == task2) { validBuffersTask1.add(myBuffer); } } nbBuffers = validBuffersTask1.size(); for (int i = 0 ; i < nbBuffers ; i ++) { for (int j = 0 ; j < nbBuffers ; j ++) { if (i != j) { results.add(validBuffersTask1.get(i)); results.add(validBuffersTask1.get(j)); } } } nbBuffers = task2.getNbReadBuffer(); for(int i = 0; i < nbBuffers ; i++) { myBuffer = task2.getReadBuffer(i); if (myBuffer.getWritingTask() == task1) { validBuffersTask2.add(myBuffer); } } nbBuffers = validBuffersTask2.size(); for (int i = 0 ; i < nbBuffers ; i ++) { for (int j = 0 ; j < nbBuffers ; j ++) { if (i != j) { results.add(validBuffersTask2.get(i)); results.add(validBuffersTask2.get(j)); } } } return results; } /*-------------------------------------------------------*/ /** Retourne les <CODE>n</CODE> couples de buffers de sens opposés entre les buffers un et deux. Ils sont disposés dans <CODE>2n</CODE> cases du vecteur. Le <CODE>i</CODE>-ième couple se trouve dans les cases <CODE>2i - 3</CODE> et <CODE>2i - 2</CODE>. */ private static Vector initTwoWaysBuffers(Task task1, Task task2) { Vector results = new Vector(); Vector validBuffersTask1 = new Vector(); Vector validBuffersTask2 = new Vector(); Buffer myBuffer; int nbBuffers = task1.getNbReadBuffer(); int nbBuffersBis; for(int i = 0; i < nbBuffers ; i++) { myBuffer = task1.getReadBuffer(i); if (myBuffer.getWritingTask() == task2) { validBuffersTask1.add(myBuffer); } } nbBuffers = task2.getNbReadBuffer(); for(int i = 0; i < nbBuffers ; i++) { myBuffer = task2.getReadBuffer(i); if (myBuffer.getWritingTask() == task1) { validBuffersTask2.add(myBuffer); } } nbBuffers = validBuffersTask1.size(); nbBuffersBis = validBuffersTask2.size(); for (int i = 0 ; i < nbBuffers ; i ++) { for (int j = 0 ; j < nbBuffersBis ; j ++) { results.add(validBuffersTask1.get(i)); results.add(validBuffersTask2.get(j)); results.add(validBuffersTask2.get(j)); results.add(validBuffersTask1.get(i)); } } return results; } /*-------------------------------------------------------*/ /** Retourne les <CODE>n</CODE> couples de buffers de même direction entre les buffers un et deux. Ils sont disposés dans <CODE>2n</CODE> cases du vecteur. Le <CODE>i</CODE>-ième couple se trouve dans les cases <CODE>2i - 3</CODE> et <CODE>2i - 2</CODE>. */ public Vector getOneWayBuffers() { return oneWayBuffers; } /*-------------------------------------------------------*/ /** Retourne les <CODE>n</CODE> couples de buffers de sens opposés entre les buffers un et deux. Ils sont disposés dans <CODE>2n</CODE> cases du vecteur. Le <CODE>i</CODE>-ième couple se trouve dans les cases <CODE>2i - 3</CODE> et <CODE>2i - 2</CODE>. */ public Vector getTwoWaysBuffers() { return twoWaysBuffers; } }