Browse Source

New dynamic array implementation.

1.0.0
Georg Hopp 11 years ago
parent
commit
054fab8b44
  1. 1
      configure.ac
  2. 1
      include/Makefile.am
  3. 44
      include/tr/dynarray.h
  4. 1
      include/trdata.h
  5. 5
      src/Makefile.am
  6. 13
      src/dynarray/Makefile.am
  7. 59
      src/dynarray/dynarray.c
  8. 60
      src/dynarray/put.c

1
configure.ac

@ -64,5 +64,6 @@ AC_CONFIG_FILES([Makefile
src/hash/Makefile
src/queue/Makefile
src/tree/Makefile
src/dynarray/Makefile
include/Makefile])
AC_OUTPUT

1
include/Makefile.am

@ -4,4 +4,5 @@ nobase_include_HEADERS = trdata.h \
tr/hash_value.h \
tr/queue.h \
tr/tree.h \
tr/dynarray.h \
tr/interface/hashable.h

44
include/tr/dynarray.h

@ -0,0 +1,44 @@
/**
* \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 <http://www.gnu.org/licenses/>.
*/
#ifndef __TR_DYNARRAY_H__
#define __TR_DYNARRAY_H__
#include <sys/types.h>
#include "trbase.h"
TR_CLASS(TR_Dynarray) {
size_t size;
const void ** data;
};
TR_INSTANCE_INIT(TR_Dynarray);
TR_CLASSVARS_DECL(TR_Dynarray) {};
size_t TR_darrPut(TR_Dynarray, const void *);
void TR_darrPutAt(TR_Dynarray, const void *, size_t);
#define TR_darrGet(this, idx) ((this)->data[(idx)])
#endif // __TR_DYNARRAY_H__
// vim: set ts=4 sw=4:

1
include/trdata.h

@ -6,6 +6,7 @@
#include "tr/hash_value.h"
#include "tr/queue.h"
#include "tr/tree.h"
#include "tr/dynarray.h"
#include "tr/interface/hashable.h"
#endif // __TR_DATA_H__

5
src/Makefile.am

@ -7,7 +7,8 @@ AM_LDFLAGS += -lpthread
TRDATALIBS = cbuf/libcbuf.la \
hash/libhash.la \
queue/libqueue.la \
tree/libtree.la
tree/libtree.la \
dynarray/libdynarray.la
lib_LTLIBRARIES = libtrdata.la
@ -16,4 +17,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
SUBDIRS = cbuf hash queue tree dynarray

13
src/dynarray/Makefile.am

@ -0,0 +1,13 @@
ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = subdir-objects
AM_CFLAGS += -I../../include/ -std=c99 -DREENTRANT -lpthread
AM_LDFLAGS += -lpthread
DYNARRAY = dynarray.c put.c
noinst_LTLIBRARIES = libdynarray.la
libdynarray_la_SOURCES = $(DYNARRAY)
libdynarray_la_CFLAGS = $(AM_CFLAGS)
libdynarray_la_LIBADD = $(AM_LDFLAGS)

59
src/dynarray/dynarray.c

@ -0,0 +1,59 @@
/**
* \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 <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include "trbase.h"
#include "tr/dynarray.h"
static
inline
void
_darrResize(TR_Dynarray this, size_t index)
{
if (index > (long)this->size - 1) {
void * new_data = TR_calloc(index + 1, sizeof(void *));
memcpy(new_data, this->data, this->size * sizeof(void *));
TR_MEM_FREE(this->data);
this->data = (const void **)new_data;
this->size = TR_getUsableSize(new_data) / sizeof(void *);
}
}
static
int
darrCtor(void * _this)
{
return 0;
}
static
void
darrDtor(void * _this)
{
TR_MEM_FREE(((TR_Dynarray)_this)->data);
}
TR_INIT_IFACE(TR_Class, darrCtor, darrDtor, NULL);
TR_CREATE_CLASS(TR_Dynarray, NULL, NULL, TR_IF(TR_Class));
// vim: set ts=4 sw=4:

60
src/dynarray/put.c

@ -0,0 +1,60 @@
/**
* \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 <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include "trbase.h"
#include "tr/dynarray.h"
static
inline
void
_darrResize(TR_Dynarray this, size_t index)
{
if (!this->size || index > this->size - 1) {
void * new_data = TR_calloc(index + 1, sizeof(void *));
memcpy(new_data, this->data, this->size * sizeof(void *));
TR_MEM_FREE(this->data);
this->data = (const void **)new_data;
this->size = TR_getUsableSize(new_data) / sizeof(void *);
}
}
size_t
TR_darrPut(TR_Dynarray this, const void * data)
{
size_t i = this->size;
while (this->data && ! this->data[--i]);
TR_darrPutAt(this, data, this->data && this->data[i] ? i+1 : i);
return i;
}
void
TR_darrPutAt(TR_Dynarray this, const void * data, size_t idx)
{
_darrResize(this, idx);
this->data[idx] = data;
}
// vim: set ts=4 sw=4:
Loading…
Cancel
Save