コード例 #1
0
        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");
        }
コード例 #2
0
        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);
        }