File: System\Private\Windows\BinaryFormat\Support\StringRecordsCollection.cs
Web Access
Project: src\src\System.Private.Windows.Core\src\System.Private.Windows.Core.csproj (System.Private.Windows.Core)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Private.Windows.BinaryFormat.Serializer;
 
namespace System.Private.Windows.BinaryFormat;
 
/// <summary>
///  Helper to create and track records for <see cref="BinaryObjectString"/> and <see cref="MemberReference"/>
///  when duplicates are found.
/// </summary>
internal class StringRecordsCollection : IReadOnlyRecordMap
{
    private readonly Dictionary<string, int> _strings = [];
    private readonly Dictionary<int, MemberReference> _memberReferences = [];
 
    public int CurrentId { get; set; }
 
    public IRecord this[Id id] => _memberReferences[id];
 
    public StringRecordsCollection(int currentId) => CurrentId = currentId;
 
    /// <summary>
    ///  Returns the appropriate record for the given string.
    /// </summary>
    public IRecord? GetStringRecord(string? value)
    {
        if (value is null)
        {
            return null;
        }
 
        if (_strings.TryGetValue(value, out int id))
        {
            // The record with the data has already been retrieved, only a reference is needed now
            if (_memberReferences.TryGetValue(id, out MemberReference? memberReference))
            {
                return memberReference;
            }
 
            MemberReference reference = new(id);
            _memberReferences.Add(id, reference);
            return reference;
        }
 
        _strings[value] = CurrentId;
        IRecord record = new BinaryObjectString(CurrentId, value);
        CurrentId++;
        return record;
    }
}