vector.c
Go to the documentation of this file.
1 
2 #include "vector.h"
3 
4 #include "defines.h"
5 
6 #include <stdlib.h>
7 #include <string.h>
8 
18 /**************************************************************************/
19 boolean CmpID(void *a,void *b)
20 {
21  return(*((unsigned int *)a)==*((unsigned int *)b));
22 }
23 
24 void CopyID(void *a,void *b)
25 {
26  (*((unsigned int *)a)=*((unsigned int *)b));
27 }
28 
29 void DeleteID(void *a)
30 {
31 }
32 
33 /**************************************************************************/
34 boolean CmpDouble(void *a,void *b)
35 {
36  return(*((double *)a)==*((double *)b));
37 }
38 
39 void CopyDouble(void *a,void *b)
40 {
41  (*((double *)a)=*((double *)b));
42 }
43 
44 void DeleteDouble(void *a)
45 {
46 }
47 
48 /**************************************************************************/
49 void NewDoublePair(double f,double s,TDoublePair *p)
50 {
51  p->f=f;
52  p->s=s;
53 }
54 
56 {
57  return(p->f);
58 }
59 
61 {
62  return(p->s);
63 }
64 
65 boolean CmpDoublePair(void *a,void *b)
66 {
67  return((((TDoublePair *)a)->f==((TDoublePair *)b)->f)&&
68  (((TDoublePair *)a)->s==((TDoublePair *)b)->s));
69 }
70 
71 void CopyDoublePair(void *a,void *b)
72 {
73  ((TDoublePair *)a)->f=((TDoublePair *)b)->f;
74  ((TDoublePair *)a)->s=((TDoublePair *)b)->s;
75 }
76 
77 void DeleteDoublePair(void *a)
78 {
79 }
80 
81 /**************************************************************************/
82 boolean CmpVoidPtr(void *a,void *b)
83 {
84  return(*((void **)a)==*((void **)b));
85 }
86 
87 void CopyVoidPtr(void *a,void *b)
88 {
89  (*((void **)a)=*((void **)b));
90 }
91 
92 void DeleteVoidPtr(void *a)
93 {
94  /*The data actually pointed by the pointer stored in the vector
95  should be deleted by the caller*/
96 }
97 
98 /**************************************************************************/
99 
100 void InitVector(unsigned int ele_size,void (* Copy)(void *,void*),void (* Delete)(void *),unsigned int max_ele,Tvector *vector)
101 {
102  unsigned int i;
103 
104  vector->max_ele=max_ele;
105  vector->num_ele=0;
106  vector->ele_size=ele_size;
107  vector->Delete=Delete;
108  vector->Copy=Copy;
109 
110  NEW(vector->elements,vector->max_ele,void *);
111 
112  for(i=0;i<vector->max_ele;i++)
113  vector->elements[i]=NULL;
114 }
115 
116 void ResetVector(Tvector *vector)
117 {
118  unsigned int i;
119 
120  for(i=0;i<vector->num_ele;i++)
121  {
122  if (vector->elements[i]!=NULL)
123  {
124  if (vector->Delete!=NULL)
125  vector->Delete(vector->elements[i]);
126  free(vector->elements[i]);
127  vector->elements[i]=NULL;
128  }
129  }
130 
131  vector->num_ele=0;
132 }
133 
134 void CopyVector(Tvector *v_dst,Tvector *v_src)
135 {
136  unsigned int i;
137 
138  v_dst->max_ele=v_src->max_ele;
139  v_dst->num_ele=v_src->num_ele;
140  v_dst->ele_size=v_src->ele_size;
141  v_dst->Delete=v_src->Delete;
142  v_dst->Copy=v_src->Copy;
143 
144  NEW(v_dst->elements,v_dst->max_ele,void *);
145 
146  for(i=0;i<v_dst->max_ele;i++)
147  {
148  if (v_src->elements[i]==NULL)
149  v_dst->elements[i]=NULL;
150  else
151  {
152  NEW(v_dst->elements[i],v_dst->ele_size,char);
153  v_dst->Copy(v_dst->elements[i],v_src->elements[i]);
154  }
155  }
156 }
157 
158 unsigned int VectorFirstFreePos(Tvector *vector)
159 {
160  unsigned int k;
161 
162  k=0;
163  while((k<vector->num_ele)&&(vector->elements[k]!=NULL))
164  k++;
165 
166  return(k);
167 }
168 
169 unsigned int VectorSize(Tvector *vector)
170 {
171  return(vector->num_ele);
172 }
173 
174 unsigned int VectorMaxSize(Tvector *vector)
175 {
176  return(vector->max_ele);
177 }
178 
179 boolean VectorEmpty(Tvector *vector)
180 {
181  return(vector->num_ele==0);
182 }
183 
184 boolean ElementInVector(void *e,boolean (* cmp)(void *,void*),Tvector *vector)
185 {
186  return(FindPos(e,cmp,vector)!=((unsigned int)(-1)));
187 }
188 
189 unsigned int FindPos(void *e,boolean (* cmp)(void *,void*),Tvector *vector)
190 {
191  boolean found;
192  unsigned int i;
193 
194  found=FALSE;
195  i=0;
196  while ((!found)&&(i<vector->num_ele))
197  {
198  if (vector->elements[i]!=NULL)
199  {
200  if (cmp(e,vector->elements[i]))
201  found=TRUE;
202  else
203  i++;
204  }
205  }
206  if (found)
207  return(i);
208  else
209  return((unsigned int)(-1));
210 }
211 
212 unsigned int NewVectorElement(void *e,Tvector *vector)
213 {
214  unsigned int k;
215 
216  k=vector->num_ele;
217 
218  SetVectorElement(vector->num_ele,e,vector);
219 
220  return(k);
221 }
222 
223 unsigned int NewFreeVectorElement(void *e,Tvector *vector)
224 {
225  unsigned int k;
226 
227  k=VectorFirstFreePos(vector);
228 
229  SetVectorElement(k,e,vector);
230 
231  return(k);
232 }
233 
234 void SetVectorElement(unsigned int i,void *e,Tvector *vector)
235 {
236  if (vector->Copy!=NULL)
237  {
238  if (i>=vector->num_ele)
239  {
240  vector->num_ele=i+1;
241  if (i>=vector->max_ele)
242  {
243  unsigned int k,j;
244 
245  k=vector->max_ele;
246  vector->max_ele=i*2;
247  MEM_EXPAND(vector->elements,vector->max_ele,void *);
248 
249  for(j=k;j<vector->max_ele;j++)
250  vector->elements[j]=NULL;
251  }
252  }
253 
254  if (vector->elements[i]==NULL) /* If element 'i' is still empty */
255  {
256  NEW(vector->elements[i],vector->ele_size,char); /* reserve memory */
257  }
258  else
259  {
260  /* We have some info in the vector we have to destroy before copying the new info */
261  if (vector->Delete!=NULL)
262  vector->Delete(vector->elements[i]);
263  }
264 
265  vector->Copy((void *)(vector->elements[i]),e); /* copy the user data in the reserved memory */
266  }
267 }
268 
269 void *GetVectorElement(unsigned int i,Tvector *vector)
270 {
271  if (i<vector->num_ele)
272  return(vector->elements[i]);
273  else
274  return(NULL);
275 }
276 
277 void *GetLastElement(Tvector *vector)
278 {
279  if (vector->num_ele==0)
280  return(NULL);
281  else
282  return(vector->elements[vector->num_ele-1]);
283 }
284 
285 void RemoveVectorElement(unsigned int i,Tvector *vector)
286 {
287  if ((i<vector->num_ele)&&(vector->elements[i]!=NULL))
288  {
289  if (vector->Delete!=NULL)
290  vector->Delete(vector->elements[i]);
291  free(vector->elements[i]);
292  vector->elements[i]=NULL;
293  if (i==vector->num_ele-1)
294  vector->num_ele--;
295  }
296 }
297 
298 void SwapVectorElements(unsigned int i,unsigned int j,Tvector *vector)
299 {
300  void *vi,*vj;
301 
302  if ((i<vector->num_ele)&&(j<vector->num_ele))
303  {
304  vi=vector->elements[i];
305  vj=vector->elements[j];
306  if ((vi!=NULL)&&(vj!=NULL))
307  {
308  vector->elements[i]=vj;
309  vector->elements[j]=vi;
310  }
311  else
312  Error("Swapping non-exiting elements in a vector.");
313  }
314  else
315  Error("Swapping non-exiting elements in a vector.");
316 }
317 
318 void ReverseVector(Tvector *vector)
319 {
320  int i,j;
321  void *vi,*vj;
322 
323  for(i=0,j=vector->num_ele-1;i<j;i++,j--)
324  {
325  vi=vector->elements[i];
326  vj=vector->elements[j];
327  vector->elements[i]=vj;
328  vector->elements[j]=vi;
329  }
330 }
331 
332 void ConcatVectors(Tvector *vector1,Tvector *vector)
333 {
334  unsigned int i;
335 
336  for(i=0;i<vector1->num_ele;i++)
337  NewVectorElement(vector1->elements[i],vector);
338 }
339 
340 
341 void ExtractVectorElement(unsigned int i,void *e,Tvector *vector)
342 {
343  void *vi;
344 
345  if (i<vector->num_ele)
346  {
347 
348  vi=(void *)(vector->elements[i]);
349  if (vi!=NULL)
350  {
351  vector->Copy(e,vi);
352  RemoveVectorElement(i,vector);
353  }
354  else
355  Error("Extracting a non-exiting elements in a vector.");
356  }
357  else
358  Error("Extracting a non-exiting elements in a vector.");
359 
360 }
361 
362 void MoveVectorElement(unsigned int i,unsigned int ni,Tvector *vector)
363 {
364  void *vi,*vn;
365 
366  if ((i<vector->num_ele)&&(ni<vector->num_ele))
367  {
368  if (i!=ni)
369  {
370  vi=(void *)(vector->elements[i]);
371  if (vi!=NULL)
372  {
373  vn=(void *)(vector->elements[ni]);
374  if (vn!=NULL)
375  RemoveVectorElement(ni,vector);
376 
377  vector->elements[ni]=vi;
378  vector->elements[i]=NULL;
379  }
380  else
381  Error("Moving a vector existing vector element.");
382  }
383  }
384  else
385  Error("Moving a vector element from/to a non existing position.");
386 }
387 
388 void DeleteVector(void *vector)
389 {
390  ResetVector((Tvector *)vector);
391  free(((Tvector *)vector)->elements);
392 }
double s
Definition: vector.h:116
void SwapVectorElements(unsigned int i, unsigned int j, Tvector *vector)
Swaps two elements in a vector.
Definition: vector.c:298
void NewDoublePair(double f, double s, TDoublePair *p)
Constructor.
Definition: vector.c:49
#define FALSE
FALSE.
Definition: boolean.h:30
boolean ElementInVector(void *e, boolean(*cmp)(void *, void *), Tvector *vector)
Search for an element in a vector.
Definition: vector.c:184
#define NEW(_var, _n, _type)
Allocates memory space.
Definition: defines.h:385
A pair of dubles.
Definition: vector.h:114
unsigned int num_ele
Definition: vector.h:231
unsigned int VectorSize(Tvector *vector)
Gets the number of elements in a vector.
Definition: vector.c:169
void DeleteID(void *a)
Destructor for identifiers.
Definition: vector.c:29
double f
Definition: vector.h:115
void DeleteVoidPtr(void *a)
Destructor for void pointers.
Definition: vector.c:92
#define TRUE
TRUE.
Definition: boolean.h:21
void Error(const char *s)
General error function.
Definition: error.c:80
double SecondInPair(TDoublePair *p)
The second element of a pair.
Definition: vector.c:60
unsigned int VectorFirstFreePos(Tvector *vector)
Finds a free position in the vector.
Definition: vector.c:158
boolean CmpID(void *a, void *b)
Comparison operator for identifiers.
Definition: vector.c:19
void RemoveVectorElement(unsigned int i, Tvector *vector)
Removes an element from the vector.
Definition: vector.c:285
void(* Copy)(void *, void *)
Definition: vector.h:233
void DeleteVector(void *vector)
Destructor.
Definition: vector.c:388
boolean VectorEmpty(Tvector *vector)
Checks if a vector is empty.
Definition: vector.c:179
void CopyDoublePair(void *a, void *b)
Copy constructor for pairs of doubles.
Definition: vector.c:71
boolean CmpDoublePair(void *a, void *b)
Comparison operator for paris of doubles.
Definition: vector.c:65
void ExtractVectorElement(unsigned int i, void *e, Tvector *vector)
Extracts an element from a vector.
Definition: vector.c:341
void CopyDouble(void *a, void *b)
Copy constructor for doubles.
Definition: vector.c:39
boolean CmpDouble(void *a, void *b)
Comparison operator for doubles.
Definition: vector.c:34
void CopyVoidPtr(void *a, void *b)
Copy constructor for void pointers.
Definition: vector.c:87
unsigned int NewVectorElement(void *e, Tvector *vector)
Adds an element to the vector.
Definition: vector.c:212
void CopyID(void *a, void *b)
Copy constructor for identifiers.
Definition: vector.c:24
void SetVectorElement(unsigned int i, void *e, Tvector *vector)
Adds an element to the vector in a given position.
Definition: vector.c:234
Definitions of constants and macros used in several parts of the cuik library.
unsigned int max_ele
Definition: vector.h:232
void ** elements
Definition: vector.h:229
void ReverseVector(Tvector *vector)
Reverses a vector.
Definition: vector.c:318
void ResetVector(Tvector *vector)
Resets a vector.
Definition: vector.c:116
void MoveVectorElement(unsigned int i, unsigned int ni, Tvector *vector)
Moves a vector element from one position to another.
Definition: vector.c:362
A generic vector.
Definition: vector.h:227
boolean CmpVoidPtr(void *a, void *b)
Comparison operator for void pointers.
Definition: vector.c:82
void InitVector(unsigned int ele_size, void(*Copy)(void *, void *), void(*Delete)(void *), unsigned int max_ele, Tvector *vector)
Constructor.
Definition: vector.c:100
unsigned int FindPos(void *e, boolean(*cmp)(void *, void *), Tvector *vector)
Search for an element in a vector.
Definition: vector.c:189
void * GetVectorElement(unsigned int i, Tvector *vector)
Returns a pointer to a vector element.
Definition: vector.c:269
Definition of the Tvector type and the associated functions.
unsigned int NewFreeVectorElement(void *e, Tvector *vector)
Adds an element to the vector.
Definition: vector.c:223
#define MEM_EXPAND(_var, _n, _type)
Expands a previously allocated memory space.
Definition: defines.h:404
void(* Delete)(void *)
Definition: vector.h:234
void ConcatVectors(Tvector *vector1, Tvector *vector)
Concatenates two vectors.
Definition: vector.c:332
void DeleteDoublePair(void *a)
Destructor for pairs of doubles.
Definition: vector.c:77
void CopyVector(Tvector *v_dst, Tvector *v_src)
Copy constructor.
Definition: vector.c:134
unsigned int VectorMaxSize(Tvector *vector)
Gets the maximum number of elements in a vector.
Definition: vector.c:174
unsigned int ele_size
Definition: vector.h:230
void DeleteDouble(void *a)
Destructor for doubles.
Definition: vector.c:44
double FirstInPair(TDoublePair *p)
The first element of a pair.
Definition: vector.c:55
void * GetLastElement(Tvector *vector)
Returns a pointer to the last element of a vector.
Definition: vector.c:277