/* 
 * This file is part of the HyperGraphDB source distribution. This is copyrighted 
 * software. For permitted uses, licensing options and redistribution, please see  
 * the LicensingInformation file at the root level of the distribution.  
 * 
 * Copyright (c) 2005-2010 Kobrix Software, Inc.  All rights reserved. 
 */
package org.hypergraphdb.query.impl;

import java.util.NoSuchElementException;

import org.hypergraphdb.HGHandle;
import org.hypergraphdb.HGSearchResult;

/**
 * 
 * <p>
 * Implements a <code>HGSearchResult</code> comprising the atoms in a given HGHandle array.
 * </p>
 * 
 * <p>
 * Note: this is not an ordered result set, but can easily be made so if this proves
 * beneficial.
 * </p>
 * 
 * @author Borislav Iordanov
 *
 */
public class HandleArrayResultSet implements HGSearchResult<HGHandle>
{
	protected HGHandle [] A;
	protected int start, end;
	protected int pos = -1;
	
	public HandleArrayResultSet(HGHandle [] array)
	{
		this(array, 0, array.length);		
	}
	
	public HandleArrayResultSet(HGHandle [] array, int start)
	{
		this(array, start, array.length);
	}
	
	public HandleArrayResultSet(HGHandle [] array, int start, int end)
	{
		this.A = array;
		this.start = start;
		this.end = end;
		this.pos = start - 1;
	}
	
	public void close()
	{
	}

	public HGHandle current()
	{
		if (pos < start || pos >= end)
			throw new NoSuchElementException();
		return A[pos];
	}

	public boolean isOrdered()
	{
		return false;
	}

	public boolean hasPrev()
	{		
		return pos > start;
	}

	public HGHandle prev()
	{
		if (pos <= start)
			throw new NoSuchElementException();
		return A[--pos];
	}

	public boolean hasNext()
	{
		return pos < end - 1;
	}

	public HGHandle next()
	{
		if (pos >= end - 1)
			throw new NoSuchElementException();
		return A[++pos];
	}

	public void remove()
	{
		throw new UnsupportedOperationException();
	}
}
