private static bool AddInternal(CellCacheEntry[] arr, CellCacheEntry cce) { int startIx = cce.GetHashCode() % arr.Length; for (int i = startIx; i < arr.Length; i++) { CellCacheEntry item = arr[i]; if (item == cce) { // already present return(false); } if (item == null) { arr[i] = cce; return(true); } } for (int i = 0; i < startIx; i++) { CellCacheEntry item = arr[i]; if (item == cce) { // already present return(false); } if (item == null) { arr[i] = cce; return(true); } } throw new InvalidOperationException("No empty space found"); }
public bool Remove(CellCacheEntry cce) { FormulaCellCacheEntry[] arr = _arr; if (_size * 3 < _arr.Length && _arr.Length > 8) { // re-Hash bool found = false; FormulaCellCacheEntry[] prevArr = _arr; FormulaCellCacheEntry[] newArr = new FormulaCellCacheEntry[_arr.Length / 2]; // shrink 50% for (int i = 0; i < prevArr.Length; i++) { FormulaCellCacheEntry prevCce = _arr[i]; if (prevCce != null) { if (prevCce == cce) { found = true; _size--; // skip it continue; } AddInternal(newArr, prevCce); } } _arr = newArr; return(found); } // else - usual case // delete single element (without re-Hashing) int startIx = cce.GetHashCode() % arr.Length; // note - can't exit loops upon finding null because of potential previous deletes for (int i = startIx; i < arr.Length; i++) { FormulaCellCacheEntry item = arr[i]; if (item == cce) { // found it arr[i] = null; _size--; return(true); } } for (int i = 0; i < startIx; i++) { FormulaCellCacheEntry item = arr[i]; if (item == cce) { // found it arr[i] = null; _size--; return(true); } } return(false); }