/*******************************************************************************
* Copyright (c) 2007, 2010 Intel Corporation and others.
* 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.settings.model.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@SuppressWarnings("rawtypes")
public class ListComparator {
private static Comparator fDefaultComparator;
public static Comparator getDefaultComparator(){
if(fDefaultComparator == null)
fDefaultComparator = new Comparator();
return fDefaultComparator;
}
public static List[] compare(Object a1[], Object a2[]){
return compare(a1, a2, getDefaultComparator());
}
public static List[] compare(Object a1[], Object a2[], Comparator c){
List added = getAdded(a1, a2, c);
List removed = getAdded(a2, a1, c);
if(added == null && removed == null)
return null;
return new List[]{added, removed};
}
public static List getAdded(Object a1[], Object a2[]){
return getAdded(a1, a2, getDefaultComparator());
}
public static List getAdded(Object a1[], Object a2[], Comparator c){
if(a1 == null || a1.length == 0)
return null;
if(a2 == null || a2.length == 0){
List<Object> list = new ArrayList<Object>(a1.length);
for(int i = 0; i < a1.length; i++){
list.add(a1[i]);
}
return list;
}
List<Object> list = new ArrayList<Object>(a1.length);
Object o1;
for(int i = 0; i < a1.length; i++){
o1 = a1[i];
for(int j = 0; j < a2.length; j++){
if(!c.equal(o1, a2[j]))
list.add(o1);
}
}
return list.size() != 0 ? list : null;
}
@SuppressWarnings("unchecked")
public static boolean match(Object a1[], Object a2[], Comparator c){
if(a1 == null)
return a2 == null;
if(a2 == null)
return false;
if(a1.length != a2.length)
return false;
int size = a1.length;
List list = new ArrayList(Arrays.asList(a1));
List otherList = new ArrayList(Arrays.asList(a2));
for(int i = size - 1; i >= 0; i--){
Object o1 = list.remove(i);
int j = i;
for(; j >= 0; j--){
if(c.equal(o1, otherList.get(j))){
otherList.remove(j);
break;
}
}
if(j < 0)
return false;
}
return true;
}
public static int indexOf(Object o, Object[] a){
return indexOf(o, a, getDefaultComparator());
}
public static int indexOf(Object o, Object[] a, Comparator c){
for(int i = 0; i < a.length; i++){
if(c.equal(a[i], o))
return i;
}
return -1;
}
public static boolean haveMatches(Object[] a1 , Object[] a2){
return haveMatches(a1, a2, getDefaultComparator());
}
public static boolean haveMatches(Object[] a1 , Object[] a2, Comparator c){
for(int i = 0; i < a1.length; i++){
if(indexOf(a1[i], a2, c) != -1)
return true;
}
return false;
}
}