diff options
Diffstat (limited to 'collections')
| -rw-r--r-- | collections/double_ended_queue.adoc | 32 | ||||
| -rw-r--r-- | collections/double_ended_queue.c | 88 | ||||
| -rw-r--r-- | collections/double_ended_queue.h | 10 | 
3 files changed, 63 insertions, 67 deletions
| diff --git a/collections/double_ended_queue.adoc b/collections/double_ended_queue.adoc index 00c6dad..f583df3 100644 --- a/collections/double_ended_queue.adoc +++ b/collections/double_ended_queue.adoc @@ -176,9 +176,9 @@ deq_push_back(queue, NULL);  assert(deq_size(queue) == 1);  ---- -+void* deq_pop_front(deq *self)+ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Pops an item off of the front of the queue +self+. ++void deq_set(deq *self, int index, void *item)+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Sets the element at position +index+ in +self+ to +item+.  Examples  ^^^^^^^^ @@ -194,13 +194,15 @@ deq *queue = deq_new();  deq_push_back(queue, str_dup(str1));  deq_push_back(queue, str_dup(str2)); -assert(str_cmp(deq_pop_front(queue), str1) == 0); -assert(str_cmp(deq_pop_front(queue), str2) == 0); +deq_set(queue, 0, str2); + +assert(str_cmp(deq_pop_back(queue), str2) == 0); +assert(str_cmp(deq_pop_back(queue), str2) == 0);  ---- -+void* deq_pop_back(deq *self)+ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Pops an item off of the back of the queue +self+. ++void* deq_pop_front(deq *self)+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Pops an item off of the front of the queue +self+.  Examples  ^^^^^^^^ @@ -216,13 +218,13 @@ deq *queue = deq_new();  deq_push_back(queue, str_dup(str1));  deq_push_back(queue, str_dup(str2)); -assert(str_cmp(deq_pop_back(queue), str2) == 0); -assert(str_cmp(deq_pop_back(queue), str1) == 0); +assert(str_cmp(deq_pop_front(queue), str1) == 0); +assert(str_cmp(deq_pop_front(queue), str2) == 0);  ---- -+void deq_set(deq *self, int index, void *item)+ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Sets the element at position +index+ in +self+ to +item+. ++void* deq_pop_back(deq *self)+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Pops an item off of the back of the queue +self+.  Examples  ^^^^^^^^ @@ -238,10 +240,8 @@ deq *queue = deq_new();  deq_push_back(queue, str_dup(str1));  deq_push_back(queue, str_dup(str2)); -deq_set(queue, 0, str2); - -assert(str_cmp(deq_pop_back(queue), str2) == 0);  assert(str_cmp(deq_pop_back(queue), str2) == 0); +assert(str_cmp(deq_pop_back(queue), str1) == 0);  ----  +void* deq_index(deq *self, int index)+ diff --git a/collections/double_ended_queue.c b/collections/double_ended_queue.c index 7857c3a..bf329ca 100644 --- a/collections/double_ended_queue.c +++ b/collections/double_ended_queue.c @@ -111,16 +111,6 @@ deq *root;  	root->base = tmp;  } -void deq_set(root, index, item) -deq *root; -int index; -void *item; -{ -	if (!root || !DEQ_IN_BOUNDS(root, index)) -		return; -	root->base[(root->beg + index) % root->limit] = item; -} -  void* deq_index(root, index)  deq *root;  int index; @@ -133,7 +123,7 @@ int index;  	return root->base[(root->beg + index) % root->limit];  } -void deq_push_back(root, item) +void deq_push_front(root, item)  deq *root;  void *item;  { @@ -145,14 +135,16 @@ void *item;  	if (root->end >= root->limit)  		deq_resize(root); -	root->base[root->end++] = item; -	root->end %= root->limit; +	--root->beg; +	root->beg %= root->limit; + +	root->base[root->beg] = item;  	if (root->end == root->beg)  		root->end = root->limit;  } -void deq_push_front(root, item) +void deq_push_back(root, item)  deq *root;  void *item;  { @@ -164,15 +156,23 @@ void *item;  	if (root->end >= root->limit)  		deq_resize(root); -	--root->beg; -	root->beg %= root->limit; - -	root->base[root->beg] = item; +	root->base[root->end++] = item; +	root->end %= root->limit;  	if (root->end == root->beg)  		root->end = root->limit;  } +void deq_set(root, index, item) +deq *root; +int index; +void *item; +{ +	if (!root || !DEQ_IN_BOUNDS(root, index)) +		return; +	root->base[(root->beg + index) % root->limit] = item; +} +  void* deq_pop_front(root)  deq *root;  { @@ -222,6 +222,32 @@ int index;  	return deq_pop_back(root);  } +void deq_swap(root, i, j) +deq *root; +int i, j; +{ +	int len; +	void *tmp; + +	if (!root) +		return; + +	len = deq_size(root); + +	if (i >= len || j >= len) +		return; + +	i += root->beg; +	i %= root->limit; + +	j += root->beg; +	j %= root->limit; + +	tmp = root->base[i]; +	root->base[i] = root->base[j]; +	root->base[j] = tmp; +} +  void deq_remove(root, index)  deq *root;  int index; @@ -313,32 +339,6 @@ deq *root;  	return copy;  } -void deq_swap(root, i, j) -deq *root; -int i, j; -{ -	int len; -	void *tmp; - -	if (!root) -		return; - -	len = deq_size(root); - -	if (i >= len || j >= len) -		return; - -	i += root->beg; -	i %= root->limit; - -	j += root->beg; -	j %= root->limit; - -	tmp = root->base[i]; -	root->base[i] = root->base[j]; -	root->base[j] = tmp; -} -  /*Note: Does not currently reduce memory footprint*/  void deq_truncate(root, size)  deq *root; diff --git a/collections/double_ended_queue.h b/collections/double_ended_queue.h index dd476af..fac2231 100644 --- a/collections/double_ended_queue.h +++ b/collections/double_ended_queue.h @@ -22,25 +22,21 @@ void deq_clear(deq*);  /*data*/  void deq_push_front(deq*, void*);  void deq_push_back(deq*, void*); +void deq_set(deq*, int, void*);  void* deq_pop_front(deq*);  void* deq_pop_back(deq*); -void deq_set(deq*, int, void*);  void* deq_index(deq*, int); -  void* deq_front(deq*);  void* deq_back(deq*); - -void deq_swap(deq*, int, int); -  void* deq_swap_rm_front(deq*, int);  void* deq_swap_rm_back(deq*, int); +void deq_swap(deq*, int, int); +  /*Note: Does not currently reduce memory footprint*/  void deq_truncate(deq*, int); -  void deq_remove(deq*, int); -  void deq_print(deq*, char* (void*)); | 
