/*******************************************************************************
 * Copyright (c) 2012 Tilera Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     William R. Swanson (Tilera Corporation) - initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.visualizer.ui.util;

/** Counter for objects that need to track asynchronous progress. */
public class Todo {

	// --- members ---

	/** Count of things left to do. */
	int m_count = 0;

	// --- constructors/destructors ---

	/** Constructor. */
	public Todo() {
	}

	/** Constructor. */
	public Todo(int count) {
		m_count = count;
	}

	/** Dispose method. */
	public void dispose() {
		m_count = 0;
	}

	// --- accessors ---

	/** Gets count. */
	public int get() {
		return m_count;
	}

	/** Sets count. */
	public void set(int count) {
		m_count = count;
	}

	/** Returns true if count has reached zero. */
	public boolean isDone() {
		return m_count <= 0;
	}

	/** Increments count, returns new value. */
	public int increment(int n) {
		return (m_count += n);
	}

	/** Increments count, returns new value. */
	public int increment() {
		return (m_count += 1);
	}

	/** Decrements count, returns new value. */
	public int decrement(int n) {
		return (m_count -= n);
	}

	/** Decrements count, returns new value. */
	public int decrement() {
		return (m_count -= 1);
	}

	// --- methods ---

	/** Adds completion steps to count. */
	public void add(int n) {
		increment(n);
	}

	/** Adds completion step to count. */
	public void add() {
		increment(1);
	}

	/** Decrements count, returns true when it's reached zero. */
	public boolean done(int n) {
		return decrement(n) <= 0;
	}

	/** Decrements count, returns true when it's reached zero. */
	public boolean done() {
		return decrement() <= 0;
	}
}
