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

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
 
import org.eclipse.jface.util.Assert;


/**
 * Quick sort to sort two arrays in parallel.
 */
public class TwoArrayQuickSort {

	private static void internalSort(String[] keys, Object[] values, int left, int right, boolean ignoreCase) { 
	
		int original_left= left;
		int original_right= right;
		
		String mid= keys[(left + right) / 2]; 
		do { 
			while (smaller(keys[left], mid, ignoreCase)) { 
				left++; 
			} 
			while (smaller(mid, keys[right], ignoreCase)) { 
				right--; 
			} 
			if (left <= right) { 
				String tmp= keys[left]; 
				keys[left]= keys[right]; 
				keys[right]= tmp;
				
				Object tmp2= values[left]; 
				values[left]= values[right]; 
				values[right]= tmp2;
				
				left++; 
				right--; 
			} 
		} while (left <= right);
		
		if (original_left < right) {
			internalSort(keys , values, original_left, right, ignoreCase); 
		}	
		if (left < original_right) {
			 internalSort(keys, values, left, original_right, ignoreCase); 
		} 
	}
	private static boolean smaller(String left, String right, boolean ignoreCase) {
		if (ignoreCase)
			return left.compareToIgnoreCase(right) < 0;
		else
			return left.compareTo(right) < 0;	
	}
	/**
	 * Sorts keys and values in parallel.
	 */
	public static void sort(String[] keys, Object[] values, boolean ignoreCase) { 
		if (keys != null && values != null) {
			Assert.isTrue(keys.length == values.length);
			if (keys.length > 1)
				internalSort(keys, values, 0, keys.length - 1, ignoreCase);	
		} else {
			if (keys != null || values != null)
				Assert.isTrue(false, "Either keys or values in null"); //$NON-NLS-1$
		}
	}
}
