package org.eclipse.cdt.internal.core.util;

/**********************************************************************
 * Copyright (c) 2002,2003 Rational Software Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v0.5
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: 
 * Rational Software - Initial API and implementation
***********************************************************************/

/**
 * The SortOperation takes a collection of objects and returns
 * a sorted collection of these objects. The sorting of these
 * objects is based on their toString(). They are sorted in
 * alphabetical order.
 * 
 * This class is similar to the JDT toStringSorter class.
 */
public class ToStringSorter {
	Object[] sortedObjects;
	String[] sortedStrings;
	/**
	 *  Returns true if stringTwo is 'greater than' stringOne
	 *  This is the 'ordering' method of the sort operation.
	 */
	public boolean compare(String stringOne, String stringTwo) {
		return stringOne.compareTo(stringTwo) < 0;
	}
	/**
	 *  Sort the objects in sorted collection and return that collection.
	 */
	private void quickSort(int left, int right) {
		int originalLeft = left;
		int originalRight = right;
		int midIndex =  (left + right) / 2;
		String midToString = this.sortedStrings[midIndex];
		
		do {
			while (compare(this.sortedStrings[left], midToString))
				left++;
			while (compare(midToString, this.sortedStrings[right]))
				right--;
			if (left <= right) {
				Object tmp = this.sortedObjects[left];
				this.sortedObjects[left] = this.sortedObjects[right];
				this.sortedObjects[right] = tmp;
				String tmpToString = this.sortedStrings[left];
				this.sortedStrings[left] = this.sortedStrings[right];
				this.sortedStrings[right] = tmpToString;
				left++;
				right--;
			}
		} while (left <= right);
		
		if (originalLeft < right)
			quickSort(originalLeft, right);
		if (left < originalRight)
			quickSort(left, originalRight);
	}
	/**
	 *  Return a new sorted collection from this unsorted collection.
	 *  Sort using quick sort.
	 */
	public void sort(Object[] unSortedObjects, String[] unsortedStrings) {
		int size = unSortedObjects.length;
		this.sortedObjects = new Object[size];
		this.sortedStrings = new String[size];
		
		//copy the array so can return a new sorted collection  
		System.arraycopy(unSortedObjects, 0, this.sortedObjects, 0, size);
		System.arraycopy(unsortedStrings, 0, this.sortedStrings, 0, size);
		if (size > 1)
			quickSort(0, size - 1);
	}
}
