BarryServer : Git

All the code for all my projects
// BarryServer : Git / libBLOC / blob / master / iterator / iterator.c

// Related

libBLOC

Barry Initial commit b3106d3 (2 years, 11 months ago)
/*
 * Copyright (C) 2023 Barry
 *
 * This file is part of Barry's Little Objects in C Library (libBLOC).
 *
 * libBLOC 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.
 *
 * libBLOC is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTIBILITY 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
 * libBLOC.  If not, see <https://www.gnu.org/licenses/>.
 */

/*
 * This file implements the Iterator object type.  Iterator objects are used to
 * iterate an Iterable object.  Iterable objects are any objects that have
 * an Iterable header.  Every item in this list is prefixed with an
 * IterableEntry header.  They support bi-directional tracked movement, and
 * automatically track position and handle relative movement, since the list
 * links are not available from the objects themselves.
 */

#include <BLOC/object.h>
#include <BLOC/iterator.h>
#include "iterator.h"

#define ITER_MAGIC 0x49544552 /* ITER */

/* Iterator object type */
struct ObjectType iteratorType = {
	.name = "Iterator",
	.size = sizeof(Iterator),
};

/* Create an Iterator object for an Iterable object */
Iterator *
iterator_create(void *iterable)
{
	Iterator *iter = NULL;
	struct Iterable *i = iterable;
	if (i->magic == ITER_MAGIC) {
		iter = obj_new(&iteratorType);
		iter->list = obj_get(iterable);
	}
	return iter;
}

/* Initialise an Iterable header */
void
iterable_init(struct Iterable *header)
{
	header->magic = ITER_MAGIC;
	header->start = header->end = NULL;
	header->entries = 0;
}