next up previous contents
suivant: Task.java monter: Package dataStructures précédent: Package dataStructures   Table des matières

Buffer.java


package buffalo.dataStructures;

import java.util.Vector;

/**
   Composant stockant pour des <CODE>T&acirc;ches</CODE> des donn&eacute;es 
   d'un poids variant d'un <CODE>Buffer</CODE> &agrave; l'autre. 
   Le but du jeu &eacute;tant de d&eacute;terminer la taille 
   &agrave; donner &agrave; ces <CODE>Buffers</CODE>!
   <BR>
   <BR>
   Les attributs d'un <CODE>Buffer</CODE> sont : 
   <UL>
   <LI>
   Un <CODE>Poids</CODE> correspondant &agrave; la m&eacute;moire 
   occup&eacute;e par le type de donn&eacute;e &eacute;l&eacute;mentaire 
   &eacute;crit dans ce <CODE>Buffer</CODE>.
   </LI>
   <LI>
   Une <CODE>Capacit&eacute;</CODE> correspondant au nombre des donn&eacute;es 
   &eacute;l&eacute;mentaires qu'il est possible d'&eacute;crire dans 
   ce <CODE>Buffer</CODE>.
   </LI>
   <LI>
   Une <CODE>T&acirc;che</CODE> not&eacute;e <CODE>ReadingTask</CODE>, 
   charg&eacute;e de lire dans ce <CODE>Buffer</CODE>.
   </LI>
   <LI>
   Une <CODE>T&acirc;che</CODE> not&eacute;e <CODE>WritingTask</CODE>, 
   charg&eacute;e d'&eacute;crire dans ce <CODE>Buffer</CODE>.
   </LI>
   </UL>
*/


public class Buffer
{
    /*
      La liste des instances de Buffer
     */
    
    static Vector buffers;

    /*
      La taille d&eacute;finitive ou temporaire du Buffer. Cette taille sera 
      utilis&eacute;e pour construire les cha&icirc;nages.
     */
    
    private int size=-1;

    /*
      Poids de l'information unitaire ins&eacute;r&eacute;e dans le Buffer
     */

    private int weight;    

    /*
      l'indice de la tāche en ecriture sur ce buffer
     */
    
    private Task writingTask; 
    
    /*
      L'indice de la tāche en lecture sur ce buffer
     */

    private Task readingTask;
    
    /*
      L'index de l'instance courante
     */

    private int indexOfMe;
    
    /*
      Image inverse de N(o) pour les operations en lecture
     */
    
    private Vector inverseImageOfNInRead;

    /*
      Image inverse de N(o) pour les operations en ecriture
     */
    
    private Vector inverseImageOfNInWrite;

    /*------------------------------------------------------------------------------*/

    /*
      Comme d'habitude, un constructeur priv&eacute;, pour les bidouilles...
    */

    private Buffer(int indexOfWritingTask, int indexOfReadingTask, int weight)
    {
	if (buffers==null)
	    {
		buffers = new Vector();
	    }
	this.weight = weight;
	size=-1;	
	indexOfMe = buffers.size();	
	inverseImageOfNInRead = new Vector();
	inverseImageOfNInWrite = new Vector();
    }

    /*------------------------------------------------------------------------------*/

    /**
       Cr&eacute;e un <CODE>Buffer</CODE>, dont l'&eacute;criture est 
       d&eacute;di&eacute;e &agrave; la <CODE>T&acirc;che</CODE> d'indice 
       <CODE>indexOfWritingTask</CODE> pour l'&eacute;criture et 
       &agrave; la <CODE>T&acirc;che</CODE> d'indice <CODE>indexOfReadingTask</CODE> 
       pour la lecture. Le poids des donn&eacute;es &eacute;l&eacute;mentaires 
       qui vont &ecirc;tre &eacute;crites dans ce <CODE>Buffer</CODE> est 
       <CODE>weight</CODE>. Ce <CODE>Buffer</CODE> n'est renvoy&eacute; que si 
       les <CODE>T&acirc;ches</CODE> d'indices respectifs <CODE>indexOfWritingTask</CODE> 
       et <CODE>indexOfReadingTask</CODE> existent bel et bien!
     */

