Institut de Robòtica i Informàtica Industrial
KRD Group

The CuikSuite Project

vector.c

Go to the documentation of this file.
00001 
00002 #include "vector.h"
00003 
00004 #include "defines.h"
00005 
00006 #include <stdlib.h>
00007 #include <string.h>
00008 
00018 /**************************************************************************/
00019 boolean CmpID(void *a,void *b)
00020 {
00021   return(*((unsigned int *)a)==*((unsigned int *)b));
00022 }
00023 
00024 void CopyID(void *a,void *b)
00025 {
00026   (*((unsigned int *)a)=*((unsigned int *)b));
00027 }
00028 
00029 void DeleteID(void *a)
00030 {
00031 }
00032 
00033 /**************************************************************************/
00034 boolean CmpDouble(void *a,void *b)
00035 {
00036   return(*((double *)a)==*((double *)b));
00037 }
00038 
00039 void CopyDouble(void *a,void *b)
00040 {
00041   (*((double *)a)=*((double *)b));
00042 }
00043 
00044 void DeleteDouble(void *a)
00045 {
00046 }
00047 
00048 /**************************************************************************/
00049 boolean CmpVoidPtr(void *a,void *b)
00050 {
00051   return(*((void **)a)==*((void **)b));
00052 }
00053 
00054 void CopyVoidPtr(void *a,void *b)
00055 {
00056   (*((void **)a)=*((void **)b));
00057 }
00058 
00059 void DeleteVoidPtr(void *a)
00060 {
00061   /*The data actually pointed by the pointer stored in the vector
00062     should be deleted by the caller*/
00063 }
00064 
00065 /**************************************************************************/
00066 
00067 void InitVector(unsigned int ele_size,void (* Copy)(void *,void*),void (* Delete)(void *),unsigned int max_ele,Tvector *vector)
00068 {
00069   unsigned int i;
00070 
00071   vector->max_ele=max_ele;
00072   vector->num_ele=0;
00073   vector->ele_size=ele_size;
00074   vector->Delete=Delete;
00075   vector->Copy=Copy;
00076 
00077   NEW(vector->elements,vector->max_ele,void *);
00078 
00079   for(i=0;i<vector->max_ele;i++)
00080     vector->elements[i]=NULL; 
00081 }
00082 
00083 void ResetVector(Tvector *vector)
00084 {
00085   unsigned int i;
00086 
00087   for(i=0;i<vector->num_ele;i++)
00088     {
00089       if (vector->elements[i]!=NULL)
00090         {
00091           if (vector->Delete!=NULL)
00092             vector->Delete(vector->elements[i]);
00093           free(vector->elements[i]);
00094           vector->elements[i]=NULL; 
00095         }
00096     }
00097 
00098   vector->num_ele=0;
00099 }
00100 
00101 void CopyVector(Tvector *v_dst,Tvector *v_src)
00102 {
00103   unsigned int i;
00104 
00105   v_dst->max_ele=v_src->max_ele;
00106   v_dst->num_ele=v_src->num_ele;
00107   v_dst->ele_size=v_src->ele_size;
00108   v_dst->Delete=v_src->Delete;
00109   v_dst->Copy=v_src->Copy;
00110 
00111   NEW(v_dst->elements,v_dst->max_ele,void *);
00112 
00113   for(i=0;i<v_dst->max_ele;i++)
00114     {
00115       if (v_src->elements[i]==NULL)
00116         v_dst->elements[i]=NULL;
00117       else
00118         {
00119           NEW(v_dst->elements[i],v_dst->ele_size,char);
00120           v_dst->Copy(v_dst->elements[i],v_src->elements[i]);
00121         }
00122     }
00123 }
00124 
00125 unsigned int VectorFirstFreePos(Tvector *vector)
00126 {
00127   unsigned int k;
00128 
00129   k=0;
00130   while((k<vector->num_ele)&&(vector->elements[k]!=NULL))
00131     k++;
00132 
00133   return(k);
00134 }
00135 
00136 unsigned int VectorSize(Tvector *vector)
00137 {
00138   return(vector->num_ele);
00139 }
00140 
00141 unsigned int VectorMaxSize(Tvector *vector)
00142 {
00143   return(vector->max_ele);
00144 }
00145 
00146 boolean VectorEmpty(Tvector *vector)
00147 {
00148   return(vector->num_ele==0);
00149 }
00150 
00151 boolean ElementInVector(void *e,boolean (* cmp)(void *,void*),Tvector *vector)
00152 {
00153   return(FindPos(e,cmp,vector)!=((unsigned int)(-1)));
00154 }
00155 
00156 unsigned int FindPos(void *e,boolean (* cmp)(void *,void*),Tvector *vector)
00157 {
00158   boolean found;
00159   unsigned int i;
00160   
00161   found=FALSE;
00162   i=0;
00163   while ((!found)&&(i<vector->num_ele))
00164     {
00165       if (vector->elements[i]!=NULL)
00166         {
00167           if (cmp(e,vector->elements[i]))
00168             found=TRUE;
00169           else
00170             i++;
00171         }
00172     }
00173   if (found)
00174     return(i);
00175   else
00176     return((unsigned int)(-1));
00177 }
00178 
00179 unsigned int NewVectorElement(void *e,Tvector *vector)
00180 {
00181   unsigned int k;
00182 
00183   k=vector->num_ele;
00184 
00185   SetVectorElement(vector->num_ele,e,vector);
00186 
00187   return(k);
00188 }
00189 
00190 unsigned int NewFreeVectorElement(void *e,Tvector *vector)
00191 {
00192   unsigned int k;
00193 
00194   k=VectorFirstFreePos(vector);
00195  
00196   SetVectorElement(k,e,vector);
00197 
00198   return(k);
00199 }
00200 
00201 void SetVectorElement(unsigned int i,void *e,Tvector *vector)
00202 {
00203   if (vector->Copy!=NULL)
00204     {
00205       if (i>=vector->num_ele)
00206         {
00207           vector->num_ele=i+1;
00208           if (i>=vector->max_ele)
00209             {
00210               unsigned int k,j;
00211               
00212               k=vector->max_ele;
00213               vector->max_ele=i*2;
00214               MEM_EXPAND(vector->elements,vector->max_ele,void *);
00215               
00216               for(j=k;j<vector->max_ele;j++)
00217                 vector->elements[j]=NULL;
00218             }
00219         }
00220       
00221       if (vector->elements[i]==NULL) /* If element 'i' is still empty */
00222         {
00223           NEW(vector->elements[i],vector->ele_size,char); /* reserve memory */
00224         }
00225       else
00226         {
00227           /* We have some info in the vector we have to destroy before copying the new info */
00228           if (vector->Delete!=NULL)
00229             vector->Delete(vector->elements[i]);
00230         }
00231       
00232       vector->Copy((void *)(vector->elements[i]),e); /* copy the user data in the reserved memory */
00233     }
00234 }
00235 
00236 void *GetVectorElement(unsigned int i,Tvector *vector)
00237 {
00238   if (i<vector->num_ele)
00239     return(vector->elements[i]);
00240   else
00241     return(NULL);
00242 }
00243 
00244 void *GetLastElement(Tvector *vector)
00245 {
00246   if (vector->num_ele==0)
00247     return(NULL);
00248   else
00249     return(vector->elements[vector->num_ele-1]);
00250 }
00251 
00252 void RemoveVectorElement(unsigned int i,Tvector *vector)
00253 {
00254   if ((i<vector->num_ele)&&(vector->elements[i]!=NULL))
00255     {
00256       if (vector->Delete!=NULL)
00257         vector->Delete(vector->elements[i]);
00258       free(vector->elements[i]);
00259       vector->elements[i]=NULL;
00260       if (i==vector->num_ele-1)
00261         vector->num_ele--;
00262     }
00263 }
00264 
00265 void SwapVectorElements(unsigned int i,unsigned int j,Tvector *vector)
00266 {
00267   void *vi,*vj;
00268 
00269   if ((i<vector->num_ele)&&(j<vector->num_ele))
00270     {
00271       vi=vector->elements[i];
00272       vj=vector->elements[j];
00273       if ((vi!=NULL)&&(vj!=NULL))
00274         {
00275           vector->elements[i]=vj;
00276           vector->elements[j]=vi;
00277         }
00278       else
00279         Error("Swapping non-exiting elements in a vector.");
00280     }
00281   else
00282     Error("Swapping non-exiting elements in a vector.");
00283 }
00284 
00285 void ExtractVectorElement(unsigned int i,void *e,Tvector *vector)
00286 {
00287   void *vi;
00288 
00289   if (i<vector->num_ele)
00290     {
00291      
00292       vi=(void *)(vector->elements[i]);
00293       if (vi!=NULL)
00294         {
00295           vector->Copy(e,vi);
00296           RemoveVectorElement(i,vector);
00297         }
00298       else
00299         Error("Extracting a non-exiting elements in a vector.");
00300     }
00301   else
00302     Error("Extracting a non-exiting elements in a vector.");
00303     
00304 }
00305 
00306 void MoveVectorElement(unsigned int i,unsigned int ni,Tvector *vector)
00307 {
00308   void *vi,*vn;
00309 
00310   if ((i<vector->num_ele)&&(ni<vector->num_ele))
00311     {
00312       if (i!=ni)
00313         {
00314           vi=(void *)(vector->elements[i]);
00315           if (vi!=NULL)
00316             {
00317               vn=(void *)(vector->elements[ni]);
00318               if (vn!=NULL)
00319                 RemoveVectorElement(ni,vector);
00320               
00321               vector->elements[ni]=vi;
00322               vector->elements[i]=NULL;
00323             }
00324           else
00325             Error("Moving a vector existing vector element.");
00326         }
00327     }
00328   else
00329     Error("Moving a vector element from/to a non existing position.");
00330 }
00331 
00332 void DeleteVector(void *vector)
00333 {
00334   ResetVector((Tvector *)vector);
00335   free(((Tvector *)vector)->elements);
00336 }