Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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));    
}
Ejemplo n.º 4
0
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;
	}
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
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;
	}    
}
Ejemplo n.º 7
0
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;
		}
	}
}
Ejemplo n.º 8
0
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;
        	}
	}
}
Ejemplo n.º 9
0
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;
}