    static Buffer createBuffer(int indexOfWritingTask, int indexOfReadingTask, int weight)
    {
	Buffer newBuffer = new Buffer(indexOfWritingTask, indexOfReadingTask, weight);
	buffers.add(newBuffer);
	newBuffer.connectWithTasks(indexOfWritingTask, indexOfReadingTask);
	return newBuffer;
    }
     
    /*------------------------------------------------------------------------------*/

    /**
      Renvoie l'indice de ce <CODE>Buffer</CODE>.
     */

    public int getIndex()
    {
	return indexOfMe;
    }
    
    /*------------------------------------------------------------------------------*/

    /**
      Renvoie la <CODE>T&acirc;che</CODE> qui ecrit dans ce <CODE>Buffer</CODE>.
     */

    public Task getWritingTask()
    {
	return writingTask;
    }

    /*------------------------------------------------------------------------------*/

    /**
      Renvoie la <CODE>T&acirc;che</CODE> qui lit dans ce <CODE>Buffer</CODE>.
     */

    public Task getReadingTask()
    {
	return readingTask;
    }

    /*------------------------------------------------------------------------------*/

    /**
      Renvoie le <CODE>Buffer</CODE> d'indice <CODE>indexOfBuffer</CODE>.
     */

    public static Buffer get(int indexOfBuffer)
    {
	return (Buffer)(buffers.get((int)indexOfBuffer));
    }

    /*------------------------------------------------------------------------------*/

    /**
      Renvoie le nombre de <CODE>Buffers</CODE> cr&eacute;es.
     */
    public static int getNbBuffers()
    {
	if (buffers!=null)
	    {
	    return buffers.size();
	    }
	else
	    {
	    return 0;
	    }
    }

    /*------------------------------------------------------------------------------*/

    /*
      Connecte le Buffer courant aux deux T&acirc;ches pass&eacute;es en 
      param&egrave;tre.
     */

    private void connectWithTasks(int indexOfWritingTask, int indexOfReadingTask)
    {
	writingTask = Task.get(indexOfWritingTask);
	readingTask = Task.get(indexOfReadingTask);
	Task.connectWithBuffer(indexOfWritingTask, indexOfReadingTask, indexOfMe);
    }
    
    /*------------------------------------------------------------------------------*/

    /**
      Renvoie la taille du <CODE>Buffer</CODE>, c'est-&agrave;-dire le nombre 
      de donn&eacute;es &eacute;l&eacute;mentaires pouvant y &ecirc;tre 
      &eacute;crites.
     */

    public int getSize()
    {
	return size;
    }
    
    /*------------------------------------------------------------------------------*/

    /**
      Renvoie le poids du <CODE>Buffer</CODE>, c'est-&agrave;-dire le poids des 
      donn&eacute;es &eacute;l&eacute;mentaires qui y sont &eacute;crites.      
     */

    public int getWeight()
    {
	return weight;
    }
    
    /*------------------------------------------------------------------------------*/

    /**
      Modifie la taille du <CODE>Buffer</CODE>. <U>Attention :</U> le 
      cha&icirc;nage des pr&eacute;c&eacute;dences d&eacute;pendant des dimensions 
      des <CODE>Buffers</CODE> sera apr&egrave;s cela obsol&egrave;te! Toute 
      manipulation ult&eacute;rieure ne pourra &ecirc;tre pertinente que si ce 
      cha&icirc;nage est recalcul&eacute;!
     */

    public void setSize(int newSizeOfBuffer)
    {
	this.size = newSizeOfBuffer;
    }

    /*------------------------------------------------------------------------------*/

    /**
       Renvoie la <CODE>T&acirc;che</CODE> partageant ce <CODE>Buffer</CODE> 
       avec la <CODE>T&acirc;che</CODE> <CODE>T</CODE> d'indice 
       <CODE>indexOfTask</CODE> pass&eacute; en param&egrave;tre. Cette 
       m&eacute;thode renvoie -1 si <CODE>T</CODE> n'est pas connect&eacute; 
       &agrave; ce <CODE>Buffer</CODE>.
     */

