enhanced dll
This commit is contained in:
@ -7,7 +7,7 @@ libqsecmn_la_SOURCES = \
|
||||
syscall.h mem.h \
|
||||
mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
|
||||
str_bas.c str_cnv.c str_dyn.c str_utl.c \
|
||||
lda.c htb.c rbt.c sll.c dll.c opt.c \
|
||||
lda.c htb.c rbt.c sll.c gdl.c dll.c opt.c \
|
||||
tio.c tio_get.c tio_put.c \
|
||||
fio.c pio.c sio.c \
|
||||
time.c \
|
||||
|
@ -75,7 +75,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsecmn_la_DEPENDENCIES =
|
||||
am_libqsecmn_la_OBJECTS = mem.lo xma.lo fma.lo chr.lo chr_cnv.lo \
|
||||
rex.lo str_bas.lo str_cnv.lo str_dyn.lo str_utl.lo lda.lo \
|
||||
htb.lo rbt.lo sll.lo dll.lo opt.lo tio.lo tio_get.lo \
|
||||
htb.lo rbt.lo sll.lo gdl.lo dll.lo opt.lo tio.lo tio_get.lo \
|
||||
tio_put.lo fio.lo pio.lo sio.lo time.lo misc.lo assert.lo \
|
||||
main.lo stdio.lo
|
||||
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
|
||||
@ -264,7 +264,7 @@ libqsecmn_la_SOURCES = \
|
||||
syscall.h mem.h \
|
||||
mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
|
||||
str_bas.c str_cnv.c str_dyn.c str_utl.c \
|
||||
lda.c htb.c rbt.c sll.c dll.c opt.c \
|
||||
lda.c htb.c rbt.c sll.c gdl.c dll.c opt.c \
|
||||
tio.c tio_get.c tio_put.c \
|
||||
fio.c pio.c sio.c \
|
||||
time.c \
|
||||
@ -363,6 +363,7 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dll.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fio.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fma.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Plo@am__quote@
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: dll.c 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
||||
* $Id: dll.c 354 2010-09-03 12:50:08Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -21,7 +21,31 @@
|
||||
#include <qse/cmn/dll.h>
|
||||
#include "mem.h"
|
||||
|
||||
qse_dll_t* qse_dll_open (qse_mmgr_t* mmgr, qse_size_t ext)
|
||||
QSE_IMPLEMENT_COMMON_FUNCTIONS (dll)
|
||||
|
||||
#define TOB(dll,len) ((len)*(dll)->scale)
|
||||
|
||||
static int default_comper (
|
||||
qse_dll_t* dll,
|
||||
const void* dptr1, size_t dlen1,
|
||||
const void* dptr2, size_t dlen2)
|
||||
{
|
||||
if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(dll,dlen1));
|
||||
/* it just returns 1 to indicate that they are different. */
|
||||
return 1;
|
||||
|
||||
#if 0
|
||||
qse_size_t min = (dlen1 < dlen2)? dlen1: dlen2;
|
||||
int n = QSE_MEMCMP (dptr1, dptr2, TOB(dll,min));
|
||||
if (n == 0 && dlen1 != dlen2)
|
||||
{
|
||||
n = (dlen1 > dlen2)? 1: -1;
|
||||
}
|
||||
return n;
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_dll_t* qse_dll_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
||||
{
|
||||
qse_dll_t* dll;
|
||||
|
||||
@ -35,56 +59,60 @@ qse_dll_t* qse_dll_open (qse_mmgr_t* mmgr, qse_size_t ext)
|
||||
if (mmgr == QSE_NULL) return QSE_NULL;
|
||||
}
|
||||
|
||||
dll = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_dll_t) + ext);
|
||||
dll = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_dll_t) + xtnsize);
|
||||
if (dll == QSE_NULL) return QSE_NULL;
|
||||
|
||||
/* do not zero the extension */
|
||||
QSE_MEMSET (dll, 0, QSE_SIZEOF(qse_dll_t));
|
||||
dll->mmgr = mmgr;
|
||||
if (qse_dll_init (dll, mmgr) == QSE_NULL)
|
||||
{
|
||||
QSE_MMGR_FREE (mmgr, dll);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
return dll;
|
||||
}
|
||||
|
||||
void qse_dll_close (qse_dll_t* dll)
|
||||
{
|
||||
qse_dll_clear (dll);
|
||||
qse_dll_fini (dll);
|
||||
QSE_MMGR_FREE (dll->mmgr, dll);
|
||||
}
|
||||
|
||||
void qse_dll_clear (qse_dll_t* dll)
|
||||
qse_dll_t* qse_dll_init (qse_dll_t* dll, qse_mmgr_t* mmgr)
|
||||
{
|
||||
while (dll->head != QSE_NULL) qse_dll_delete (dll, dll->head);
|
||||
QSE_ASSERT (dll->tail == QSE_NULL);
|
||||
}
|
||||
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
|
||||
|
||||
void* qse_dll_getxtn (qse_dll_t* dll)
|
||||
{
|
||||
return dll + 1;
|
||||
}
|
||||
/* do not zero out the xtnsizeension */
|
||||
QSE_MEMSET (dll, 0, QSE_SIZEOF(*dll));
|
||||
|
||||
qse_mmgr_t* qse_dll_getmmgr (qse_dll_t* dll)
|
||||
{
|
||||
return dll->mmgr;
|
||||
}
|
||||
|
||||
void qse_dll_setmmgr (qse_dll_t* dll, qse_mmgr_t* mmgr)
|
||||
{
|
||||
dll->mmgr = mmgr;
|
||||
dll->scale = 1;
|
||||
|
||||
dll->comper = default_comper;
|
||||
dll->copier = QSE_DLL_COPIER_SIMPLE;
|
||||
|
||||
QSE_DLL_INIT (dll);
|
||||
return dll;
|
||||
}
|
||||
|
||||
qse_size_t qse_dll_getsize (qse_dll_t* dll)
|
||||
void qse_dll_fini (qse_dll_t* dll)
|
||||
{
|
||||
return dll->size;
|
||||
qse_dll_clear (dll);
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_gethead (qse_dll_t* dll)
|
||||
int qse_dll_getscale (qse_dll_t* dll)
|
||||
{
|
||||
return dll->head;
|
||||
return dll->scale;
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_gettail (qse_dll_t* dll)
|
||||
void qse_dll_setscale (qse_dll_t* dll, int scale)
|
||||
{
|
||||
return dll->tail;
|
||||
QSE_ASSERTX (scale > 0 && scale <= QSE_TYPE_MAX(qse_byte_t),
|
||||
"The scale should be larger than 0 and less than or equal to the maximum value that the qse_byte_t type can hold");
|
||||
|
||||
if (scale <= 0) scale = 1;
|
||||
if (scale > QSE_TYPE_MAX(qse_byte_t)) scale = QSE_TYPE_MAX(qse_byte_t);
|
||||
|
||||
dll->scale = scale;
|
||||
}
|
||||
|
||||
qse_dll_copier_t qse_dll_getcopier (qse_dll_t* dll)
|
||||
@ -94,6 +122,7 @@ qse_dll_copier_t qse_dll_getcopier (qse_dll_t* dll)
|
||||
|
||||
void qse_dll_setcopier (qse_dll_t* dll, qse_dll_copier_t copier)
|
||||
{
|
||||
if (copier == QSE_NULL) copier = QSE_DLL_COPIER_SIMPLE;
|
||||
dll->copier = copier;
|
||||
}
|
||||
|
||||
@ -107,11 +136,37 @@ void qse_dll_setfreeer (qse_dll_t* dll, qse_dll_freeer_t freeer)
|
||||
dll->freeer = freeer;
|
||||
}
|
||||
|
||||
qse_dll_comper_t qse_dll_getcomper (qse_dll_t* dll)
|
||||
{
|
||||
return dll->comper;
|
||||
}
|
||||
|
||||
void qse_dll_setcomper (qse_dll_t* dll, qse_dll_comper_t comper)
|
||||
{
|
||||
if (comper == QSE_NULL) comper = default_comper;
|
||||
dll->comper = comper;
|
||||
}
|
||||
|
||||
qse_size_t qse_dll_getsize (qse_dll_t* dll)
|
||||
{
|
||||
return QSE_DLL_SIZE(dll);
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_gethead (qse_dll_t* dll)
|
||||
{
|
||||
return QSE_DLL_HEAD(dll);
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_gettail (qse_dll_t* dll)
|
||||
{
|
||||
return QSE_DLL_TAIL(dll);
|
||||
}
|
||||
|
||||
static qse_dll_node_t* alloc_node (qse_dll_t* dll, void* dptr, qse_size_t dlen)
|
||||
{
|
||||
qse_dll_node_t* n;
|
||||
|
||||
if (dll->copier == QSE_NULL)
|
||||
if (dll->copier == QSE_DLL_COPIER_SIMPLE)
|
||||
{
|
||||
n = QSE_MMGR_ALLOC (dll->mmgr, QSE_SIZEOF(qse_dll_node_t));
|
||||
if (n == QSE_NULL) return QSE_NULL;
|
||||
@ -119,10 +174,11 @@ static qse_dll_node_t* alloc_node (qse_dll_t* dll, void* dptr, qse_size_t dlen)
|
||||
}
|
||||
else if (dll->copier == QSE_DLL_COPIER_INLINE)
|
||||
{
|
||||
n = QSE_MMGR_ALLOC (dll->mmgr, QSE_SIZEOF(qse_dll_node_t) + dlen);
|
||||
n = QSE_MMGR_ALLOC (dll->mmgr,
|
||||
QSE_SIZEOF(qse_dll_node_t) + TOB(dll,dlen));
|
||||
if (n == QSE_NULL) return QSE_NULL;
|
||||
|
||||
QSE_MEMCPY (n + 1, dptr, dlen);
|
||||
QSE_MEMCPY (n + 1, dptr, TOB(dll,dlen));
|
||||
n->dptr = n + 1;
|
||||
}
|
||||
else
|
||||
@ -138,51 +194,132 @@ static qse_dll_node_t* alloc_node (qse_dll_t* dll, void* dptr, qse_size_t dlen)
|
||||
}
|
||||
|
||||
n->dlen = dlen;
|
||||
n->next = QSE_NULL;
|
||||
n->prev = QSE_NULL;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static QSE_INLINE void free_node (qse_dll_t* dll, qse_dll_node_t* node)
|
||||
{
|
||||
if (dll->freeer != QSE_NULL)
|
||||
{
|
||||
/* free the actual data */
|
||||
dll->freeer (dll, node->dptr, node->dlen);
|
||||
}
|
||||
|
||||
/* free the node */
|
||||
QSE_MMGR_FREE (dll->mmgr, node);
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_search (
|
||||
qse_dll_t* dll, qse_dll_node_t* pos, const void* dptr, qse_size_t dlen)
|
||||
{
|
||||
if (pos == QSE_NULL) pos = QSE_DLL_HEAD(dll);
|
||||
|
||||
while (QSE_DLL_ISMEMBER(dll,pos))
|
||||
{
|
||||
if (dll->comper (dll, pos->dptr, pos->dlen, dptr, dlen) == 0)
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
pos = pos->next;
|
||||
}
|
||||
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_rsearch (
|
||||
qse_dll_t* dll, qse_dll_node_t* pos, const void* dptr, qse_size_t dlen)
|
||||
{
|
||||
if (pos == QSE_NULL) pos = QSE_DLL_TAIL(dll);
|
||||
|
||||
while (QSE_DLL_ISMEMBER(dll,pos))
|
||||
{
|
||||
if (dll->comper (dll, pos->dptr, pos->dlen, dptr, dlen) == 0)
|
||||
{
|
||||
return pos;
|
||||
}
|
||||
|
||||
pos = pos->prev;
|
||||
}
|
||||
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_insert (
|
||||
qse_dll_t* dll, qse_dll_node_t* pos, void* dptr, qse_size_t dlen)
|
||||
{
|
||||
qse_dll_node_t* n = alloc_node (dll, dptr, dlen);
|
||||
if (n == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (pos == QSE_NULL)
|
||||
if (n)
|
||||
{
|
||||
/* insert at the end */
|
||||
if (dll->head == QSE_NULL)
|
||||
if (pos == QSE_NULL)
|
||||
{
|
||||
QSE_ASSERT (dll->tail == QSE_NULL);
|
||||
dll->head = n;
|
||||
/* insert at the end */
|
||||
QSE_DLL_ADDTAIL (dll, n);
|
||||
}
|
||||
else dll->tail->next = n;
|
||||
|
||||
dll->tail = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* insert in front of the positional node */
|
||||
n->next = pos;
|
||||
if (pos == dll->head) dll->head = n;
|
||||
else
|
||||
{
|
||||
/* take note of performance penalty */
|
||||
qse_dll_node_t* n2 = dll->head;
|
||||
while (n2->next != pos) n2 = n2->next;
|
||||
n2->next = n;
|
||||
/* insert in front of the positional node */
|
||||
QSE_DLL_CHAIN (dll, pos->prev, n, pos);
|
||||
}
|
||||
}
|
||||
|
||||
dll->size++;
|
||||
return n;
|
||||
}
|
||||
|
||||
void qse_dll_delete (qse_dll_t* dll, qse_dll_node_t* pos)
|
||||
{
|
||||
if (pos == QSE_NULL || !QSE_DLL_ISMEMBER(dll,pos)) return;
|
||||
QSE_DLL_UNCHAIN (dll, pos);
|
||||
free_node (dll, pos);
|
||||
}
|
||||
|
||||
void qse_dll_clear (qse_dll_t* dll)
|
||||
{
|
||||
while (!QSE_DLL_ISEMPTY(dll))
|
||||
{
|
||||
qse_dll_delete (dll, QSE_DLL_HEAD(dll));
|
||||
}
|
||||
}
|
||||
|
||||
void qse_dll_walk (qse_dll_t* dll, qse_dll_walker_t walker, void* ctx)
|
||||
{
|
||||
qse_dll_node_t* n = QSE_DLL_HEAD(dll);
|
||||
qse_dll_walk_t w = QSE_DLL_WALK_FORWARD;
|
||||
|
||||
while (QSE_DLL_ISMEMBER(dll,n))
|
||||
{
|
||||
qse_dll_node_t* nxt = n->next;
|
||||
qse_dll_node_t* prv = n->prev;
|
||||
|
||||
w = walker (dll, n, ctx);
|
||||
|
||||
if (w == QSE_DLL_WALK_FORWARD) n = nxt;
|
||||
else if (w == QSE_DLL_WALK_BACKWARD) n = prv;
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
void qse_dll_rwalk (qse_dll_t* dll, qse_dll_walker_t walker, void* ctx)
|
||||
{
|
||||
qse_dll_node_t* n = QSE_DLL_TAIL(dll);
|
||||
qse_dll_walk_t w = QSE_DLL_WALK_BACKWARD;
|
||||
|
||||
while (QSE_DLL_ISMEMBER(dll,n))
|
||||
{
|
||||
qse_dll_node_t* nxt = n->next;
|
||||
qse_dll_node_t* prv = n->prev;
|
||||
|
||||
w = walker (dll, n, ctx);
|
||||
|
||||
if (w == QSE_DLL_WALK_FORWARD) n = nxt;
|
||||
else if (w == QSE_DLL_WALK_BACKWARD) n = prv;
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_pushhead (qse_dll_t* dll, void* data, qse_size_t size)
|
||||
{
|
||||
return qse_dll_insert (dll, dll->head, data, size);
|
||||
return qse_dll_insert (dll, QSE_DLL_HEAD(dll), data, size);
|
||||
}
|
||||
|
||||
qse_dll_node_t* qse_dll_pushtail (qse_dll_t* dll, void* data, qse_size_t size)
|
||||
@ -190,67 +327,16 @@ qse_dll_node_t* qse_dll_pushtail (qse_dll_t* dll, void* data, qse_size_t size)
|
||||
return qse_dll_insert (dll, QSE_NULL, data, size);
|
||||
}
|
||||
|
||||
void qse_dll_delete (qse_dll_t* dll, qse_dll_node_t* pos)
|
||||
{
|
||||
if (pos == QSE_NULL) return; /* not a valid node */
|
||||
|
||||
if (pos == dll->head)
|
||||
{
|
||||
/* it is simple to delete the head node */
|
||||
dll->head = pos->next;
|
||||
if (dll->head == QSE_NULL) dll->tail = QSE_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* but deletion of other nodes has significant performance
|
||||
* penalty as it has look for the predecessor of the
|
||||
* target node */
|
||||
qse_dll_node_t* n2 = dll->head;
|
||||
while (n2->next != pos) n2 = n2->next;
|
||||
|
||||
n2->next = pos->next;
|
||||
|
||||
/* update the tail node if necessary */
|
||||
if (pos == dll->tail) dll->tail = n2;
|
||||
}
|
||||
|
||||
if (dll->freeer != QSE_NULL)
|
||||
{
|
||||
/* free the actual data */
|
||||
dll->freeer (dll, pos->dptr, pos->dlen);
|
||||
}
|
||||
|
||||
/* free the node */
|
||||
QSE_MMGR_FREE (dll->mmgr, pos);
|
||||
|
||||
/* decrement the number of elements */
|
||||
dll->size--;
|
||||
}
|
||||
|
||||
void qse_dll_pophead (qse_dll_t* dll)
|
||||
{
|
||||
qse_dll_delete (dll, dll->head);
|
||||
QSE_ASSERT (!QSE_DLL_ISEMPTY(dll));
|
||||
QSE_DLL_DELHEAD (dll);
|
||||
}
|
||||
|
||||
void qse_dll_poptail (qse_dll_t* dll)
|
||||
{
|
||||
qse_dll_delete (dll, dll->tail);
|
||||
QSE_ASSERT (!QSE_DLL_ISEMPTY(dll));
|
||||
QSE_DLL_DELTAIL (dll);
|
||||
}
|
||||
|
||||
void qse_dll_walk (qse_dll_t* dll, qse_dll_walker_t walker, void* arg)
|
||||
{
|
||||
qse_dll_node_t* n = dll->head;
|
||||
|
||||
while (n != QSE_NULL)
|
||||
{
|
||||
if (walker(dll,n,arg) == QSE_DLL_WALK_STOP) return;
|
||||
n = n->next;
|
||||
}
|
||||
}
|
||||
|
||||
void* qse_dll_copyinline (qse_dll_t* dll, void* dptr, qse_size_t dlen)
|
||||
{
|
||||
/* this is a dummy copier */
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
|
33
qse/lib/cmn/gdl.c
Normal file
33
qse/lib/cmn/gdl.c
Normal file
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
|
||||
QSE is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
QSE 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <qse/cmn/gdl.h>
|
||||
|
||||
void qse_gdl_chain (qse_gdl_t* p, qse_gdl_t* x, qse_gdl_t* n)
|
||||
{
|
||||
x->prev = p; x->next = n; n->prev = x; p->next = x;
|
||||
}
|
||||
|
||||
void qse_gdl_unchain (qse_gdl_t* x)
|
||||
{
|
||||
qse_gdl_t* p = x->prev;
|
||||
qse_gdl_t* n = x->next;
|
||||
n->prev = p; p->next = n;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: lda.c 348 2010-08-26 06:26:28Z hyunghwan.chung $
|
||||
* $Id: lda.c 354 2010-09-03 12:50:08Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -207,22 +207,22 @@ void qse_lda_setcomper (lda_t* lda, comper_t comper)
|
||||
|
||||
keeper_t qse_lda_getkeeper (lda_t* lda)
|
||||
{
|
||||
return lda->keeper;
|
||||
return lda->keeper;
|
||||
}
|
||||
|
||||
void qse_lda_setkeeper (lda_t* lda, keeper_t keeper)
|
||||
{
|
||||
lda->keeper = keeper;
|
||||
lda->keeper = keeper;
|
||||
}
|
||||
|
||||
sizer_t qse_lda_getsizer (lda_t* lda)
|
||||
{
|
||||
return lda->sizer;
|
||||
return lda->sizer;
|
||||
}
|
||||
|
||||
void qse_lda_setsizer (lda_t* lda, sizer_t sizer)
|
||||
{
|
||||
lda->sizer = sizer;
|
||||
lda->sizer = sizer;
|
||||
}
|
||||
|
||||
size_t qse_lda_getsize (lda_t* lda)
|
||||
@ -527,7 +527,7 @@ size_t qse_lda_walk (lda_t* lda, walker_t walker, void* ctx)
|
||||
{
|
||||
if (lda->node[i] != QSE_NULL)
|
||||
{
|
||||
w = walker (lda, i, ctx);
|
||||
w = walker (lda, i, ctx);
|
||||
nwalks++;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sll.c 348 2010-08-26 06:26:28Z hyunghwan.chung $
|
||||
* $Id: sll.c 354 2010-09-03 12:50:08Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -44,13 +44,23 @@ QSE_IMPLEMENT_COMMON_FUNCTIONS (sll)
|
||||
#define size_t qse_size_t
|
||||
#define mmgr_t qse_mmgr_t
|
||||
|
||||
static int comp_data (sll_t* sll,
|
||||
static int default_comper (sll_t* sll,
|
||||
const void* dptr1, size_t dlen1,
|
||||
const void* dptr2, size_t dlen2)
|
||||
{
|
||||
if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(sll,dlen1));
|
||||
/* it just returns 1 to indicate that they are different. */
|
||||
return 1;
|
||||
|
||||
#if 0
|
||||
size_t min = (dlen1 < dlen2)? dlen1: dlen2;
|
||||
int n = QSE_MEMCMP (dptr1, dptr2, TOB(sll,min));
|
||||
if (n == 0 && dlen1 != dlen2)
|
||||
{
|
||||
n = (dlen1 > dlen2)? 1: -1;
|
||||
}
|
||||
return n;
|
||||
#endif
|
||||
}
|
||||
|
||||
static node_t* alloc_node (sll_t* sll, void* dptr, size_t dlen)
|
||||
@ -133,7 +143,7 @@ sll_t* qse_sll_init (sll_t* sll, mmgr_t* mmgr)
|
||||
sll->size = 0;
|
||||
sll->scale = 1;
|
||||
|
||||
sll->comper = comp_data;
|
||||
sll->comper = default_comper;
|
||||
sll->copier = QSE_SLL_COPIER_SIMPLE;
|
||||
return sll;
|
||||
}
|
||||
@ -187,7 +197,7 @@ comper_t qse_sll_getcomper (sll_t* sll)
|
||||
|
||||
void qse_sll_setcomper (sll_t* sll, comper_t comper)
|
||||
{
|
||||
if (comper == QSE_NULL) comper = comp_data;
|
||||
if (comper == QSE_NULL) comper = default_comper;
|
||||
sll->comper = comper;
|
||||
}
|
||||
|
||||
@ -301,6 +311,18 @@ void qse_sll_clear (sll_t* sll)
|
||||
QSE_ASSERT (TAIL(sll) == QSE_NULL);
|
||||
}
|
||||
|
||||
void qse_sll_walk (sll_t* sll, walker_t walker, void* ctx)
|
||||
{
|
||||
node_t* n = HEAD(sll);
|
||||
|
||||
while (n != QSE_NULL)
|
||||
{
|
||||
qse_sll_node_t* nxt = NEXT(n);
|
||||
if (walker(sll,n,ctx) == QSE_SLL_WALK_STOP) return;
|
||||
n = nxt;
|
||||
}
|
||||
}
|
||||
|
||||
node_t* qse_sll_pushhead (sll_t* sll, void* data, size_t size)
|
||||
{
|
||||
return qse_sll_insert (sll, HEAD(sll), data, size);
|
||||
@ -321,14 +343,4 @@ void qse_sll_poptail (sll_t* sll)
|
||||
qse_sll_delete (sll, TAIL(sll));
|
||||
}
|
||||
|
||||
void qse_sll_walk (sll_t* sll, walker_t walker, void* ctx)
|
||||
{
|
||||
node_t* n = HEAD(sll);
|
||||
|
||||
while (n != QSE_NULL)
|
||||
{
|
||||
if (walker(sll,n,ctx) == QSE_SLL_WALK_STOP) return;
|
||||
n = NEXT(n);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user