R_API void *r_vector_assign_at(RVector *vec, size_t index, void *elem) { void *p = r_vector_index_ptr (vec, index); if (elem) { r_vector_assign (vec, p, elem); } return p; }
static void vector_free_elems(RVector *vec) { if (vec->free) { while (vec->len > 0) { vec->free (r_vector_index_ptr (vec, --vec->len), vec->free_user); } } else { vec->len = 0; } }
R_API void *r_vector_push(RVector *vec, void *x) { if (vec->len >= vec->capacity) { RESIZE_OR_RETURN_NULL (NEXT_VECTOR_CAPACITY); } void *p = r_vector_index_ptr (vec, vec->len++); if (x) { r_vector_assign (vec, p, x); } return p; }
R_API void r_vector_remove_at(RVector *vec, size_t index, void *into) { void *p = r_vector_index_ptr (vec, index); if (into) { r_vector_assign (vec, into, p); } vec->len--; if (index < vec->len) { memmove (p, (char *)p + vec->elem_size, vec->elem_size * (vec->len - index)); } }
R_API void *r_vector_insert(RVector *vec, size_t index, void *x) { if (vec->len >= vec->capacity) { RESIZE_OR_RETURN_NULL (NEXT_VECTOR_CAPACITY); } void *p = r_vector_index_ptr (vec, index); if (index < vec->len) { memmove ((char *)p + vec->elem_size, p, vec->elem_size * (vec->len - index)); } vec->len++; if (x) { r_vector_assign (vec, p, x); } return p; }
R_API void *r_vector_insert_range(RVector *vec, size_t index, void *first, size_t count) { if (vec->len + count > vec->capacity) { RESIZE_OR_RETURN_NULL (R_MAX (NEXT_VECTOR_CAPACITY, vec->len + count)); } size_t sz = count * vec->elem_size; void *p = r_vector_index_ptr (vec, index); if (index < vec->len) { memmove ((char *)p + sz, p, vec->elem_size * (vec->len - index)); } vec->len += count; if (first) { memcpy (p, first, sz); } return p; }
R_API void r_vector_pop(RVector *vec, void *into) { if (into) { r_vector_assign (vec, into, r_vector_index_ptr (vec, vec->len - 1)); } vec->len--; }