    public Task getOtherTask(int indexOfTask)
    {
	if (indexOfTask == readingTask.getIndex())
	    {
		return writingTask;
	    }
	if (indexOfTask == writingTask.getIndex())
	    {
		return readingTask;
	    }
	return null;
    }

    /*------------------------------------------------------------------------------*/

    /**
       Renvoie au format cha&icirc;ne de caract&egrave;res le script de 
       cr&eacute;ation des <CODE>Buffers</CODE> et de connection de ces 
       derniers aux <CODE>T&acirc;ches</CODE>.
     */

    public static String allToString()
    {
	String resultat = "#buffers \n";
	int nbBuffers = getNbBuffers();
	for( int i = 0; i < nbBuffers; i++)
	    {
		resultat += get(i).toString() + " \n";
	    }
	return resultat;
    }

    /*------------------------------------------------------------------------------*/

    /**
       Renvoie au format cha&icirc;ne de caract&egrave;res le script 
       de d&eacute;claration d'un <CODE>Buffer</CODE> et de connection 
       &agrave; deux <CODE>T&acirc;ches</CODE>.
     */

    public String toString()
    {
	String resultat =  (new Integer(getIndex())).toString() + "( ";
	resultat += (new Integer(writingTask.getIndex())).toString() + ", ";
	resultat += (new Integer(readingTask.getIndex())).toString() + ", ";	
	resultat += (new Integer(this.getWeight())).toString();
	resultat += " )";
	return resultat;
    }

    /*------------------------------------------------------------------------------*/

    /*
      Fonction permettant ult&eacute;rieurement de manipuler l'image 
      inverse de N. Cette fonction ne v&eacute;rifie pas le double 
      cha&icirc;nage. C'est d'ailleurs pour cette raison qu'elle 
      n'est pas accessible en dehors du package.
     */

    void addOperationToN(Operation operationToAdd, Task taskWhichDoIt)
    {
	if (taskWhichDoIt == readingTask)	    
	    {
		inverseImageOfNInRead.add(operationToAdd);
	    }
	if (taskWhichDoIt == writingTask)	    
	    {
		inverseImageOfNInWrite.add(operationToAdd);
	    }	    
    }

    /*------------------------------------------------------------------------------*/

    /**
      Fonction renvoyant l'image de la r&eacute;ciproque de <CODE>N</CODE>; 
      comme une m&ecirc;me valeur peut avoir plusieurs 
      ant&eacute;c&eacute;dents, il convient pour &eacute;viter toute 
      ambiguit&eacute; de pr&eacute;ciser quelle <CODE>T&acirc;che</CODE> 
      effectue cette <CODE>Op&eacute;ration</CODE>.
      Cette fonction retourne "null" si N n'a pas d'image relative 
       aux param&egrave;tres pass&eacute;. <BR>Pour de plus amples 
      renseignements, consulter la documentation d'Alix.
     */

    public Operation getInversedN(int indexOfOperation, Task taskWhichDoIt)
    {
	if (taskWhichDoIt == readingTask)	    
	    {
		return (Operation)inverseImageOfNInRead.get(indexOfOperation);
	    }
	if (taskWhichDoIt == writingTask)	    
	    {
		return (Operation)inverseImageOfNInWrite.get(indexOfOperation);
	    }	    
	return null;
    }

    /*------------------------------------------------------------------------------*/

    /**
       Retourne le nombre d'<CODE>Op&eacute;rations</CODE> effectu&eacute;es 
       sur l'instance courante de <CODE>Buffer</CODE> par <CODE>task</CODE>, 
       <CODE>-1</CODE> si <CODE>task</CODE> n'est ni la <CODE>activeTask</CODE> 
       ni la <CODE>passiveTask</CODE>.
     */
    
    public int getNbInversedN(Task task)
    {
	if (task == readingTask)	    
	    {
		return inverseImageOfNInRead.size();
	    }
	if (task == writingTask)	    
	    {
		return inverseImageOfNInWrite.size();
	    }	    
	return -1; 
    }
}



Alexandre 2009-05-14