TaskIdList.c

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include "TaskIdList.h"
00004 #include "constants.h"
00005 
00006 
00007 #ifdef TASK_ID_LIST_SEND
00008 #define TO_NETWORK
00009 #endif
00010 #include "cser.h"
00011 
00012 
00013 #ifndef TASK_ID_LIST_SEND
00014 
00015 /**
00016  * \file vetor_doc.c Vetor de documentos com realoca??o exponencial. Sempre que 
00017  * n?o houver espa?o para um novo documento, o vetor ? realocado para ter o 
00018  * dobro do tamanho. Assim n?o corre o risco de copiar o vetor todo para outro
00019  * lugar a cada inser??o. Se o vetor crescer de 2^0 at? 2^n, ent?o ter?o sido 
00020  * feitas no m?ximo: uma copia de 1 posi??o, uma de 2, uma de 4, uma de 8,..., 
00021  * uma de 2^n-1 o que equivale a uma c?pia de (2^n)-1 posi??es (somat?rio de
00022  * 2^0 at? 2^n-1 = (2^n)-1 ). Sendo assim em m?dia cada posi??o do vetor ? 
00023  * copiada apenas 1 vez, ou seja a complexidade de inser??o ? O(1). 
00024  *
00025  * O desperd?cio de mem?ria dessa abordagem pode ser estimado da seguinte forma:
00026  * no pior caso, o vetor utiliza o dobro do espa?o necess?rio e no melhor n?o 
00027  * desperdi?a nada. Ent?o o desperd?cio na m?dia ? de 50%.
00028  */
00029 
00030 //-----------------------------------------------------------------------------
00031 /// Retorna a capacidade m?nima (de acordo com a pol?tica de 
00032 /// realoca??o exponencial) necess?ria para armazenar um vetor de tamanho size.
00033 //-----------------------------------------------------------------------------
00034 int taskIdListGetMinCpacity(int size){
00035         int cap;
00036 
00037         cap=1;
00038         for (cap=1; cap<size; cap=cap<<1);
00039         return cap;
00040 }
00041 
00042 //-----------------------------------------------------------------------------
00043 /// Cria um vetor de documentos.
00044 //-----------------------------------------------------------------------------
00045 TaskIdList *taskIdListCreate(int cap_inicial) {
00046         TaskIdList *vet = malloc(sizeof(TaskIdList));
00047 
00048         vet->size     = 0;
00049         vet->capacity = taskIdListGetMinCpacity(cap_inicial);
00050         vet->vetor    = malloc(sizeof(int)*vet->capacity);
00051 
00052         return vet;
00053 }
00054 
00055 //-----------------------------------------------------------------------------
00056 /** Adiciona um documento ao vetor. Caso o vetor n?o tenha a capacidade
00057  * necess?ria, sua capacidade ser? dobrada (de acordo com a pol?tica de 
00058  * realoca??o exponencial).
00059  *      \param vet Vetor onde o documento ser? acrescentado.
00060  *      \param doc Documento a ser acrescentado.
00061  *      \param freq Freq??ncia do documento.
00062  *      \return Posi??o do documento no vetor.
00063  */ 
00064 //-----------------------------------------------------------------------------
00065 int taskIdListAdd(TaskIdList *vet, int doc) {
00066         int ret = 0;
00067         
00068         // Se vai estourar capacidade, aumenta vetor (aumento exponencial)
00069         if (vet->size+1 > vet->capacity) {
00070                 vet->capacity = vet->capacity << 1;
00071                 vet->vetor = realloc(vet->vetor, sizeof(int)*vet->capacity);
00072         }
00073 
00074         vet->vetor[vet->size]  = doc;
00075 
00076         ret = vet->size;
00077         vet->size++;
00078 
00079         return ret;
00080 }
00081 
00082 //-----------------------------------------------------------------------------
00083 /// Retorna o tamanho de um vetor de documentos.
00084 //-----------------------------------------------------------------------------
00085 int taskIdListGetSize(TaskIdList *vet) {
00086         if (vet == NULL) {
00087                 return 0;
00088         }
00089         return vet->size;
00090 }
00091 
00092 //-----------------------------------------------------------------------------
00093 /// Retorna um ponteiro para a posi??o pos do vetor de documentos vet.
00094 //-----------------------------------------------------------------------------
00095 int taskIdListGet(TaskIdList *vet, int pos) {
00096   return ((vet->vetor[pos]) );
00097 }
00098 
00099 //-----------------------------------------------------------------------------
00100 /// Retorna um ponteiro para a ?ltima posi??o do vetor de documentos vet.
00101 //-----------------------------------------------------------------------------
00102 int taskIdListGetLast(TaskIdList *vet) {
00103         if (vet->size > 0) {
00104                 return ((vet->vetor[vet->size-1]) );
00105         } else {
00106                 return 0;
00107         }
00108 }
00109 
00110 int *taskIdListToArray(TaskIdList *list, int *listSize) {
00111         int size = list->size;
00112         int *ret = NULL;
00113         
00114         if (size > 0) {
00115                 ret = malloc(sizeof(int)*size); 
00116                 memcpy(ret, list->vetor, sizeof(int)*size);
00117         }
00118         
00119         *listSize = size;
00120         return ret;
00121 }
00122 
00123 //void taskIdListSort(TaskIdList * vet, int (*compFunc)(const void *, const void *)) {
00124 //      qsort(vet->vetor, vet->size, sizeof(int), compFunc);
00125 //}
00126 
00127 
00128 //-----------------------------------------------------------------------------
00129 /// Compares two TaskIdList. Returns -1, 0 or +1 if the list "list1" is found,
00130 /// respectivelly, to be less than, to match, or be greater than "list2". 
00131 /// Comparison semantics is the same of strcmp().
00132 //-----------------------------------------------------------------------------
00133 int taskIdListCompare(TaskIdList *list1, TaskIdList *list2) {
00134         int i=0;
00135         
00136         if (list1->size < list2->size) {
00137                 for (i=0; i<list1->size; i++) {
00138                         if (list1->vetor[i] > list2->vetor[i]) {
00139                                 return 1;
00140                         } else if (list1->vetor[i] < list2->vetor[i]) {
00141                                 return -1;
00142                         }
00143                 }
00144                 // as list2 has elements that list1 hasn't, list 2 is bigger
00145                 return -1;
00146         } else if (list1->size > list2->size) {
00147                 for (i=0; i<list2->size; i++) {
00148                         if (list1->vetor[i] > list2->vetor[i]) {
00149                                 return 1;
00150                         } else if (list1->vetor[i] < list2->vetor[i]) {
00151                                 return -1;
00152                         }
00153                 }
00154                 // as list1 has elements that list2 hasn't, list 1 is bigger
00155                 return 1;
00156         } else { // same size
00157                 for (i=0; i<list1->size; i++) {
00158                         if (list1->vetor[i] > list2->vetor[i]) {
00159                                 return 1;
00160                         } else if (list1->vetor[i] < list2->vetor[i]) {
00161                                 return -1;
00162                         }
00163                 }
00164                 return 0;
00165         }
00166 }
00167 
00168 
00169 //-----------------------------------------------------------------------------
00170 /// Destroy a taskId list
00171 //-----------------------------------------------------------------------------
00172 void taskIdListDestroy(TaskIdList *vet) {
00173         if (vet != NULL) {
00174                 if (vet->vetor != NULL) {
00175                         free(vet->vetor);
00176                 }
00177                 free(vet);
00178         }
00179 }
00180 
00181 
00182 TaskIdList *taskIdListCopy(TaskIdList* list){
00183         if (list == NULL) {
00184                 return NULL;
00185         }
00186         
00187         int i, value, size = taskIdListGetSize(list);
00188         TaskIdList *auxList = taskIdListCreate(size);
00189         
00190         for(i = 0; i < size; i++){
00191                 value = taskIdListGet(list, i);
00192                 taskIdListAdd(auxList, value);
00193         }
00194         return auxList;
00195 }
00196 
00197 
00198 /// This function assume that 
00199 TaskIdList *taskIdListIntersection(TaskIdList *a, TaskIdList *b) {
00200         int i,j, resultSize=0;
00201 
00202         if(a->size < b->size) {
00203                 resultSize = a->size;
00204         } else {
00205                 resultSize = b->size;
00206         }
00207         TaskIdList *result = (TaskIdList *)taskIdListCreate(resultSize);
00208         
00209         for(i=0,j=0; i < a->size && j < b->size;) {
00210                 if(a->vetor[i] > b->vetor[j]) {
00211                         j++;
00212                 } else if(a->vetor[i]==b->vetor[j]) {
00213                         taskIdListAdd(result, a->vetor[i]);
00214                         j++;
00215                         i++;
00216                 } else {
00217                         i++;
00218                 }
00219         }
00220         
00221         // Reduce the capacity of the list only to the needed
00222         if(result->size > 0) {
00223                 result->vetor=(int*)realloc(result->vetor,sizeof(int)*result->size);
00224                 result->capacity = result->size;
00225         } else {
00226                 free(result->vetor);
00227                 result->vetor = NULL;
00228                 result->capacity = 0;
00229         }
00230 
00231         return result;
00232 }
00233 
00234 /// Comparison function for sorting task ids in ascendig order
00235 static int compareTaskIds(const void *a, const void *b) {
00236         int* i=(int*)a;
00237         int* j=(int*)b;
00238 
00239         if (*i > *j) return(1);
00240         if (*i < *j) return(-1);
00241         return 0;
00242 }
00243 
00244 /// Sort the list ids in ascending order
00245 void taskIdListSortAscendig(TaskIdList *list) {
00246         if (list->size > 1) {
00247                 qsort(list->vetor, list->size, sizeof(int), &compareTaskIds);
00248         }
00249 }
00250 
00251 
00252 #endif
00253 
00254 
00255 ////////////// Funcs to write the TaskIdList to File/////////////////
00256 int WRITE_TIDL(FILE *outputFile, void *list){
00257         int i, taskId, listSize = taskIdListGetSize((TaskIdList *)list);
00258 
00259         WRITE_NUM(outputFile, "listSize", listSize);
00260         
00261         for(i = 0; i < listSize; i++){
00262                 taskId = taskIdListGet((TaskIdList *)list, i);
00263                 
00264                 WRITE_NUM(outputFile, "taskId", taskId);
00265         }
00266         
00267         return 1;
00268 }
00269 
00270 void *READ_TIDL(FILE *inputFile){
00271         int i, taskId, listSize = -1;
00272         TaskIdList *list = NULL;
00273 
00274         READ_BEGIN(inputFile);
00275                 
00276         // Read data size from disk
00277         READ_NUM("listSize", listSize);
00278         if(listSize == -1)fprintf(stderr,"Error: Reading task Id List Size\n");
00279 
00280         list = taskIdListCreate(listSize); 
00281                 
00282         for(i = 0; i< listSize; i++){
00283                 taskId = -2;
00284                 READ_NUM("taskId", taskId);
00285                 if(taskId == -1){
00286                         fprintf(stderr,"Error: Reading task Id List\n");
00287                         return NULL;
00288                 }
00289                 taskIdListAdd(list, taskId);
00290 
00291 
00292         }
00293         READ_END
00294         return ((void *) list);
00295 }
00296 

Generated on Tue Jan 17 19:18:39 2006 for Void by  doxygen 1.4.6