Merged SVN plugins
[idea/community.git] / platform / util / src / com / intellij / openapi / util / Comparing.java
1 /*
2  * Copyright 2000-2007 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.util;
17
18 import com.intellij.openapi.util.text.StringUtil;
19
20 import java.util.*;
21
22 public class Comparing {
23   private Comparing() { }
24
25   public static <T> boolean  equal(T arg1, T arg2){
26     if (arg1 == null || arg2 == null){
27       return arg1 == arg2;
28     }
29     else if (arg1 instanceof Object[] && arg2 instanceof Object[]){
30       Object[] arr1 = (Object[])arg1;
31       Object[] arr2 = (Object[])arg2;
32       return Arrays.equals(arr1, arr2);
33     }
34     else if (arg1 instanceof CharSequence && arg2 instanceof CharSequence) {
35       return equal((CharSequence)arg1, (CharSequence)arg2, true);
36     }
37     else{
38       return arg1.equals(arg2);
39     }
40   }
41
42   public static <T> boolean equal(T[] arr1, T[] arr2){
43     if (arr1 == null || arr2 == null){
44       return arr1 == arr2;
45     }
46     return Arrays.equals(arr1, arr2);
47   }
48
49   public static boolean equal(CharSequence s1, CharSequence s2) {
50     return equal(s1, s2, true);
51   }
52
53   public static boolean equal(String arg1, String arg2) {
54     return equal(arg1, arg2, true);
55   }
56
57   public static boolean equal(CharSequence s1, CharSequence s2, boolean caseSensitive) {
58     if (s1 == s2) return true;
59     if (s1 == null || s2 == null) return false;
60
61     // Algorithm from String.regionMatches()
62     int to = 0;
63     int po = 0;
64
65     if (s1.length() != s2.length()) return false;
66     int len = s1.length();
67
68     while (len-- > 0) {
69       char c1 = s1.charAt(to++);
70       char c2 = s2.charAt(po++);
71       if (c1 == c2) {
72         continue;
73       }
74       if (!caseSensitive && StringUtil.charsEqualIgnoreCase(c1, c2)) continue;
75       return false;
76     }
77
78     return true;
79   }
80
81   public static boolean equal(String arg1, String arg2, boolean caseSensitive){
82     if (arg1 == null || arg2 == null){
83       return arg1 == arg2;
84     }
85     else{
86       return caseSensitive ? arg1.equals(arg2) : arg1.equalsIgnoreCase(arg2);
87     }
88   }
89
90   public static boolean strEqual(String arg1, String arg2){
91     return strEqual(arg1, arg2, true);
92   }
93
94   public static boolean strEqual(String arg1, String arg2, boolean caseSensitive){
95     return equal(arg1 == null ? "" : arg1, arg2 == null ? "" : arg2, caseSensitive);
96   }
97
98   public static <T> boolean haveEqualElements(Collection<T> a, Collection<T> b) {
99     if (a.size() != b.size()) {
100       return false;
101     }
102
103     Set<T> aSet = new HashSet<T>(a);
104     for (T t : b) {
105       if (!aSet.contains(t)) {
106         return false;
107       }
108     }
109     return true;
110   }
111
112   public static <T> boolean haveEqualElements(T[] a, T[] b) {
113     if (a == null || b == null) {
114       return a == b;
115     }
116
117     if (a.length != b.length) {
118       return false;
119     }
120
121     Set<T> aSet = new HashSet<T>(Arrays.asList(a));
122     for (T t : b) {
123       if (!aSet.contains(t)) {
124         return false;
125       }
126     }
127     return true;
128   }
129
130   public static int hashcode(Object obj) { return obj == null ? 0 : obj.hashCode(); }
131   public static int hashcode(Object obj1, Object obj2) { return hashcode(obj1) ^ hashcode(obj2); }
132
133   public static <T extends Comparable<T>> int compare(final T name1, final T name2) {
134     if (name1 == null) return name2 == null ? 0 : -1;
135     if (name2 == null) return 1;
136     return name1.compareTo(name2);
137   }
138 }