1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4 
5 using System;
6 using System.Collections;
7 
8 namespace IceUtilInternal
9 {
10     public sealed class Arrays
11     {
Equals(object[] arr1, object[] arr2)12         public static bool Equals(object[] arr1, object[] arr2)
13         {
14             if(object.ReferenceEquals(arr1, arr2))
15             {
16                 return true;
17             }
18 
19             if((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))
20             {
21                 return false;
22             }
23 
24             if(arr1.Length == arr2.Length)
25             {
26                 for(int i = 0; i < arr1.Length; i++)
27                 {
28                     if(arr1[i] == null)
29                     {
30                         if(arr2[i] != null)
31                         {
32                             return false;
33                         }
34                     }
35                     else if(!arr1[i].Equals(arr2[i]))
36                     {
37                         return false;
38                     }
39                 }
40 
41                 return true;
42             }
43 
44             return false;
45         }
46 
Equals(Array arr1, Array arr2)47         public static bool Equals(Array arr1, Array arr2)
48         {
49             if(object.ReferenceEquals(arr1, arr2))
50             {
51                 return true;
52             }
53 
54             if((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))
55             {
56                 return false;
57             }
58 
59             if(arr1.Length == arr2.Length)
60             {
61                 IEnumerator e1 = arr1.GetEnumerator();
62                 IEnumerator e2 = arr2.GetEnumerator();
63                 while(e1.MoveNext())
64                 {
65                     e2.MoveNext();
66                     if(e1.Current == null)
67                     {
68                         if(e2.Current != null)
69                         {
70                             return false;
71                         }
72                     }
73                     else if(!e1.Current.Equals(e2.Current))
74                     {
75                         return false;
76                     }
77                 }
78 
79                 return true;
80             }
81 
82             return false;
83         }
84 
GetHashCode(object[] arr)85         public static int GetHashCode(object[] arr)
86         {
87             int h = 5381;
88 
89             for(int i = 0; i < arr.Length; i++)
90             {
91                 object o = arr[i];
92                 if(o != null)
93                 {
94                     IceInternal.HashUtil.hashAdd(ref h, o);
95                 }
96             }
97 
98             return h;
99         }
100 
GetHashCode(Array arr)101         public static int GetHashCode(Array arr)
102         {
103             int h = 0;
104 
105             foreach(object o in arr)
106             {
107                 if(o != null)
108                 {
109                     IceInternal.HashUtil.hashAdd(ref h, o);
110                 }
111             }
112 
113             return h;
114         }
115     }
116 }
117