/*******************************************************************************
 * Copyright (c) 2005, 2015 Oracle. All rights reserved.
 * 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/.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.utility.internal;

import java.io.Serializable;

/**
 * This simple container class simply puts a bit of semantics
 * around a pair of numbers.
 * <p>
 * <strong>NB:</strong> The {@link #start} will be less than (or equal to)
 * the {@link #end}.
 */
public class Range
	implements Cloneable, Serializable
{
	/**
	 * The range's starting index. This will always be less than or equal to
	 * {@link #end the range's ending index}.
	 */
	public final int start;

	/**
	 * The range's ending index. This will always be greater than or equal to
	 * {@link #start the range's starting index}.
	 */
	public final int end;

	/**
	 * The range's length. The range's length will never be negative.
	 */
	public final int length;

	private static final long serialVersionUID = 1L;


	/**
	 * Construct a range with the specified start and end, both of which are
	 * immutable. If the specified end is less than the specified start, the
	 * values will be swapped in the range.
	 */
	public Range(int start, int end) {
		super();
		this.start = Math.min(start, end);
		this.end = Math.max(start, end);
		this.length = this.end - this.start + 1;
	}

	/**
	 * Return whether the range includes the specified
	 * index.
	 */
	public boolean includes(int index) {
		return (this.start <= index) && (index <= this.end);
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if ( ! (o instanceof Range)) {
			return false;
		}
		Range otherRange = (Range) o;
		return (this.start == otherRange.start)
			&& (this.end == otherRange.end);
	}

	@Override
	public int hashCode() {
		return this.start ^ this.end;
	}

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

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		this.toString(sb);
		return sb.toString();
	}

	public void toString(StringBuilder sb) {
		sb.append('[');
		sb.append(this.start);
		sb.append(", "); //$NON-NLS-1$
		sb.append(this.end);
		sb.append(']');
	}
}
