/*
 * Copyright (C) 2009 Karel Zak <kzak@redhat.com>
 *
 * This file may be redistributed under the terms of the
 * GNU Lesser General Public License.
 */

/**
 * SECTION: iter
 * @title: Iterator
 * @short_description: unified iterator
 *
 * The iterator keeps the direction and the last position for access to the
 * internal library tables/lists.
 *
 * It's very unusual to use the same iterator on multiple places in your
 * application or share the same iterator, for this purpose libfdisk does not
 * provide reference counting for this object. It's recommended to initialize
 * the iterator by fdisk_new_iter() at begin of your function and then
 * fdisk_free_iter() before you return from the function. 
 *
 * Don't forget to call fdisk_reset_iter() if you want to use the iterator more
 * than once.
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "fdiskP.h"

/**
 * fdisk_new_iter:
 * @direction: FDISK_INTER_{FOR,BACK}WARD direction
 *
 * Returns: newly allocated generic libmount iterator.
 */
struct fdisk_iter *fdisk_new_iter(int direction)
{
	struct fdisk_iter *itr = calloc(1, sizeof(*itr));
	if (!itr)
		return NULL;
	itr->direction = direction;
	return itr;
}

/**
 * fdisk_free_iter:
 * @itr: iterator pointer
 *
 * Deallocates the iterator.
 */
void fdisk_free_iter(struct fdisk_iter *itr)
{
	free(itr);
}

/**
 * fdisk_reset_iter:
 * @itr: iterator pointer
 * @direction: FDISK_INTER_{FOR,BACK}WARD or -1 to keep the direction unchanged
 *
 * Resets the iterator.
 */
void fdisk_reset_iter(struct fdisk_iter *itr, int direction)
{
	if (direction == -1)
		direction = itr->direction;

	memset(itr, 0, sizeof(*itr));
	itr->direction = direction;
}

/**
 * fdisk_iter_get_direction:
 * @itr: iterator pointer
 *
 * Returns: FDISK_INTER_{FOR,BACK}WARD
 */
int fdisk_iter_get_direction(struct fdisk_iter *itr)
{
	return itr->direction;
}
