diff --git a/configure.ac b/configure.ac
index 2384ab8..ac723b6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -72,6 +72,7 @@ AC_CONFIG_FILES([Makefile
src/Makefile
src/cbuf/Makefile
src/hash/Makefile
+ src/list/Makefile
src/queue/Makefile
src/tree/Makefile
src/dynarray/Makefile
diff --git a/include/Makefile.am b/include/Makefile.am
index fca79c9..e4a0206 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -2,6 +2,7 @@ nobase_include_HEADERS = trdata.h \
tr/cbuf.h \
tr/hash.h \
tr/hash_value.h \
+ tr/list.h \
tr/queue.h \
tr/tree.h \
tr/dynarray.h \
diff --git a/include/tr/list.h b/include/tr/list.h
new file mode 100644
index 0000000..faa1ecc
--- /dev/null
+++ b/include/tr/list.h
@@ -0,0 +1,56 @@
+/**
+ * \file
+ * Holds requests ready for processing.
+ *
+ * \todo change this to a real queue.
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef __TR_LIST_H__
+#define __TR_LIST_H__
+
+#include
+
+#include "trbase.h"
+
+
+TR_CLASS(TR_List) {
+ size_t size;
+ size_t start;
+ size_t end;
+ void ** data;
+ int free_msgs;
+};
+TR_INSTANCE_INIT(TR_List);
+TR_CLASSVARS_DECL(TR_List) {};
+
+void TR_listPut(TR_List, void *);
+void TR_listPutFirst(TR_List, void *);
+void * TR_listGet(TR_List);
+void * TR_listGetFirst(TR_List);
+
+#define TR_listEmpty(this) (this->start == this->end)
+#define TR_listFirst(this) ((this)->start)
+#define TR_listLast(this) ((this)->end - 1)
+#define TR_listSize(this) ((this)->size)
+
+#endif // __TR_LIST_H__
+
+// vim: set ts=4 sw=4:
diff --git a/include/tr/queue.h b/include/tr/queue.h
index 19ff11c..893d1a5 100644
--- a/include/tr/queue.h
+++ b/include/tr/queue.h
@@ -29,26 +29,22 @@
#include
#include "trbase.h"
+#include "tr/list.h"
TR_CLASS(TR_Queue) {
- size_t size;
- size_t start;
- size_t end;
- void ** data;
- int free_msgs;
+ TR_EXTENDS(TR_List);
};
TR_INSTANCE_INIT(TR_Queue);
TR_CLASSVARS_DECL(TR_Queue) {};
-void TR_queuePut(TR_Queue, void *);
-void TR_queuePutFirst(TR_Queue, void *);
-void * TR_queueGet(TR_Queue);
-#define TR_queueEmpty(this) (this->start == this->end)
-#define TR_queueFirst(this) ((this)->start)
-#define TR_queueLast(this) ((this)->end - 1)
-#define TR_queueSize(this) ((this)->size)
+#define TR_queueEmpty(this) (TR_listEmpty(((TR_List)(this))))
+#define TR_queueSize(this) (TR_listSize(((TR_List)(this))))
+#define TR_queuePut(this, data) (TR_listPut(((TR_List)(this)), (data)))
+#define TR_queuePutFirst(this, data) \
+ (TR_listPutFirst(((TR_List)(this)), (data)))
+#define TR_queueGet(this) (TR_listGetFirst(((TR_List)(this))))
#endif // __TR_QUEUE_H__
diff --git a/include/trdata.h b/include/trdata.h
index 98887fb..d434332 100644
--- a/include/trdata.h
+++ b/include/trdata.h
@@ -4,6 +4,7 @@
#include "tr/cbuf.h"
#include "tr/hash.h"
#include "tr/hash_value.h"
+#include "tr/list.h"
#include "tr/queue.h"
#include "tr/tree.h"
#include "tr/dynarray.h"
diff --git a/src/Makefile.am b/src/Makefile.am
index 5dc19a6..4626ec9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,6 +6,7 @@ AM_LDFLAGS +=
TRDATALIBS = cbuf/libcbuf.la \
hash/libhash.la \
+ list/liblist.la \
queue/libqueue.la \
tree/libtree.la \
dynarray/libdynarray.la \
@@ -18,4 +19,4 @@ libtrdata_la_CFLAGS = $(AM_CFLAGS)
libtrdata_la_LIBADD = $(TRDATALIBS)
libtrdata_la_LDFLAGS = -version-info 0:0:0 $(AM_LDFLAGS)
-SUBDIRS = cbuf hash queue tree dynarray heap
+SUBDIRS = cbuf hash list queue tree dynarray heap
diff --git a/src/list/Makefile.am b/src/list/Makefile.am
new file mode 100644
index 0000000..75c21b8
--- /dev/null
+++ b/src/list/Makefile.am
@@ -0,0 +1,17 @@
+ACLOCAL_AMFLAGS = -I m4
+AUTOMAKE_OPTIONS = subdir-objects
+
+AM_CFLAGS += -I../../include/ -std=c99
+AM_LDFLAGS +=
+
+LIST = list.c \
+ get.c \
+ get_first.c \
+ put.c \
+ put_first.c
+
+noinst_LTLIBRARIES = liblist.la
+
+liblist_la_SOURCES = $(LIST)
+liblist_la_CFLAGS = $(AM_CFLAGS)
+liblist_la_LIBADD = $(AM_LDFLAGS)
diff --git a/src/queue/put.c b/src/list/_resize.h
similarity index 70%
rename from src/queue/put.c
rename to src/list/_resize.h
index bb07785..f0fbd9b 100644
--- a/src/queue/put.c
+++ b/src/list/_resize.h
@@ -19,14 +19,15 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+#ifndef __TR_LIST_RESIZE_H__
+#define __TR_LIST_RESIZE_H__
#include "trbase.h"
-#include "tr/queue.h"
+#include "tr/list.h"
-static
inline
void
-_TR_queueResize(TR_Queue this, size_t split)
+_TR_listResize(TR_List this, size_t split)
{
#define VPSIZE(elem) ((elem) * sizeof(void*))
@@ -46,28 +47,6 @@ _TR_queueResize(TR_Queue this, size_t split)
this->data = new;
}
-void
-TR_queuePutFirst(TR_Queue this, void * msg)
-{
- size_t next = this->start == 0 ? this->size - 1: this->start - 1;
-
- this->data[next] = msg;
- this->start = next;
-
- if (next == this->end) {
- _TR_queueResize(this, this->end);
- }
-}
-
-void
-TR_queuePut(TR_Queue this, void * msg)
-{
- this->data[this->end] = msg;
- this->end = this->end + 1 == this->size ? 0 : this->end + 1;
-
- if (this->end == this->start) {
- _TR_queueResize(this, this->end);
- }
-}
+#endif // __TR_LIST_RESIZE_H__
// vim: set ts=4 sw=4:
diff --git a/src/queue/get.c b/src/list/get.c
similarity index 82%
rename from src/queue/get.c
rename to src/list/get.c
index f115ac8..0d4f537 100644
--- a/src/queue/get.c
+++ b/src/list/get.c
@@ -21,19 +21,19 @@
*/
#include "trbase.h"
-#include "tr/queue.h"
+#include "tr/list.h"
void *
-TR_queueGet(TR_Queue this)
+TR_listGet(TR_List this)
{
void * retval;
- if (TR_queueEmpty(this)) {
+ if (TR_listEmpty(this)) {
return NULL;
}
- retval = this->data[this->start];
- this->start = this->start + 1 == this->size ? 0 : this->start + 1;
+ retval = this->data[this->end];
+ this->end = this->end == 0 ? this->size - 1 : this->end - 1;
return retval;
}
diff --git a/src/list/get_first.c b/src/list/get_first.c
new file mode 100644
index 0000000..cca2316
--- /dev/null
+++ b/src/list/get_first.c
@@ -0,0 +1,41 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "trbase.h"
+#include "tr/list.h"
+
+void *
+TR_listGetFirst(TR_List this)
+{
+ void * retval;
+
+ if (TR_listEmpty(this)) {
+ return NULL;
+ }
+
+ retval = this->data[this->start];
+ this->start = this->start + 1 == this->size ? 0 : this->start + 1;
+
+ return retval;
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/list/list.c b/src/list/list.c
new file mode 100644
index 0000000..5a2cbcf
--- /dev/null
+++ b/src/list/list.c
@@ -0,0 +1,66 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+
+#include "trbase.h"
+#include "tr/list.h"
+
+static
+int
+listCtor(void * _this, va_list * params)
+{
+ TR_List this = _this;
+
+ this->data = (void **)TR_malloc(32 * sizeof(void *));
+ this->size = TR_getUsableSize(this->data) / sizeof(void *);
+ this->start = this->end = 0;
+ this->free_msgs = 1;
+
+ return 0;
+}
+
+static
+void
+listDtor(void * _this)
+{
+ TR_List this = _this;
+ size_t i;
+
+ if (this->free_msgs) {
+ for (
+ i = this->start;
+ i != this->end;
+ i = i + 1 == this->size ? 0 : i + 1) {
+ if (this->data[i]) {
+ TR_delete(this->data[i]);
+ }
+ }
+ }
+
+ TR_MEM_FREE(this->data);
+}
+
+TR_INIT_IFACE(TR_Class, listCtor, listDtor, NULL);
+TR_CREATE_CLASS(TR_List, NULL, NULL, TR_IF(TR_Class));
+
+// vim: set ts=4 sw=4:
diff --git a/src/list/put.c b/src/list/put.c
new file mode 100644
index 0000000..4dccf3c
--- /dev/null
+++ b/src/list/put.c
@@ -0,0 +1,41 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "trbase.h"
+#include "tr/list.h"
+
+#include "_resize.h"
+
+extern inline void _TR_listResize(TR_List, size_t);
+
+void
+TR_listPut(TR_List this, void * msg)
+{
+ this->data[this->end] = msg;
+ this->end = this->end + 1 == this->size ? 0 : this->end + 1;
+
+ if (this->end == this->start) {
+ _TR_listResize(this, this->end);
+ }
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/list/put_first.c b/src/list/put_first.c
new file mode 100644
index 0000000..e52bf6c
--- /dev/null
+++ b/src/list/put_first.c
@@ -0,0 +1,41 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "trbase.h"
+#include "tr/list.h"
+
+#include "_resize.h"
+
+void
+TR_listPutFirst(TR_List this, void * msg)
+{
+ size_t next = this->start == 0 ? this->size - 1: this->start - 1;
+
+ this->data[next] = msg;
+ this->start = next;
+
+ if (next == this->end) {
+ _TR_listResize(this, this->end);
+ }
+}
+
+// vim: set ts=4 sw=4:
diff --git a/src/queue/Makefile.am b/src/queue/Makefile.am
index b0c7ea3..c57ddea 100644
--- a/src/queue/Makefile.am
+++ b/src/queue/Makefile.am
@@ -4,9 +4,7 @@ AUTOMAKE_OPTIONS = subdir-objects
AM_CFLAGS += -I../../include/ -std=c99
AM_LDFLAGS +=
-QUEUE = queue.c \
- get.c \
- put.c
+QUEUE = queue.c
noinst_LTLIBRARIES = libqueue.la
diff --git a/src/queue/queue.c b/src/queue/queue.c
index 2db6eaa..c0ac314 100644
--- a/src/queue/queue.c
+++ b/src/queue/queue.c
@@ -24,18 +24,13 @@
#include "trbase.h"
#include "tr/queue.h"
+#include "tr/list.h"
static
int
queueCtor(void * _this, va_list * params)
{
- TR_Queue this = _this;
-
- this->data = (void **)TR_malloc(32 * sizeof(void *));
- this->size = TR_getUsableSize(this->data) / sizeof(void *);
- this->start = this->end = 0;
- this->free_msgs = 1;
-
+ TR_PARENTCALL(TR_Queue, _this, TR_Class, ctor, params);
return 0;
}
@@ -43,24 +38,10 @@ static
void
queueDtor(void * _this)
{
- TR_Queue this = _this;
- size_t i;
-
- if (this->free_msgs) {
- for (
- i = this->start;
- i != this->end;
- i = i + 1 == this->size ? 0 : i + 1) {
- if (this->data[i]) {
- TR_delete(this->data[i]);
- }
- }
- }
-
- TR_MEM_FREE(this->data);
+ TR_PARENTCALL(TR_Queue, _this, TR_Class, dtor);
}
TR_INIT_IFACE(TR_Class, queueCtor, queueDtor, NULL);
-TR_CREATE_CLASS(TR_Queue, NULL, NULL, TR_IF(TR_Class));
+TR_CREATE_CLASS(TR_Queue, TR_List, NULL, TR_IF(TR_Class));
// vim: set ts=4 sw=4: