Пример #1
0
        private RegionState GetBlock(int position, bool addIfMissing = true)
        {
            if (position <= 0)
            {
                throw new ArgumentException("Position must be greater than 0.");
            }

            if (_lastAccessedBlock != null && _lastAccessedBlock.ContainsPosition(position))  // performance improvement to remember last block
            {
                return(_lastAccessedBlock);
            }

            var blockKey = GetBlockKey(position);

            RegionState block;

            if (!_regionLookup.TryGetValue(blockKey, out block))
            {
                if (!addIfMissing)
                {
                    return(null);
                }

                block = CreateOrReuseBlock((blockKey - 1) * _regionSize + 1, blockKey * _regionSize);
                _regionLookup[blockKey] = block;
            }

            _lastAccessedBlock = block;
            return(block);
        }