ADD week 5
This commit is contained in:
		
							
								
								
									
										537
									
								
								02-Easy5/E5/sources/androidx/collection/SimpleArrayMap.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										537
									
								
								02-Easy5/E5/sources/androidx/collection/SimpleArrayMap.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,537 @@ | ||||
| package androidx.collection; | ||||
|  | ||||
| import java.util.ConcurrentModificationException; | ||||
| import java.util.Map; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public class SimpleArrayMap<K, V> { | ||||
|     private static final int BASE_SIZE = 4; | ||||
|     private static final int CACHE_SIZE = 10; | ||||
|     private static final boolean CONCURRENT_MODIFICATION_EXCEPTIONS = true; | ||||
|     private static final boolean DEBUG = false; | ||||
|     private static final String TAG = "ArrayMap"; | ||||
|     static Object[] mBaseCache; | ||||
|     static int mBaseCacheSize; | ||||
|     static Object[] mTwiceBaseCache; | ||||
|     static int mTwiceBaseCacheSize; | ||||
|     Object[] mArray; | ||||
|     int[] mHashes; | ||||
|     int mSize; | ||||
|  | ||||
|     public boolean isEmpty() { | ||||
|         if (this.mSize <= 0) { | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public int size() { | ||||
|         return this.mSize; | ||||
|     } | ||||
|  | ||||
|     private static int binarySearchHashes(int[] iArr, int i, int i2) { | ||||
|         try { | ||||
|             return ContainerHelpers.binarySearch(iArr, i, i2); | ||||
|         } catch (ArrayIndexOutOfBoundsException unused) { | ||||
|             throw new ConcurrentModificationException(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     int indexOf(Object obj, int i) { | ||||
|         int i2 = this.mSize; | ||||
|         if (i2 == 0) { | ||||
|             return -1; | ||||
|         } | ||||
|         int binarySearchHashes = binarySearchHashes(this.mHashes, i2, i); | ||||
|         if (binarySearchHashes < 0 || obj.equals(this.mArray[binarySearchHashes << 1])) { | ||||
|             return binarySearchHashes; | ||||
|         } | ||||
|         int i3 = binarySearchHashes + 1; | ||||
|         while (i3 < i2 && this.mHashes[i3] == i) { | ||||
|             if (obj.equals(this.mArray[i3 << 1])) { | ||||
|                 return i3; | ||||
|             } | ||||
|             i3++; | ||||
|         } | ||||
|         for (int i4 = binarySearchHashes - 1; i4 >= 0 && this.mHashes[i4] == i; i4--) { | ||||
|             if (obj.equals(this.mArray[i4 << 1])) { | ||||
|                 return i4; | ||||
|             } | ||||
|         } | ||||
|         return ~i3; | ||||
|     } | ||||
|  | ||||
|     int indexOfNull() { | ||||
|         int i = this.mSize; | ||||
|         if (i == 0) { | ||||
|             return -1; | ||||
|         } | ||||
|         int binarySearchHashes = binarySearchHashes(this.mHashes, i, 0); | ||||
|         if (binarySearchHashes < 0 || this.mArray[binarySearchHashes << 1] == null) { | ||||
|             return binarySearchHashes; | ||||
|         } | ||||
|         int i2 = binarySearchHashes + 1; | ||||
|         while (i2 < i && this.mHashes[i2] == 0) { | ||||
|             if (this.mArray[i2 << 1] == null) { | ||||
|                 return i2; | ||||
|             } | ||||
|             i2++; | ||||
|         } | ||||
|         for (int i3 = binarySearchHashes - 1; i3 >= 0 && this.mHashes[i3] == 0; i3--) { | ||||
|             if (this.mArray[i3 << 1] == null) { | ||||
|                 return i3; | ||||
|             } | ||||
|         } | ||||
|         return ~i2; | ||||
|     } | ||||
|  | ||||
|     private void allocArrays(int i) { | ||||
|         if (i == 8) { | ||||
|             synchronized (SimpleArrayMap.class) { | ||||
|                 Object[] objArr = mTwiceBaseCache; | ||||
|                 if (objArr != null) { | ||||
|                     this.mArray = objArr; | ||||
|                     mTwiceBaseCache = (Object[]) objArr[0]; | ||||
|                     this.mHashes = (int[]) objArr[1]; | ||||
|                     objArr[1] = null; | ||||
|                     objArr[0] = null; | ||||
|                     mTwiceBaseCacheSize--; | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } else if (i == 4) { | ||||
|             synchronized (SimpleArrayMap.class) { | ||||
|                 Object[] objArr2 = mBaseCache; | ||||
|                 if (objArr2 != null) { | ||||
|                     this.mArray = objArr2; | ||||
|                     mBaseCache = (Object[]) objArr2[0]; | ||||
|                     this.mHashes = (int[]) objArr2[1]; | ||||
|                     objArr2[1] = null; | ||||
|                     objArr2[0] = null; | ||||
|                     mBaseCacheSize--; | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         this.mHashes = new int[i]; | ||||
|         this.mArray = new Object[i << 1]; | ||||
|     } | ||||
|  | ||||
|     private static void freeArrays(int[] iArr, Object[] objArr, int i) { | ||||
|         if (iArr.length == 8) { | ||||
|             synchronized (SimpleArrayMap.class) { | ||||
|                 if (mTwiceBaseCacheSize < 10) { | ||||
|                     objArr[0] = mTwiceBaseCache; | ||||
|                     objArr[1] = iArr; | ||||
|                     for (int i2 = (i << 1) - 1; i2 >= 2; i2--) { | ||||
|                         objArr[i2] = null; | ||||
|                     } | ||||
|                     mTwiceBaseCache = objArr; | ||||
|                     mTwiceBaseCacheSize++; | ||||
|                 } | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|         if (iArr.length == 4) { | ||||
|             synchronized (SimpleArrayMap.class) { | ||||
|                 if (mBaseCacheSize < 10) { | ||||
|                     objArr[0] = mBaseCache; | ||||
|                     objArr[1] = iArr; | ||||
|                     for (int i3 = (i << 1) - 1; i3 >= 2; i3--) { | ||||
|                         objArr[i3] = null; | ||||
|                     } | ||||
|                     mBaseCache = objArr; | ||||
|                     mBaseCacheSize++; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public SimpleArrayMap() { | ||||
|         this.mHashes = ContainerHelpers.EMPTY_INTS; | ||||
|         this.mArray = ContainerHelpers.EMPTY_OBJECTS; | ||||
|         this.mSize = 0; | ||||
|     } | ||||
|  | ||||
|     public SimpleArrayMap(int i) { | ||||
|         if (i == 0) { | ||||
|             this.mHashes = ContainerHelpers.EMPTY_INTS; | ||||
|             this.mArray = ContainerHelpers.EMPTY_OBJECTS; | ||||
|         } else { | ||||
|             allocArrays(i); | ||||
|         } | ||||
|         this.mSize = 0; | ||||
|     } | ||||
|  | ||||
|     /* JADX WARN: Multi-variable type inference failed */ | ||||
|     public SimpleArrayMap(SimpleArrayMap<K, V> simpleArrayMap) { | ||||
|         this(); | ||||
|         if (simpleArrayMap != 0) { | ||||
|             putAll(simpleArrayMap); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void clear() { | ||||
|         int i = this.mSize; | ||||
|         if (i > 0) { | ||||
|             int[] iArr = this.mHashes; | ||||
|             Object[] objArr = this.mArray; | ||||
|             this.mHashes = ContainerHelpers.EMPTY_INTS; | ||||
|             this.mArray = ContainerHelpers.EMPTY_OBJECTS; | ||||
|             this.mSize = 0; | ||||
|             freeArrays(iArr, objArr, i); | ||||
|         } | ||||
|         if (this.mSize > 0) { | ||||
|             throw new ConcurrentModificationException(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void ensureCapacity(int i) { | ||||
|         int i2 = this.mSize; | ||||
|         int[] iArr = this.mHashes; | ||||
|         if (iArr.length < i) { | ||||
|             Object[] objArr = this.mArray; | ||||
|             allocArrays(i); | ||||
|             if (this.mSize > 0) { | ||||
|                 System.arraycopy(iArr, 0, this.mHashes, 0, i2); | ||||
|                 System.arraycopy(objArr, 0, this.mArray, 0, i2 << 1); | ||||
|             } | ||||
|             freeArrays(iArr, objArr, i2); | ||||
|         } | ||||
|         if (this.mSize != i2) { | ||||
|             throw new ConcurrentModificationException(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public boolean containsKey(Object obj) { | ||||
|         if (indexOfKey(obj) >= 0) { | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public int indexOfKey(Object obj) { | ||||
|         return obj == null ? indexOfNull() : indexOf(obj, obj.hashCode()); | ||||
|     } | ||||
|  | ||||
|     int indexOfValue(Object obj) { | ||||
|         int i = this.mSize * 2; | ||||
|         Object[] objArr = this.mArray; | ||||
|         if (obj == null) { | ||||
|             for (int i2 = 1; i2 < i; i2 += 2) { | ||||
|                 if (objArr[i2] == null) { | ||||
|                     return i2 >> 1; | ||||
|                 } | ||||
|             } | ||||
|             return -1; | ||||
|         } | ||||
|         for (int i3 = 1; i3 < i; i3 += 2) { | ||||
|             if (obj.equals(objArr[i3])) { | ||||
|                 return i3 >> 1; | ||||
|             } | ||||
|         } | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     public boolean containsValue(Object obj) { | ||||
|         if (indexOfValue(obj) >= 0) { | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public V get(Object obj) { | ||||
|         return getOrDefault(obj, null); | ||||
|     } | ||||
|  | ||||
|     public V getOrDefault(Object obj, V v) { | ||||
|         int indexOfKey = indexOfKey(obj); | ||||
|         return indexOfKey >= 0 ? (V) this.mArray[(indexOfKey << 1) + 1] : v; | ||||
|     } | ||||
|  | ||||
|     public K keyAt(int i) { | ||||
|         return (K) this.mArray[i << 1]; | ||||
|     } | ||||
|  | ||||
|     public V valueAt(int i) { | ||||
|         return (V) this.mArray[(i << 1) + 1]; | ||||
|     } | ||||
|  | ||||
|     public V setValueAt(int i, V v) { | ||||
|         int i2 = (i << 1) + 1; | ||||
|         Object[] objArr = this.mArray; | ||||
|         V v2 = (V) objArr[i2]; | ||||
|         objArr[i2] = v; | ||||
|         return v2; | ||||
|     } | ||||
|  | ||||
|     public V put(K k, V v) { | ||||
|         int i; | ||||
|         int indexOf; | ||||
|         int i2 = this.mSize; | ||||
|         if (k == null) { | ||||
|             indexOf = indexOfNull(); | ||||
|             i = 0; | ||||
|         } else { | ||||
|             int hashCode = k.hashCode(); | ||||
|             i = hashCode; | ||||
|             indexOf = indexOf(k, hashCode); | ||||
|         } | ||||
|         if (indexOf >= 0) { | ||||
|             int i3 = (indexOf << 1) + 1; | ||||
|             Object[] objArr = this.mArray; | ||||
|             V v2 = (V) objArr[i3]; | ||||
|             objArr[i3] = v; | ||||
|             return v2; | ||||
|         } | ||||
|         int i4 = ~indexOf; | ||||
|         int[] iArr = this.mHashes; | ||||
|         if (i2 >= iArr.length) { | ||||
|             int i5 = 8; | ||||
|             if (i2 >= 8) { | ||||
|                 i5 = (i2 >> 1) + i2; | ||||
|             } else if (i2 < 4) { | ||||
|                 i5 = 4; | ||||
|             } | ||||
|             Object[] objArr2 = this.mArray; | ||||
|             allocArrays(i5); | ||||
|             if (i2 != this.mSize) { | ||||
|                 throw new ConcurrentModificationException(); | ||||
|             } | ||||
|             int[] iArr2 = this.mHashes; | ||||
|             if (iArr2.length > 0) { | ||||
|                 System.arraycopy(iArr, 0, iArr2, 0, iArr.length); | ||||
|                 System.arraycopy(objArr2, 0, this.mArray, 0, objArr2.length); | ||||
|             } | ||||
|             freeArrays(iArr, objArr2, i2); | ||||
|         } | ||||
|         if (i4 < i2) { | ||||
|             int[] iArr3 = this.mHashes; | ||||
|             int i6 = i4 + 1; | ||||
|             System.arraycopy(iArr3, i4, iArr3, i6, i2 - i4); | ||||
|             Object[] objArr3 = this.mArray; | ||||
|             System.arraycopy(objArr3, i4 << 1, objArr3, i6 << 1, (this.mSize - i4) << 1); | ||||
|         } | ||||
|         int i7 = this.mSize; | ||||
|         if (i2 == i7) { | ||||
|             int[] iArr4 = this.mHashes; | ||||
|             if (i4 < iArr4.length) { | ||||
|                 iArr4[i4] = i; | ||||
|                 Object[] objArr4 = this.mArray; | ||||
|                 int i8 = i4 << 1; | ||||
|                 objArr4[i8] = k; | ||||
|                 objArr4[i8 + 1] = v; | ||||
|                 this.mSize = i7 + 1; | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|         throw new ConcurrentModificationException(); | ||||
|     } | ||||
|  | ||||
|     public void putAll(SimpleArrayMap<? extends K, ? extends V> simpleArrayMap) { | ||||
|         int i = simpleArrayMap.mSize; | ||||
|         ensureCapacity(this.mSize + i); | ||||
|         if (this.mSize != 0) { | ||||
|             for (int i2 = 0; i2 < i; i2++) { | ||||
|                 put(simpleArrayMap.keyAt(i2), simpleArrayMap.valueAt(i2)); | ||||
|             } | ||||
|         } else if (i > 0) { | ||||
|             System.arraycopy(simpleArrayMap.mHashes, 0, this.mHashes, 0, i); | ||||
|             System.arraycopy(simpleArrayMap.mArray, 0, this.mArray, 0, i << 1); | ||||
|             this.mSize = i; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public V putIfAbsent(K k, V v) { | ||||
|         V v2 = get(k); | ||||
|         return v2 == null ? put(k, v) : v2; | ||||
|     } | ||||
|  | ||||
|     public V remove(Object obj) { | ||||
|         int indexOfKey = indexOfKey(obj); | ||||
|         if (indexOfKey >= 0) { | ||||
|             return removeAt(indexOfKey); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public boolean remove(Object obj, Object obj2) { | ||||
|         int indexOfKey = indexOfKey(obj); | ||||
|         if (indexOfKey < 0) { | ||||
|             return false; | ||||
|         } | ||||
|         V valueAt = valueAt(indexOfKey); | ||||
|         if (obj2 != valueAt && (obj2 == null || !obj2.equals(valueAt))) { | ||||
|             return false; | ||||
|         } | ||||
|         removeAt(indexOfKey); | ||||
|         return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|     } | ||||
|  | ||||
|     public V removeAt(int i) { | ||||
|         Object[] objArr = this.mArray; | ||||
|         int i2 = i << 1; | ||||
|         V v = (V) objArr[i2 + 1]; | ||||
|         int i3 = this.mSize; | ||||
|         int i4 = 0; | ||||
|         if (i3 <= 1) { | ||||
|             freeArrays(this.mHashes, objArr, i3); | ||||
|             this.mHashes = ContainerHelpers.EMPTY_INTS; | ||||
|             this.mArray = ContainerHelpers.EMPTY_OBJECTS; | ||||
|         } else { | ||||
|             int i5 = i3 - 1; | ||||
|             int[] iArr = this.mHashes; | ||||
|             if (iArr.length > 8 && i3 < iArr.length / 3) { | ||||
|                 allocArrays(i3 > 8 ? i3 + (i3 >> 1) : 8); | ||||
|                 if (i3 != this.mSize) { | ||||
|                     throw new ConcurrentModificationException(); | ||||
|                 } | ||||
|                 if (i > 0) { | ||||
|                     System.arraycopy(iArr, 0, this.mHashes, 0, i); | ||||
|                     System.arraycopy(objArr, 0, this.mArray, 0, i2); | ||||
|                 } | ||||
|                 if (i < i5) { | ||||
|                     int i6 = i + 1; | ||||
|                     int i7 = i5 - i; | ||||
|                     System.arraycopy(iArr, i6, this.mHashes, i, i7); | ||||
|                     System.arraycopy(objArr, i6 << 1, this.mArray, i2, i7 << 1); | ||||
|                 } | ||||
|             } else { | ||||
|                 if (i < i5) { | ||||
|                     int i8 = i + 1; | ||||
|                     int i9 = i5 - i; | ||||
|                     System.arraycopy(iArr, i8, iArr, i, i9); | ||||
|                     Object[] objArr2 = this.mArray; | ||||
|                     System.arraycopy(objArr2, i8 << 1, objArr2, i2, i9 << 1); | ||||
|                 } | ||||
|                 Object[] objArr3 = this.mArray; | ||||
|                 int i10 = i5 << 1; | ||||
|                 objArr3[i10] = null; | ||||
|                 objArr3[i10 + 1] = null; | ||||
|             } | ||||
|             i4 = i5; | ||||
|         } | ||||
|         if (i3 != this.mSize) { | ||||
|             throw new ConcurrentModificationException(); | ||||
|         } | ||||
|         this.mSize = i4; | ||||
|         return v; | ||||
|     } | ||||
|  | ||||
|     public V replace(K k, V v) { | ||||
|         int indexOfKey = indexOfKey(k); | ||||
|         if (indexOfKey >= 0) { | ||||
|             return setValueAt(indexOfKey, v); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public boolean replace(K k, V v, V v2) { | ||||
|         int indexOfKey = indexOfKey(k); | ||||
|         if (indexOfKey < 0) { | ||||
|             return false; | ||||
|         } | ||||
|         V valueAt = valueAt(indexOfKey); | ||||
|         if (valueAt != v && (v == null || !v.equals(valueAt))) { | ||||
|             return false; | ||||
|         } | ||||
|         setValueAt(indexOfKey, v2); | ||||
|         return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|     } | ||||
|  | ||||
|     public boolean equals(Object obj) { | ||||
|         if (this == obj) { | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         if (obj instanceof SimpleArrayMap) { | ||||
|             SimpleArrayMap simpleArrayMap = (SimpleArrayMap) obj; | ||||
|             if (size() != simpleArrayMap.size()) { | ||||
|                 return false; | ||||
|             } | ||||
|             for (int i = 0; i < this.mSize; i++) { | ||||
|                 try { | ||||
|                     K keyAt = keyAt(i); | ||||
|                     V valueAt = valueAt(i); | ||||
|                     Object obj2 = simpleArrayMap.get(keyAt); | ||||
|                     if (valueAt == null) { | ||||
|                         if (obj2 != null || !simpleArrayMap.containsKey(keyAt)) { | ||||
|                             return false; | ||||
|                         } | ||||
|                     } else if (!valueAt.equals(obj2)) { | ||||
|                         return false; | ||||
|                     } | ||||
|                 } catch (ClassCastException | NullPointerException unused) { | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         if (obj instanceof Map) { | ||||
|             Map map = (Map) obj; | ||||
|             if (size() != map.size()) { | ||||
|                 return false; | ||||
|             } | ||||
|             for (int i2 = 0; i2 < this.mSize; i2++) { | ||||
|                 try { | ||||
|                     K keyAt2 = keyAt(i2); | ||||
|                     V valueAt2 = valueAt(i2); | ||||
|                     Object obj3 = map.get(keyAt2); | ||||
|                     if (valueAt2 == null) { | ||||
|                         if (obj3 != null || !map.containsKey(keyAt2)) { | ||||
|                             return false; | ||||
|                         } | ||||
|                     } else if (!valueAt2.equals(obj3)) { | ||||
|                         return false; | ||||
|                     } | ||||
|                 } catch (ClassCastException | NullPointerException unused2) { | ||||
|                 } | ||||
|             } | ||||
|             return CONCURRENT_MODIFICATION_EXCEPTIONS; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public int hashCode() { | ||||
|         int[] iArr = this.mHashes; | ||||
|         Object[] objArr = this.mArray; | ||||
|         int i = this.mSize; | ||||
|         int i2 = 1; | ||||
|         int i3 = 0; | ||||
|         int i4 = 0; | ||||
|         while (i3 < i) { | ||||
|             Object obj = objArr[i2]; | ||||
|             i4 += (obj == null ? 0 : obj.hashCode()) ^ iArr[i3]; | ||||
|             i3++; | ||||
|             i2 += 2; | ||||
|         } | ||||
|         return i4; | ||||
|     } | ||||
|  | ||||
|     public String toString() { | ||||
|         if (isEmpty()) { | ||||
|             return "{}"; | ||||
|         } | ||||
|         StringBuilder sb = new StringBuilder(this.mSize * 28); | ||||
|         sb.append('{'); | ||||
|         for (int i = 0; i < this.mSize; i++) { | ||||
|             if (i > 0) { | ||||
|                 sb.append(", "); | ||||
|             } | ||||
|             K keyAt = keyAt(i); | ||||
|             if (keyAt != this) { | ||||
|                 sb.append(keyAt); | ||||
|             } else { | ||||
|                 sb.append("(this Map)"); | ||||
|             } | ||||
|             sb.append('='); | ||||
|             V valueAt = valueAt(i); | ||||
|             if (valueAt != this) { | ||||
|                 sb.append(valueAt); | ||||
|             } else { | ||||
|                 sb.append("(this Map)"); | ||||
|             } | ||||
|         } | ||||
|         sb.append('}'); | ||||
|         return sb.toString(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user