Browse Source

Add iterable interface and make TR_List and derivated classed iterable

1.0.0
Georg Hopp 10 years ago
parent
commit
9b18e8b25a
  1. 3
      include/Makefile.am
  2. 52
      include/tr/interface/iterable.h
  3. 3
      include/tr/list.h
  4. 1
      include/trdata.h
  5. 4
      src/Makefile.am
  6. 56
      src/interface/iterable.c
  7. 38
      src/list/list.c

3
include/Makefile.am

@ -7,4 +7,5 @@ nobase_include_HEADERS = trdata.h \
tr/tree.h \
tr/dynarray.h \
tr/heap.h \
tr/interface/hashable.h
tr/interface/hashable.h \
tr/interface/iterable.h

52
include/tr/interface/iterable.h

@ -0,0 +1,52 @@
/**
* \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_INTERFACE_ITERABLE_H__
#define __TR_INTERFACE_ITERABLE_H__
#include "trbase.h"
typedef void * (* fptr_TR_iterableCurrent)(void *);
typedef void (* fptr_TR_iterableNext)(void *);
typedef void (* fptr_TR_iterableRewind)(void *);
typedef int (* fptr_TR_iterableValid)(void *);
TR_INTERFACE(TR_Iterable) {
TR_IFID;
fptr_TR_iterableCurrent current;
fptr_TR_iterableNext next;
fptr_TR_iterableRewind rewind;
fptr_TR_iterableValid valid;
};
#define TR_iterableForeach(this) \
TR_iterableRewind((this)); \
for (; TR_iterableValid((this)); TR_iterableNext((this)))
extern void * TR_iterableCurrent(void *);
extern void TR_iterableNext(void *);
extern void TR_iterableRewind(void *);
extern int TR_iterableValid(void *);
#endif // __TR_INTERFACE_ITERABLE_H__
// vim: set ts=4 sw=4:

3
include/tr/list.h

@ -37,6 +37,9 @@ TR_CLASS(TR_List) {
size_t end;
void ** data;
int free_msgs;
// for iterable interface
size_t current;
};
TR_INSTANCE_INIT(TR_List);
TR_CLASSVARS_DECL(TR_List) {};

1
include/trdata.h

@ -10,6 +10,7 @@
#include "tr/dynarray.h"
#include "tr/heap.h"
#include "tr/interface/hashable.h"
#include "tr/interface/iterable.h"
#endif // __TR_DATA_H__

4
src/Makefile.am

@ -12,9 +12,11 @@ TRDATALIBS = cbuf/libcbuf.la \
dynarray/libdynarray.la \
heap/libheap.la
ITERABLE = interface/iterable.c
lib_LTLIBRARIES = libtrdata.la
libtrdata_la_SOURCES =
libtrdata_la_SOURCES = $(ITERABLE)
libtrdata_la_CFLAGS = $(AM_CFLAGS)
libtrdata_la_LIBADD = $(TRDATALIBS)
libtrdata_la_LDFLAGS = -version-info 0:0:0 $(AM_LDFLAGS)

56
src/interface/iterable.c

@ -0,0 +1,56 @@
/**
* \file
*
* \author Georg Hopp
*
* \copyright
* Copyright © 2012 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 "trbase.h"
#include "tr/interface/iterable.h"
TR_CREATE_INTERFACE(TR_Iterable, 4);
void *
TR_iterableCurrent(void * iterable)
{
void * ret;
TR_RETCALL(iterable, TR_Iterable, current, ret);
return ret;
}
void
TR_iterableNext(void * iterable)
{
TR_CALL(iterable, TR_Iterable, next);
}
void
TR_iterableRewind(void * iterable)
{
TR_CALL(iterable, TR_Iterable, rewind);
}
int
TR_iterableValid(void * iterable)
{
int ret;
TR_RETCALL(iterable, TR_Iterable, valid, ret);
return ret;
}
// vim: set ts=4 sw=4:

38
src/list/list.c

@ -24,6 +24,7 @@
#include "trbase.h"
#include "tr/list.h"
#include "tr/interface/iterable.h"
static
int
@ -33,7 +34,7 @@ listCtor(void * _this, va_list * params)
this->data = (void **)TR_malloc(32 * sizeof(void *));
this->size = TR_getUsableSize(this->data) / sizeof(void *);
this->start = this->end = 0;
this->start = this->end = this->current = 0;
this->free_msgs = 1;
return 0;
@ -60,7 +61,40 @@ listDtor(void * _this)
TR_MEM_FREE(this->data);
}
static
void *
listCurrent(void * _this)
{
TR_List this = _this;
return this->data[this->current];
}
static
void
listNext(void * _this)
{
TR_List this = _this;
this->current = this->current + 1 == this->size ? 0 : this->current + 1;
}
static
void
listRewind(void * _this)
{
TR_List this = _this;
this->current = this->start;
}
static
int
listValid(void * _this)
{
TR_List this = _this;
return this->current != this->end;
}
TR_INIT_IFACE(TR_Class, listCtor, listDtor, NULL);
TR_CREATE_CLASS(TR_List, NULL, NULL, TR_IF(TR_Class));
TR_INIT_IFACE(TR_Iterable, listCurrent, listNext, listRewind, listValid);
TR_CREATE_CLASS(TR_List, NULL, NULL, TR_IF(TR_Class), TR_IF(TR_Iterable));
// vim: set ts=4 sw=4:
Loading…
Cancel
Save