added open-addressed hash table
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/include -DNDEBUG
|
||||
|
||||
bin_PROGRAMS = xma fma chr str sll dll lda htb rbt fio pio sio time main rex01
|
||||
bin_PROGRAMS = xma fma chr str sll dll lda oht htb rbt fio pio sio time main rex01
|
||||
|
||||
LDFLAGS = -L../../lib/cmn
|
||||
LDADD = -lqsecmn
|
||||
@ -12,6 +12,7 @@ str_SOURCES = str.c
|
||||
sll_SOURCES = sll.c
|
||||
dll_SOURCES = dll.c
|
||||
lda_SOURCES = lda.c
|
||||
oht_SOURCES = oht.c
|
||||
htb_SOURCES = htb.c
|
||||
rbt_SOURCES = rbt.c
|
||||
fio_SOURCES = fio.c
|
||||
|
@ -35,9 +35,9 @@ POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
bin_PROGRAMS = xma$(EXEEXT) fma$(EXEEXT) chr$(EXEEXT) str$(EXEEXT) \
|
||||
sll$(EXEEXT) dll$(EXEEXT) lda$(EXEEXT) htb$(EXEEXT) \
|
||||
rbt$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) sio$(EXEEXT) \
|
||||
time$(EXEEXT) main$(EXEEXT) rex01$(EXEEXT)
|
||||
sll$(EXEEXT) dll$(EXEEXT) lda$(EXEEXT) oht$(EXEEXT) \
|
||||
htb$(EXEEXT) rbt$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) \
|
||||
sio$(EXEEXT) time$(EXEEXT) main$(EXEEXT) rex01$(EXEEXT)
|
||||
subdir = samples/cmn
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
@ -82,6 +82,10 @@ am_main_OBJECTS = main.$(OBJEXT)
|
||||
main_OBJECTS = $(am_main_OBJECTS)
|
||||
main_LDADD = $(LDADD)
|
||||
main_DEPENDENCIES =
|
||||
am_oht_OBJECTS = oht.$(OBJEXT)
|
||||
oht_OBJECTS = $(am_oht_OBJECTS)
|
||||
oht_LDADD = $(LDADD)
|
||||
oht_DEPENDENCIES =
|
||||
am_pio_OBJECTS = pio.$(OBJEXT)
|
||||
pio_OBJECTS = $(am_pio_OBJECTS)
|
||||
pio_LDADD = $(LDADD)
|
||||
@ -128,13 +132,14 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
SOURCES = $(chr_SOURCES) $(dll_SOURCES) $(fio_SOURCES) $(fma_SOURCES) \
|
||||
$(htb_SOURCES) $(lda_SOURCES) $(main_SOURCES) $(pio_SOURCES) \
|
||||
$(rbt_SOURCES) $(rex01_SOURCES) $(sio_SOURCES) $(sll_SOURCES) \
|
||||
$(str_SOURCES) $(time_SOURCES) $(xma_SOURCES)
|
||||
DIST_SOURCES = $(chr_SOURCES) $(dll_SOURCES) $(fio_SOURCES) \
|
||||
$(fma_SOURCES) $(htb_SOURCES) $(lda_SOURCES) $(main_SOURCES) \
|
||||
$(htb_SOURCES) $(lda_SOURCES) $(main_SOURCES) $(oht_SOURCES) \
|
||||
$(pio_SOURCES) $(rbt_SOURCES) $(rex01_SOURCES) $(sio_SOURCES) \
|
||||
$(sll_SOURCES) $(str_SOURCES) $(time_SOURCES) $(xma_SOURCES)
|
||||
DIST_SOURCES = $(chr_SOURCES) $(dll_SOURCES) $(fio_SOURCES) \
|
||||
$(fma_SOURCES) $(htb_SOURCES) $(lda_SOURCES) $(main_SOURCES) \
|
||||
$(oht_SOURCES) $(pio_SOURCES) $(rbt_SOURCES) $(rex01_SOURCES) \
|
||||
$(sio_SOURCES) $(sll_SOURCES) $(str_SOURCES) $(time_SOURCES) \
|
||||
$(xma_SOURCES)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
@ -286,6 +291,7 @@ str_SOURCES = str.c
|
||||
sll_SOURCES = sll.c
|
||||
dll_SOURCES = dll.c
|
||||
lda_SOURCES = lda.c
|
||||
oht_SOURCES = oht.c
|
||||
htb_SOURCES = htb.c
|
||||
rbt_SOURCES = rbt.c
|
||||
fio_SOURCES = fio.c
|
||||
@ -392,6 +398,9 @@ lda$(EXEEXT): $(lda_OBJECTS) $(lda_DEPENDENCIES)
|
||||
main$(EXEEXT): $(main_OBJECTS) $(main_DEPENDENCIES)
|
||||
@rm -f main$(EXEEXT)
|
||||
$(LINK) $(main_OBJECTS) $(main_LDADD) $(LIBS)
|
||||
oht$(EXEEXT): $(oht_OBJECTS) $(oht_DEPENDENCIES)
|
||||
@rm -f oht$(EXEEXT)
|
||||
$(LINK) $(oht_OBJECTS) $(oht_LDADD) $(LIBS)
|
||||
pio$(EXEEXT): $(pio_OBJECTS) $(pio_DEPENDENCIES)
|
||||
@rm -f pio$(EXEEXT)
|
||||
$(LINK) $(pio_OBJECTS) $(pio_LDADD) $(LIBS)
|
||||
@ -430,6 +439,7 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rbt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rex01.Po@am__quote@
|
||||
|
127
qse/samples/cmn/oht.c
Normal file
127
qse/samples/cmn/oht.c
Normal file
@ -0,0 +1,127 @@
|
||||
#include <qse/cmn/mem.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/oht.h>
|
||||
#include <qse/cmn/stdio.h>
|
||||
|
||||
|
||||
#define R(f) \
|
||||
do { \
|
||||
qse_printf (QSE_T("== %s ==\n"), QSE_T(#f)); \
|
||||
if (f() == -1) return -1; \
|
||||
} while (0)
|
||||
|
||||
typedef struct item_t item_t;
|
||||
struct item_t
|
||||
{
|
||||
long a;
|
||||
long x;
|
||||
long y;
|
||||
};
|
||||
|
||||
static qse_oht_walk_t walk1 (qse_oht_t* oht, void* data, void* ctx)
|
||||
{
|
||||
qse_printf (QSE_T("[%ld]\n"), *(long*)data);
|
||||
return QSE_OHT_WALK_FORWARD;
|
||||
}
|
||||
|
||||
static qse_oht_walk_t walk2 (qse_oht_t* oht, void* data, void* ctx)
|
||||
{
|
||||
item_t* item = (item_t*)data;
|
||||
qse_printf (QSE_T("a [%ld] x [%ld] y [%ld]\n"), item->a, item->x, item->y);
|
||||
return QSE_OHT_WALK_FORWARD;
|
||||
}
|
||||
|
||||
static qse_size_t hash (qse_oht_t* oht, void* data)
|
||||
{
|
||||
item_t* item = (item_t*)data;
|
||||
return item->a;
|
||||
}
|
||||
|
||||
static int comp (qse_oht_t* oht, void* data1, void* data2)
|
||||
{
|
||||
return ((item_t*)data1)->a != ((item_t*)data2)->a;
|
||||
}
|
||||
|
||||
static int test1 ()
|
||||
{
|
||||
long x;
|
||||
qse_oht_t* oht;
|
||||
|
||||
oht = qse_oht_open (QSE_NULL, 0, QSE_SIZEOF(x), 10, 5);
|
||||
if (oht == QSE_NULL)
|
||||
{
|
||||
qse_printf (QSE_T("failed to open a table\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (x = 9; x < 20; x++)
|
||||
{
|
||||
qse_printf (QSE_T("inserting %ld => %lu\n"),
|
||||
x, (unsigned long)qse_oht_insert (oht, &x));
|
||||
}
|
||||
|
||||
x = 10;
|
||||
qse_printf (QSE_T("searching for %ld => %lu\n"),
|
||||
x, (unsigned long)qse_oht_search (oht, &x));
|
||||
|
||||
x = 10;
|
||||
qse_printf (QSE_T("deleting %ld => %lu\n"),
|
||||
x, (unsigned long)qse_oht_delete (oht, &x));
|
||||
|
||||
x = 10;
|
||||
qse_printf (QSE_T("searching for %ld => %lu\n"),
|
||||
x, (unsigned long)qse_oht_search (oht, &x));
|
||||
|
||||
|
||||
qse_oht_walk (oht, walk1, QSE_NULL);
|
||||
qse_oht_close (oht);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test2 ()
|
||||
{
|
||||
item_t x;
|
||||
qse_oht_t* oht;
|
||||
|
||||
oht = qse_oht_open (QSE_NULL, 0, QSE_SIZEOF(x), 10, 5);
|
||||
if (oht == QSE_NULL)
|
||||
{
|
||||
qse_printf (QSE_T("failed to open a table\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
qse_oht_sethasher (oht, hash);
|
||||
qse_oht_setcomper (oht, comp);
|
||||
|
||||
for (x.a = 9; x.a < 20; x.a++)
|
||||
{
|
||||
x.x = x.a * 10;
|
||||
x.y = x.a * 100;
|
||||
qse_printf (QSE_T("inserting %ld => %lu\n"),
|
||||
x.a, (unsigned long)qse_oht_insert (oht, &x));
|
||||
}
|
||||
|
||||
x.a = 10;
|
||||
qse_printf (QSE_T("searching for %ld => %lu\n"),
|
||||
x.a, (unsigned long)qse_oht_search (oht, &x));
|
||||
|
||||
x.a = 10;
|
||||
qse_printf (QSE_T("deleting %ld => %lu\n"),
|
||||
x.a, (unsigned long)qse_oht_delete (oht, &x));
|
||||
|
||||
x.a = 10;
|
||||
qse_printf (QSE_T("searching for %ld => %lu\n"),
|
||||
x.a, (unsigned long)qse_oht_search (oht, &x));
|
||||
|
||||
|
||||
qse_oht_walk (oht, walk2, QSE_NULL);
|
||||
qse_oht_close (oht);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
R (test1);
|
||||
R (test2);
|
||||
return 0;
|
||||
}
|
@ -27,10 +27,10 @@ static int test1 ()
|
||||
//qse_xma_free (xma, ptr[2]);
|
||||
//qse_xma_free (xma, ptr[3]);
|
||||
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_realloc (xma, ptr[0], 500);
|
||||
qse_xma_realloc (xma, ptr[3], 500);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
|
||||
qse_xma_close (xma);
|
||||
return 0;
|
||||
@ -51,13 +51,13 @@ static int test2 ()
|
||||
ptr[1] = qse_xma_alloc (xma, 1000);
|
||||
ptr[2] = qse_xma_alloc (xma, 3000);
|
||||
ptr[3] = qse_xma_alloc (xma, 1000);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_free (xma, ptr[0]);
|
||||
qse_xma_free (xma, ptr[2]);
|
||||
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_realloc (xma, ptr[1], 500);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
|
||||
qse_xma_close (xma);
|
||||
return 0;
|
||||
@ -78,15 +78,15 @@ static int test3 ()
|
||||
ptr[1] = qse_xma_alloc (xma, 1000);
|
||||
ptr[2] = qse_xma_alloc (xma, 3000);
|
||||
ptr[3] = qse_xma_alloc (xma, 1000);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_free (xma, ptr[0]);
|
||||
qse_xma_free (xma, ptr[2]);
|
||||
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
ptr[1] = qse_xma_realloc (xma, ptr[1], 3000);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_free (xma, ptr[1]);
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
|
||||
qse_xma_close (xma);
|
||||
return 0;
|
||||
@ -140,20 +140,19 @@ static int test4 ()
|
||||
x = qse_xma_alloc (xma, 10);
|
||||
y = qse_xma_alloc (xma, 40);
|
||||
}
|
||||
qse_xma_dump (xma, qse_printf);
|
||||
qse_xma_dump (xma, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
|
||||
qse_xma_close (xma);
|
||||
return 0;
|
||||
}
|
||||
static int test5 ()
|
||||
{
|
||||
int i;
|
||||
void* ptr[100];
|
||||
qse_mmgr_t xmammgr =
|
||||
{
|
||||
qse_xma_alloc,
|
||||
qse_xma_realloc,
|
||||
qse_xma_free,
|
||||
(qse_mmgr_alloc_t)qse_xma_alloc,
|
||||
(qse_mmgr_realloc_t)qse_xma_realloc,
|
||||
(qse_mmgr_free_t)qse_xma_free,
|
||||
QSE_NULL
|
||||
};
|
||||
|
||||
@ -189,13 +188,15 @@ static int test5 ()
|
||||
qse_xma_alloc (xma3, 8);
|
||||
qse_xma_realloc (xma3, ptr[0], 40000);
|
||||
|
||||
qse_xma_dump (xma3, qse_printf);
|
||||
qse_xma_dump (xma2, qse_printf);
|
||||
qse_xma_dump (xma1, qse_printf);
|
||||
qse_xma_dump (xma3, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_dump (xma2, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
qse_xma_dump (xma1, (qse_xma_dumper_t)qse_fprintf, QSE_STDOUT);
|
||||
|
||||
qse_xma_close (xma3);
|
||||
qse_xma_close (xma2);
|
||||
qse_xma_close (xma1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
|
Reference in New Issue
Block a user