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
00062
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)
00222 {
00223 NEW(vector->elements[i],vector->ele_size,char);
00224 }
00225 else
00226 {
00227
00228 if (vector->Delete!=NULL)
00229 vector->Delete(vector->elements[i]);
00230 }
00231
00232 vector->Copy((void *)(vector->elements[i]),e);
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 }