13 resize(vector_t vector)
15 return vector_reserve(vector, !(vector->capacity) ? 1 : (vector->size) << 1);
19 move(vector_t vector, int dst,int src, int size)
21 return (NULL != memmove(vector->items + dst, vector->items + src,size * sizeof(void*)));
25 vector_new(int capacity, fn_finalize_t fn_finalize)
35 if(!(vector = (vector_t)calloc(1,sizeof(s_vector_t))))
40 if(!(vector->items = (void**)calloc(capacity,sizeof(void*))))
46 vector->capacity = capacity;
49 vector->fn_finalize = fn_finalize;
55 vector_clear(vector_t vector)
63 if(vector->fn_finalize)
65 int size = vector->size;
66 fn_finalize_t fn_finalize = vector->fn_finalize;
67 void** items = vector->items;
70 for(pos = 0; pos < size; pos++)
72 if((errno = (*(fn_finalize))(&(items[pos]))))
89 vector_free(vector_t* vector_ptr)
94 if((errno = vector_clear(*vector_ptr)))
104 vector_is_empty(vector_t vector)
112 return !vector->size;
116 vector_get_size(vector_t vector)
128 vector_get_front(vector_t vector)
142 return vector->items[0];
146 vector_get_back(vector_t vector)
160 return vector->items[vector->size - 1];
164 vector_get_capacity_available(vector_t vector)
172 return (vector->capacity - vector->size);
176 vector_push_back(vector_t vector, void* item)
182 /* if all capacity is used, resize the vector */
183 if(vector->capacity <= vector->size)
189 /* increment the item count and push the new item at the end of the vector */
190 vector->items[++(vector->size) - 1] = item;
198 vector_pop_back(vector_t vector)
214 return vector->items[(vector->size)-- - 1];
218 vector_get_upper_bound(vector_t vector)
232 return (vector->size - 1);
236 vector_set_at(vector_t vector, int pos, void* item)
252 if((pos < 0) || (pos >= vector->size))
258 prev_item = vector->items[pos];
259 vector->items[pos] = item;
264 vector_insert(vector_t vector, int pos, void* item)
275 if((pos < 0) || (pos >= vector->size))
281 if(vector->size >= vector->capacity)
289 if(!move(vector, pos + 1, pos, vector->size - pos))
294 vector->items[pos] = item;
301 vector_erase_at(vector_t vector, int pos)
312 if((pos < 0) || (pos >= vector->size))
318 if(vector->fn_finalize)
320 if((errno = (*(vector->fn_finalize))(&(vector->items[pos]))))
324 if(pos != (vector->size - 1))
326 if(!move(vector, pos, pos + 1, (vector->size - (pos + 1))))
337 vector_erase(vector_t vector, void* item)
347 if(-1 == (pos = vector_search(vector,item)))
350 if(vector->fn_finalize)
352 if((errno = (*(vector->fn_finalize))(&item)))
356 if(pos != (vector->size - 1))
357 if(!move(vector, pos, pos + 1, (vector->size - (pos + 1))))
368 vector_erase_range(vector_t vector, int first, int last)
372 if(!vector || first >= last)
378 if((first < 0) || (last < 0) || (last >= vector->size))
381 width = (last - first) + 1;
385 if((errno = vector_erase_at(vector,first)))
393 vector_search(vector_t vector, void* item)
411 vector = (vector_t)vector;
413 items = vector->items;
416 for(pos = 0 ; pos < size; pos++)
418 if(items[pos] == item)
427 vector_remove(vector_t vector, void* item)
437 if(-1 == (pos = vector_search(vector,item)))
440 if(pos != (vector->size - 1))
441 if(!move(vector, pos, pos + 1, (vector->size - (pos + 1))))
452 vector_assign(vector_t dst,vector_t src)
459 if(!dst || !src ||(dst == src))
467 /* if the destination vector has not enough capacity resize it */
468 if(size > dst->capacity)
470 if((errno = vector_reserve(dst, size - dst->capacity)))
474 /* clear the destination vector */
475 if((errno = vector_clear(dst)))
478 dst->fn_finalize = NULL;
482 /* file the destination vector */
483 for(pos = 0; pos < size; pos++)
484 if((errno = vector_push_back(dst,items[pos])))
493 vector_get_capacity(vector_t vector)
501 return vector->capacity;
505 vector_equals(vector_t first, vector_t second)
509 void** __first, ** __second;
512 if(!first || !second || (first == second))
518 if(first->size != second->size)
522 __first = first->items;
523 __second = second->items;
525 for(pos = 0; pos < size; pos++)
527 if(__first[pos] != __second[pos])
535 vector_clone(vector_t vector)
548 clone = vector_new(vector->capacity,NULL);
557 for(pos = 0; pos < size; pos++)
566 vector_contains(vector_t vector,void* item)
574 return (-1 != vector_search(vector,item));
578 vector_swap(vector_t first,vector_t second)
582 if(!first || !second)
585 /* save the content or first */
588 /* copy second in first */
589 if(!memcpy(first, second, sizeof(s_vector_t)))
592 /* copy tmp in first */
593 if(!memcpy(second, &tmp, sizeof(s_vector_t)))
603 vector_reserve(vector_t vector, int size)
607 if(!vector || (size < 0))
610 if(vector->capacity >= size)
613 if(!(items = (void**)realloc(vector->items, size * sizeof(void*))))
616 vector->capacity = size;
617 vector->items = items;
623 vector_is_autodelete(vector_t vector)
631 return NULL != vector->fn_finalize;
635 vector_has_capacity_available(vector_t vector)
643 return (vector->capacity > vector->size);
647 vector_is_full(vector_t vector)
656 return (vector->capacity == vector->size);
660 vector_get_max_index(vector_t vector)
670 return vector->size - 1;
674 vector_get(vector_t vector)
682 if(!vector->size || (-1 == vector->pos))
687 return vector->items[vector->pos];
691 vector_get_at(vector_t vector, int pos)
699 if(pos < 0 || pos >= vector->size)
712 return vector->items[pos];
716 vector_getpos(vector_t vector, int* pos)
725 if(!vector->size || (-1 == vector->pos))
736 vector_move_next(vector_t vector)
744 if(!vector->size || (-1 == vector->pos))
750 if(vector->pos < (vector->size - 1))
762 vector_move_prev(vector_t vector)
770 if(!vector->size || (-1 == vector->pos))
789 vector_rewind(vector_t vector)
809 seek_set(vector_t vector, int offset)
811 if(offset > vector->size)
814 vector_rewind(vector);
817 vector_move_next(vector);
823 seek_end(vector_t vector, int offset)
825 if(offset > vector->size)
828 vector_unwind(vector);
831 vector_move_prev(vector);
838 seek_cur(vector_t vector, int offset)
842 /* we are at the begin of the vector */
843 seek_set(vector, offset);
845 else if(vector->pos == vector->size - 1)
847 /* we are at the end of the vector */
848 seek_end(vector, offset);
852 if(offset > (vector->size - vector->pos + 1))
856 vector_move_next(vector);
864 vector_seek(vector_t vector, int offset, int whence)
875 return seek_set(vector, offset);
878 return seek_cur(vector, offset);
881 return seek_end(vector, offset);
889 vector_set(vector_t vector, void* item)
899 if(!vector->size || (-1 == vector->pos))
905 prev_item = vector->items[vector->pos];
906 vector->items[vector->pos] = item;
912 vector_setpos(vector_t vector, int pos)
920 if(pos < 0 || pos >= vector->size)
937 vector_tell(vector_t vector)
945 if(!vector->size || (-1 == vector->pos))
955 vector_unwind(vector_t vector)
969 vector->pos = vector->size - 1;