diff TaskQueue.c @ 0:5b089096921f

first commit.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 18 Dec 2009 21:57:05 +0900
parents
children 803d6bf22e6d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskQueue.c	Fri Dec 18 21:57:05 2009 +0900
@@ -0,0 +1,92 @@
+#include"TaskList.h"
+
+typedef struct _TaskQueue {
+	TaskList *head;
+	TaskList *tail;
+	int length;
+} TaskQueue;
+
+TaskQueue *
+newTaskQueue()
+{
+	TaskQueue *queue;
+	/* TODO: mallocはあとで独自実装に書き直し!  */
+	malloc(sizeof(struct _TaskQueue));
+	queue->head = NULL;
+	queue->tail = NULL;
+	queue->length = 0;
+	return queue;
+}
+
+void
+queueAddFirst(TaskQueue *queue, Task *)
+{
+	TaskList *oldhead = queue->head;
+	TaskList *newlist;
+	newlist = malloc(sizeof(struct _TaskList));
+
+	if (oldhead) {
+		oldhead->prev = newlist;
+	}
+	newlist->next = oldhead;
+	newlist->prev = NULL;
+	queue->head = newlist;
+	queue->length++;
+	return ;
+}
+
+void
+queueAddLast(TaskQueue *queue, Task *task)
+{
+	TaskList *oldtail = queue->tail;
+	TaskList *newlist;
+	newlist = malloc(sizeof(struct _TaskList));
+
+	if (oldtail) {
+		oldtail->next = newlist;
+	}
+	newlist->next = NULL;
+	newlist->prev = oldtail;
+	queue->tail = newlist;
+	queue->length++;
+	return ;
+}
+
+Task *
+queuePollFirst(TaskQueue *queue)
+{
+	TaskList *first = queue->head;
+	TaskList *second;
+	Task *task;
+	if (!first) return NULL;
+
+	second = first->next;
+	task = first->task;
+	free(first);
+
+	second->prev = NULL;
+	queue->head = second;
+	queue->length--;
+	return task;
+}
+
+Task *
+queuePollLast(TaskQueue *queue)
+{
+	TaskList *first = queue->tail;
+	TaskList *second;
+	Task *task;
+	if (!first) return NULL;
+
+	second = first->prev;
+	task = first->task;
+	free(first);
+
+	second->next = NULL;
+	queue->tail = second;
+	queue->length--;
+	return task;
+}
+
+
+