a303d54805a4e63d7d5e7dd31d28c051522e99b1
5 #include "cgds/Vector.h"
11 void _vector_init(Vector
* vector
, size_t dataSize
)
14 vector
->dataSize
= dataSize
;
19 Vector
* _vector_new(size_t dataSize
)
21 Vector
* vector
= (Vector
*) safe_malloc(sizeof (Vector
));
22 _vector_init(vector
, dataSize
);
26 Vector
* vector_copy(Vector
* vector
)
28 Vector
* vectorCopy
= _vector_new(vector
->dataSize
);
29 vectorCopy
->size
= vector
->size
;
30 vectorCopy
->capacity
= vector
->capacity
;
31 vectorCopy
->datas
= (void**) safe_malloc(vector
->capacity
* sizeof (void*));
32 for (UInt i
= 0; i
< vector
->size
; i
++)
34 vectorCopy
->datas
[i
] = safe_malloc(vector
->dataSize
);
35 memcpy(vectorCopy
->datas
[i
], vector
->datas
[i
], vector
->dataSize
);
40 Bool
vector_empty(Vector
* vector
)
42 return (vector
->size
== 0);
45 UInt
vector_size(Vector
* vector
)
50 void _vector_realloc(Vector
* vector
, UInt newCapacity
)
52 void** rellocatedDatas
= (void**) safe_malloc(newCapacity
* sizeof (void*));
53 for (UInt i
= 0; i
< vector
->size
; i
++)
55 rellocatedDatas
[i
] = (void*) safe_malloc(vector
->dataSize
);
56 memcpy(rellocatedDatas
[i
], vector
->datas
[i
], vector
->dataSize
);
57 safe_free(vector
->datas
[i
]);
59 safe_free(vector
->datas
);
60 vector
->datas
= rellocatedDatas
;
61 vector
->capacity
= newCapacity
;
64 void _vector_push(Vector
* vector
, void* data
)
66 void* pData
= safe_malloc(vector
->dataSize
);
67 memcpy(pData
, data
, vector
->dataSize
);
68 if (vector
->size
>= vector
->capacity
)
70 UInt increasedCapacity
= vector
->capacity
> 0 ? 2 * vector
->capacity
: 1;
71 _vector_realloc(vector
, increasedCapacity
);
73 vector
->datas
[vector
->size
] = pData
;
77 void vector_pop(Vector
* vector
)
79 safe_free(vector
->datas
[vector_size(vector
) - 1]);
81 if (vector_size(vector
) <= (vector
->capacity
>> 1))
82 _vector_realloc(vector
, vector
->capacity
>> 1);
85 void vector_pop_first(Vector
* vector
)
87 safe_free(vector
->datas
[0]);
90 if (vector_size(vector
) <= (vector
->capacity
>> 1))
91 _vector_realloc(vector
, vector
->capacity
>> 1);
94 void* _vector_get(Vector
* vector
, UInt index
)
96 return vector
->datas
[index
];
99 void _vector_set(Vector
* vector
, UInt index
, void* data
)
101 memcpy(vector
->datas
[index
], data
, vector
->dataSize
);
104 void vector_clear(Vector
* vector
)
106 for (UInt i
= 0; i
< vector
->size
; i
++)
107 safe_free(vector
->datas
[i
]);
108 safe_free(vector
->datas
);
109 _vector_init(vector
, vector
->dataSize
);
112 void vector_destroy(Vector
* vector
)
114 vector_clear(vector
);
122 VectorIterator
* vector_get_iterator(Vector
* vector
)
124 VectorIterator
* vectorI
= (VectorIterator
*) safe_malloc(sizeof (VectorIterator
));
125 vectorI
->vector
= vector
;
126 vectorI_reset_begin(vectorI
);
130 void vectorI_reset_begin(VectorIterator
* vectorI
)
132 vectorI
->current
= vectorI
->vector
->datas
;
135 void vectorI_reset_end(VectorIterator
* vectorI
)
137 vectorI
->current
= vectorI
->vector
->datas
+ vectorI
->vector
->size
- 1;
140 Bool
vectorI_has_data(VectorIterator
* vectorI
)
142 return (vectorI
->current
>= vectorI
->vector
->datas
&&
143 vectorI
->current
< vectorI
->vector
->datas
+ vectorI
->vector
->size
);
146 void* _vectorI_get(VectorIterator
* vectorI
)
148 return *(vectorI
->current
);
151 void _vectorI_set(VectorIterator
* vectorI
, void* data
)
153 *(vectorI
->current
) = data
;
156 void vectorI_move_next(VectorIterator
* vectorI
)
161 void vectorI_move_prev(VectorIterator
* vectorI
)
166 void vectorI_destroy(VectorIterator
* vectorI
)