/*******************************************************************************
 * Copyright (c) 2007 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.utility.internal;

import java.io.Serializable;

/**
 * This class can be used wherever a mutable integer object is needed.
 * It is a cross between an int and an Integer. It can be stored in a standard
 * container (e.g. Collection) but can be modified.
 */
public final class Counter
	implements Cloneable, Serializable
{
	private int count = 0;

	private static final long serialVersionUID = 1L;


	/**
	 * Construct a counter with the specified initial value.
	 */
	public Counter(int count) {
		super();
		this.count = count;
	}

	/**
	 * Construct a counter with an initial value of zero.
	 */
	public Counter() {
		this(0);
	}

	/**
	 * Return the current count of the counter.
	 */
	public synchronized int count() {
		return this.count;
	}

	/**
	 * Increment and return the current count of the counter.
	 */
	public synchronized int increment() {
		return ++this.count;
	}

	/**
	 * Increment and return the current count of the counter.
	 */
	public synchronized int increment(int increment) {
		return this.count += increment;
	}

	/**
	 * Derement and return the current count of the counter.
	 */
	public synchronized int decrement() {
		return --this.count;
	}

	/**
	 * Derement and return the current count of the counter.
	 */
	public synchronized int decrement(int decrement) {
		return this.count -= decrement;
	}

	@Override
	public synchronized boolean equals(Object o) {
		if ( ! (o instanceof Counter)) {
			return false;
		}
		return this.count == ((Counter) o).count;
	}

	@Override
	public synchronized int hashCode() {
		return this.count;
	}

	@Override
	public synchronized Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException ex) {
			throw new InternalError();
		}
	}

	@Override
	public synchronized String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append(ClassTools.shortClassNameForObject(this));
		sb.append('(');
		sb.append(this.count);
		sb.append(')');
		return sb.toString();
	}

}
