⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seq.c

📁 一套接口
💻 C
字号:
static char rcsid[] = "$Id: seq.c 6 2007-01-22 00:45:22Z drhanson $";#include <stdlib.h>#include <stdarg.h>#include <string.h>#include "assert.h"#include "seq.h"#include "array.h"#include "arrayrep.h"#include "mem.h"#define T Seq_Tstruct T {	struct Array_T array;	int length;	int head;};static void expand(T seq) {	int n = seq->array.length;	Array_resize(&seq->array, 2*n);	if (seq->head > 0)		{			void **old = &((void **)seq->array.array)[seq->head];			memcpy(old+n, old, (n - seq->head)*sizeof (void *));			seq->head += n;		}}T Seq_new(int hint) {	T seq;	assert(hint >= 0);	NEW0(seq);	if (hint == 0)		hint = 16;	ArrayRep_init(&seq->array, hint, sizeof (void *),		ALLOC(hint*sizeof (void *)));	return seq;}T Seq_seq(void *x, ...) {	va_list ap;	T seq = Seq_new(0);	va_start(ap, x);	for ( ; x; x = va_arg(ap, void *))		Seq_addhi(seq, x);	va_end(ap);	return seq;}void Seq_free(T *seq) {	assert(seq && *seq);	assert((void *)*seq == (void *)&(*seq)->array);	Array_free((Array_T *)seq);}int Seq_length(T seq) {	assert(seq);	return seq->length;}void *Seq_get(T seq, int i) {	assert(seq);	assert(i >= 0 && i < seq->length);	return ((void **)seq->array.array)[	       	(seq->head + i)%seq->array.length];}void *Seq_put(T seq, int i, void *x) {	void *prev;	assert(seq);	assert(i >= 0 && i < seq->length);	prev = ((void **)seq->array.array)[	       	(seq->head + i)%seq->array.length];	((void **)seq->array.array)[		(seq->head + i)%seq->array.length] = x;	return prev;}void *Seq_remhi(T seq) {	int i;	assert(seq);	assert(seq->length > 0);	i = --seq->length;	return ((void **)seq->array.array)[	       	(seq->head + i)%seq->array.length];}void *Seq_remlo(T seq) {	int i = 0;	void *x;	assert(seq);	assert(seq->length > 0);	x = ((void **)seq->array.array)[	    	(seq->head + i)%seq->array.length];	seq->head = (seq->head + 1)%seq->array.length;	--seq->length;	return x;}void *Seq_addhi(T seq, void *x) {	int i;	assert(seq);	if (seq->length == seq->array.length)		expand(seq);	i = seq->length++;	return ((void **)seq->array.array)[	       	(seq->head + i)%seq->array.length] = x;}void *Seq_addlo(T seq, void *x) {	int i = 0;	assert(seq);	if (seq->length == seq->array.length)		expand(seq);	if (--seq->head < 0)		seq->head = seq->array.length - 1;	seq->length++;	return ((void **)seq->array.array)[	       	(seq->head + i)%seq->array.length] = x;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -