c_pvector c_vector_assign(c_pvector thiz, const c_pvector V) { if(V != thiz) { _c_vector_impl * pl = (_c_vector_impl *)thiz->_l; const size_type vlen = c_vector_size(V); if(vlen > c_vector_capacity(thiz)) { c_iterator tmp = _A_allocate_and_copy(thiz, vlen, c_vector_begin(V), c_vector_end(V)); _A_deallocate(thiz, pl->_start, abs(pl->_end_of_storage - pl->_start)); pl->_start = (pnode_t)tmp._i; pl->_end_of_storage = pl->_start + vlen; } else if(c_vector_size(thiz) >= vlen) { c_copy(c_vector_begin(V), c_vector_end(V), c_vector_begin(thiz)); } else { c_iterator bg = c_vector_begin(thiz); c_copy(bg, ITER_POSITIVE_N(bg, c_vector_size(thiz)), _A_get_iterator(pl->_start)); c_uninitialized_copy(ITER_POSITIVE_N(bg, c_vector_size(thiz)), c_vector_end(thiz), _A_get_iterator(pl->_finish)); } pl->_finish = pl->_start + vlen; } return thiz; }
c_bool c_vector_equal(c_pvector thiz, const c_pvector V) { c_binary_predicate bp = c_binary_negate(thiz->_cmp); return (c_vector_size(thiz) == c_vector_size(V)) && c_equal2(c_vector_begin(thiz), c_vector_end(thiz), c_vector_begin(V), bp); }
static void vector_resize(c_vector * p) { print_vector(p); printf("vector size : %d\n", c_vector_size(p)); c_vector_resize(p, 100); print_vector(p); printf("vector size : %d\n", c_vector_size(p)); c_vector_resize(p, 0); print_vector(p); printf("vector size : %d\n", c_vector_size(p)); create_with_push_back(p); c_vector_resize(p, 3); print_vector(p); printf("vector size : %d\n", c_vector_size(p)); }
static void _A_insert_aux1(c_pvector thiz, c_iterator pos, node_t val) { _c_vector_impl * pl = (_c_vector_impl *)thiz->_l; if(pl->_finish != pl->_end_of_storage) { node_t node; *pl->_finish = *(pl->_finish - 1); ++ pl->_finish; node = val; c_copy_backward(pos, _A_get_iterator(pl->_finish - 2), _A_get_iterator(pl->_finish - 1)); ITER_REF_ASSIGN(pos, node); } else { const size_type old_size = c_vector_size(thiz); const size_type len = old_size != 0 ? 2 * old_size : 1; c_iterator new_start = _A_get_iterator(_A_allocate(thiz, len)); c_iterator new_finish = new_start; new_finish = c_copy(_A_get_iterator(pl->_start), pos, new_start); ITER_REF_ASSIGN(new_finish, val); ITER_INC(new_finish); new_finish = c_copy(pos, _A_get_iterator(pl->_finish), new_finish); _A_deallocate(thiz, pl->_start, abs(pl->_end_of_storage - pl->_start)); pl->_start = (pnode_t)new_start._i; pl->_finish = (pnode_t)new_finish._i; pl->_end_of_storage = pl->_start + len; } }
void c_vector_resize(c_pvector thiz, size_t n) { c_iterator begin = c_vector_begin(thiz); if(n < c_vector_size(thiz)) c_vector_erase2(thiz, ITER_POSITIVE_N(begin, n), c_vector_end(thiz)); else c_vector_fill_insert(thiz, c_vector_end(thiz), n, NULL); }
void c_vector_reserve(c_pvector thiz, size_t n) { if(c_vector_capacity(thiz) < n) { _c_vector_impl * pl = (_c_vector_impl *)thiz->_l; const size_type old_size = c_vector_size(thiz); c_iterator tmp = _A_allocate_and_copy(thiz, n, c_vector_begin(thiz), c_vector_end(thiz)); _A_deallocate(thiz, pl->_start, abs(pl->_end_of_storage - pl->_start)); pl->_start = (pnode_t)tmp._i; pl->_finish = pl->_start + old_size; pl->_end_of_storage = pl->_start + n; } }
void c_vector_insert2(c_pvector thiz, c_iterator pos, c_iterator first, c_iterator last) { if(!ITER_EQUAL(first, last)) { _c_vector_impl * pl = (_c_vector_impl *)thiz->_l; difference_type dn = 0; size_type n = 0; c_distance1(first, last, &dn); n = abs(dn); if(abs(pl->_end_of_storage - pl->_finish) >= (int)n) { const size_type elems_after = pl->_finish - (pnode_t)pos._i; c_iterator old_finish = c_vector_end(thiz); if(elems_after > n) { c_uninitialized_copy(_A_get_iterator(pl->_finish - n), _A_get_iterator(pl->_finish), _A_get_iterator(pl->_finish)); pl->_finish += n; c_copy_backward(pos, ITER_NEGATIVE_N(old_finish, n), old_finish); c_copy(first, last, pos); } else { c_uninitialized_copy(ITER_POSITIVE_N(first, elems_after), last, _A_get_iterator(pl->_finish)); pl->_finish += n - elems_after; c_uninitialized_copy(pos, old_finish, _A_get_iterator(pl->_finish)); pl->_finish += elems_after; c_copy(first, ITER_POSITIVE_N(first, elems_after), pos); } } else { const size_type old_size = c_vector_size(thiz); const size_type len = old_size + C_MAX(old_size, n); c_iterator new_start = _A_get_iterator(_A_allocate(thiz, len)); c_iterator new_finish = new_start; new_finish = c_uninitialized_copy(_A_get_iterator(pl->_start), pos, new_start); new_finish = c_uninitialized_copy(first, last, new_finish); new_finish = c_uninitialized_copy(pos, _A_get_iterator(pl->_finish), new_finish); _A_deallocate(thiz, pl->_start, abs(pl->_end_of_storage - pl->_start)); pl->_start = (pnode_t)new_start._i; pl->_finish = (pnode_t)new_finish._i; pl->_end_of_storage = (pnode_t)ITER_POSITIVE_N(new_start, len)._i; } } }
void c_vector_fill_insert(c_pvector thiz, c_iterator pos, size_type n, const value_type val) { _c_vector_impl * pl = (_c_vector_impl *)thiz->_l; if(n != 0) { if(abs(pl->_end_of_storage - pl->_finish) >= (int)n) { value_type val_copy = val; const size_type elems_after = pl->_finish - (pnode_t)pos._i; c_iterator old_finish = c_vector_end(thiz); if(elems_after > n) { c_uninitialized_copy(_A_get_iterator(pl->_finish - n), _A_get_iterator(pl->_finish), _A_get_iterator(pl->_finish)); pl->_finish += n; c_copy_backward(pos, ITER_NEGATIVE_N(old_finish, n), old_finish); c_fill(pos, ITER_POSITIVE_N(pos, n), val_copy); } else { c_uninitialized_fill_n(c_vector_end(thiz), n - elems_after, val_copy); pl->_finish += n - elems_after; c_uninitialized_copy(pos, old_finish, c_vector_end(thiz)); pl->_finish += elems_after; c_fill(pos, old_finish, val_copy); } } else { const size_type old_size = c_vector_size(thiz); const size_type len = old_size + C_MAX(old_size, n); c_iterator new_start = _A_get_iterator(_A_allocate(thiz, len)); c_iterator new_finish = new_start; new_finish = c_uninitialized_copy(_A_get_iterator(pl->_start), pos, new_start); new_finish = c_uninitialized_fill_n(new_finish, n, val); new_finish = c_uninitialized_copy(pos, _A_get_iterator(pl->_finish), new_finish); _A_deallocate(thiz, pl->_start, abs(pl->_end_of_storage - pl->_start)); pl->_start = (pnode_t)new_start._i; pl->_finish = (pnode_t)new_finish._i; pl->_end_of_storage = pl->_start + len; } } }
int main(int agrc, char **argv) { size_t error; c_vector *vector; // Пытаемся создать вектор емкостью CAPACITY, который содержит объекты типа object. vector = c_vector_create(sizeof(object), CAPACITY, &error); // Если вектор создать не удалось, выводим причину ошибки. if (vector == NULL) { printf("create error: %Iu\n", error); printf("Program end.\n"); getchar(); return -1; } // Вставляем в конец вектора 11 объектов. for (size_t i = 0; i < 11; ++i) { object *const obj = c_vector_push_back(vector, &error); // Если вставить объект не удалось, выводим причину ошибки. if (obj == NULL) { printf("push back error: %Iu\n", error); printf("Proogram end.\n"); getchar(); return -2; } // Инициализируем вставленный объект. obj->i = i; obj->f = i + 3.14f; } // Покажем размер вектора. { error = 0; const size_t size = c_vector_size(vector, &error); // Если size == 0 и error > 0, значит возникла ошибка. if ( (size == 0) && (error > 0) ) { printf("size error: %Iu\n", error); printf("Program end.\n"); getchar(); return -3; } // Покажем размер. printf("size: %Iu\n", size); } // Покажем емкость вектора. { error = 0; const size_t capacity = c_vector_capacity(vector, &error); // Если capacity == 0 и error > 0, значит произошла ошибка. if ( (capacity == 0) && (error > 0) ) { printf("capacity error: %Iu\n", error); printf("Program end.\n"); getchar(); return -4; } // Покажем емкость. printf("capacity: %Iu\n", capacity); } // Используя функцию обхода, выведем содержимое каждого элемента вектора. { const ptrdiff_t r_code = c_vector_for_each(vector, print_object); // Если произошла ошибка, покажем ее. if (r_code < 0) { printf("for each error, r_code: %Id\n", r_code); printf("Program end.\n"); getchar(); return -5; } } // Удалим из вектора несколько элементов, используя массив индексов. { size_t indexes[5] = {0, 2, 1, 3, 99}; error = 0; // Специализированная функция для удаления объекта типа object не нужна. const size_t d_count = c_vector_erase_few(vector, indexes, 5, NULL, &error); // Если произошла ошибка, покажем ее. if ( (d_count == 0) && (error > 0) ) { printf("erase few error: %Iu\n", error); printf("Program end.\n"); getchar(); return -6; } // Покажем, сколько элементов было удалено. printf("d_count: %Iu\n", d_count); } // Используя функцию обхода, выведем содержимое каждого элемента вектора. { const ptrdiff_t r_code = c_vector_for_each(vector, print_object); // Если произошла ошибка, покажем ее. if (r_code < 0) { printf("for each error, r_code: %Id\n", r_code); printf("Program end.\n"); getchar(); return -7; } } // Удалим из вектора все элементы, f которых > 9. { error = 0; const size_t d_count = c_vector_remove_few(vector, pred_object, NULL, &error); // Если произошла ошибка, покажем ее. if ( (d_count == 0) && (error > 0) ) { printf("remove few error: %Iu\n", error); printf("Program end.\n"); getchar(); return -8; } // Покажем, сколько элементов было удалено. printf("d_count: %Iu\n", d_count); } // Используя функцию обхода, выведем содержимое каждого элемента вектора. { const ptrdiff_t r_code = c_vector_for_each(vector, print_object); // Если произошла ошибка, покажем ее. if (r_code < 0) { printf("for each error, r_code: %Id\n", r_code); printf("Program end.\n"); getchar(); return -9; } } // Удалим вектор. { const ptrdiff_t r_code = c_vector_delete(vector, NULL); // Если возникла ошибка, покажем ее. if (r_code < 0) { printf("delete error, r_code: %Id\n", r_code); printf("Program end.\n"); getchar(); return -10; } } getchar(); return 0; }