/** * \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 . */ #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))) inline void * TR_iterableCurrent(void * iterable) { void * ret; TR_RETCALL(iterable, TR_Iterable, current, ret); return ret; } inline void TR_iterableNext(void * iterable) { TR_CALL(iterable, TR_Iterable, next); } inline void TR_iterableRewind(void * iterable) { TR_CALL(iterable, TR_Iterable, rewind); } inline int TR_iterableValid(void * iterable) { int ret; TR_RETCALL(iterable, TR_Iterable, valid, ret); return ret; } #endif // __TR_INTERFACE_ITERABLE_H__ // vim: set ts=4 sw=4: