/*
 * Copyright (C) 2008-2009, Google Inc.
 * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.treewalk;

import java.io.IOException;

import org.eclipse.jgit.errors.CorruptObjectException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectReader;

/**
 * Iterator over an empty tree (a directory with no files).
 */
public class EmptyTreeIterator extends AbstractTreeIterator {
	/**
	 * Create a new iterator with no parent.
	 */
	public EmptyTreeIterator() {
		// Create a root empty tree.
	}

	EmptyTreeIterator(AbstractTreeIterator p) {
		super(p);
		pathLen = pathOffset;
	}

	/**
	 * Create an iterator for a subtree of an existing iterator.
	 * <p>
	 * The caller is responsible for setting up the path of the child iterator.
	 *
	 * @param p
	 *            parent tree iterator.
	 * @param childPath
	 *            path array to be used by the child iterator. This path must
	 *            contain the path from the top of the walk to the first child
	 *            and must end with a '/'.
	 * @param childPathOffset
	 *            position within <code>childPath</code> where the child can
	 *            insert its data. The value at
	 *            <code>childPath[childPathOffset-1]</code> must be '/'.
	 */
	public EmptyTreeIterator(final AbstractTreeIterator p,
			final byte[] childPath, final int childPathOffset) {
		super(p, childPath, childPathOffset);
		pathLen = childPathOffset - 1;
	}

	@Override
	public AbstractTreeIterator createSubtreeIterator(ObjectReader reader)
			throws IncorrectObjectTypeException, IOException {
		return new EmptyTreeIterator(this);
	}

	@Override
	public boolean hasId() {
		return false;
	}

	@Override
	public ObjectId getEntryObjectId() {
		return ObjectId.zeroId();
	}

	@Override
	public byte[] idBuffer() {
		return zeroid;
	}

	@Override
	public int idOffset() {
		return 0;
	}

	@Override
	public void reset() {
		// Do nothing.
	}

	@Override
	public boolean first() {
		return true;
	}

	@Override
	public boolean eof() {
		return true;
	}

	@Override
	public void next(int delta) throws CorruptObjectException {
		// Do nothing.
	}

	@Override
	public void back(int delta) throws CorruptObjectException {
		// Do nothing.
	}

	@Override
	public void stopWalk() {
		if (parent != null)
			parent.stopWalk();
	}

	@Override
	protected boolean needsStopWalk() {
		return parent != null && parent.needsStopWalk();
	}
}
