diff options
| author | Tucker Evans <tucker@tuckerevans.com> | 2020-02-21 16:20:20 -0500 | 
|---|---|---|
| committer | Tucker Evans <tucker@tuckerevans.com> | 2020-02-21 16:20:20 -0500 | 
| commit | be15781d892efb5ed3cecac1d2e97242cc6d2f98 (patch) | |
| tree | 1161a1831cfee2672f0514e90ed5ea2151e78434 /collections | |
| parent | 94977303d50343f98a8bc9fcec0ab77a7e111597 (diff) | |
Fix rename double ended queue files
Also add gitignore.
Diffstat (limited to 'collections')
| -rw-r--r-- | collections/double_ended_queue.c | 162 | ||||
| -rw-r--r-- | collections/double_ended_queue.h | 16 | 
2 files changed, 178 insertions, 0 deletions
| diff --git a/collections/double_ended_queue.c b/collections/double_ended_queue.c new file mode 100644 index 0000000..76856f2 --- /dev/null +++ b/collections/double_ended_queue.c @@ -0,0 +1,162 @@ +#include "vector.h" + +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include <stdio.h> + +#define START_SIZE 64; + +struct vector { +	void **base, **new, **ptr; +	int i, limit; +}; + +vec* vec_new() +{ +	vec *root; + +	root = malloc(sizeof(vec)); +	assert(root); + +	root->limit = START_SIZE; +	root->base = root->new = root->ptr = malloc(root->limit * sizeof(void*)); +	assert(root->base); + +	return root; +} + +vec* vec_with_capacity(n) +int n; +{ +	vec *root; + +	root = malloc(sizeof(vec)); +	assert(root); + +	root->limit = n; +	root->base = root->new = root->ptr = malloc(root->limit * sizeof(void*)); +	assert(root->base); + +	return root; +} + +int vec_size(root) +vec *root; +{ +	if (!root) { +		return -1; +	} +	return (root->new - root->ptr); +} + +void vec_resize(root) +vec *root; +{ +	if (root->ptr != root->base) { +		memmove(root->base, root->ptr, root->new - root->ptr); +		root->new = root->base + vec_size(root); +		root->ptr = root->base; +	} else { +		root->base = malloc(root->limit * 2 * sizeof(void*)); +		assert(root->base); + + +		root->base = memcpy(root->base, root->ptr, root->limit * sizeof(void*)); +		assert(root->base); + + +		root->new = root->base + vec_size(root); +		root->limit = root->limit * 2; + +		free(root->ptr); +		root->ptr = root->base; +	} +} + +void vec_push(root, item) +vec *root; +void *item; +{ +	if (!root) { +		return; +	} +	if (root->new == root->base + root->limit) { +		vec_resize(root); +	} + +	*(root->new++) = item; +} + +void* vec_rmfirst(root) +vec *root; +{ +	void* tmp; +	if (!root || root->ptr == root->new) { +		return NULL; +	} + +	return tmp = *(root->ptr++); +} + +void* vec_index(root, index) +vec *root; +int index; +{ +	if (!root || root->ptr + index >= root->new) { +		return NULL; +	} + +	return root->ptr[index]; +} + +void* vec_pop(root) +vec *root; +{ +	void* tmp; +	if (!root || root->new == root->ptr) { +		return NULL; +	} + +	return tmp = *(--root->new); +} + +void vec_free(root) +vec *root; +{ +	free(root->base); +	root->base = NULL; +	root->new = NULL; +	root->ptr = NULL; + +	free(root); +} + +void vec_print(root) +vec *root; +{ +	void **tmp; + +	fprintf(stderr, "VEC[b: %p, p: %p, n:%p]:\n\t ", +			root->base, root->ptr, root->new); +	for (tmp = root->ptr; tmp < root->new; tmp++){ +		fprintf(stderr, "[%p]", *tmp); +	} +	fprintf(stderr, "\n"); +} + +vec* vec_cp(root) +vec *root; +{ +	vec *copy; + +	copy = vec_with_capacity(root->limit); + +	copy->base = memcpy(copy->base, root->ptr, +			vec_size(root) * sizeof(void*)); +	assert(copy->base); + +	copy->ptr = copy->base; +	copy->new = copy->base + vec_size(root); +} diff --git a/collections/double_ended_queue.h b/collections/double_ended_queue.h new file mode 100644 index 0000000..0c7bdce --- /dev/null +++ b/collections/double_ended_queue.h @@ -0,0 +1,16 @@ +#ifndef VECTOR_H +#define VECTOR_H + +typedef struct vector vec; + +vec* vec_new(); +vec* vec_with_capacity(int); +int vec_size(vec*); +void vec_push(vec*, void*); +void* vec_rmfirst(vec*); +void* vec_index(vec*, int); +void vec_free(vec*); +void* vec_pop(vec*); +void vec_print(vec*); +vec* vec_cp(vec*); +#endif | 
