package junit.runner;

import java.util.*;

import junit.runner.*;

/**
 * A custom quick sort with support to customize the swap behaviour.
 * NOTICE: We can't use the the sorting support from the JDK 1.2 collection
 * classes because of the JDK 1.1.7 compatibility.
 */
public class Sorter {
	public static interface Swapper {
		public void swap(Vector values, int left, int right);
	}
		
	public static void sortStrings(Vector values , int left, int right, Swapper swapper) { 
		int oleft= left;
		int oright= right;
		String mid= (String)values.elementAt((left + right) / 2); 
		do { 
			while (((String)(values.elementAt(left))).compareTo(mid) < 0)  
				left++; 
			while (mid.compareTo((String)(values.elementAt(right))) < 0)  
				right--; 
			if (left <= right) {
				swapper.swap(values, left, right); 
				left++; 
				right--; 
			} 
		} while (left <= right);
		
		if (oleft < right) 
			sortStrings(values, oleft, right, swapper); 
		if (left < oright) 
			 sortStrings(values, left, oright, swapper); 
	}
}