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: