public DwarfAbbreviationItem GetOrCreate(DwarfAbbreviationItemKey itemKey)
        {
            if (!_mapKeyToItem.TryGetValue(itemKey, out var item))
            {
                item = new DwarfAbbreviationItem(_nextCode, itemKey.Tag, itemKey.HasChildren, itemKey.Descriptors)
                {
                    Parent = this
                };

                if (_mapItems.Count > 0)
                {
                    _mapItems[_nextCode] = item;
                }
                else
                {
                    _items.Add(item);
                }

                _mapKeyToItem[itemKey] = item;

                _nextCode++;
            }

            return(item);
        }
        private bool TryReadNext(DwarfReader reader)
        {
            var startOffset = (ulong)reader.Offset;
            var code        = reader.ReadULEB128();

            if (code == 0)
            {
                return(false);
            }

            var item = new DwarfAbbreviationItem
            {
                Offset = startOffset,
                Code   = code
            };

            var  index        = code - 1;
            bool canAddToList = _mapItems.Count == 0 && index < int.MaxValue && _items.Count == (int)index;

            item.ReadInternal(reader);

            if (canAddToList)
            {
                _items.Add(item);
                _nextCode++;
            }
            else
            {
                if (_mapItems.Count == 0)
                {
                    for (var i = 0; i < _items.Count; i++)
                    {
                        var previousItem = _items[i];
                        _mapItems.Add((ulong)i + 1, previousItem);
                    }
                    _items.Clear();
                }

                // TODO: check collisions
                if (_mapItems.ContainsKey(code))
                {
                    reader.Diagnostics.Error(DiagnosticId.DWARF_ERR_InvalidData, $"Invalid code {code} found while another code already exists in this abbreviation.");
                    return(false);
                }
                _mapItems.Add(code, item);

                _nextCode = Math.Max(code, _nextCode) + 1;
            }

            var key = new DwarfAbbreviationItemKey(item.Tag, item.HasChildren, item.Descriptors);

            _mapKeyToItem.Add(key, item);

            return(true);
        }