File: Windows\Win32\System\Com\ComPointerList.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.
 
namespace Windows.Win32.Foundation;
 
/// <summary>
///  Simple list for "typed" COM struct pointer storage. Prevents nulls.
/// </summary>
/// <remarks>
///  <para>
///   Doesn't implement generic interfaces as pointer types can't be used as generic arguments.
///  </para>
/// </remarks>
internal unsafe class ComPointerList<T> where T : unmanaged, IComIID
{
    private readonly List<nint> _pointers = [];
 
    public int Count => _pointers.Count;
 
    public T* this[int index] => (T*)_pointers[index];
 
    public void Add(T* item)
    {
        if (item is null)
            throw new ArgumentNullException(nameof(item));
 
        _pointers.Add((nint)item);
    }
 
    public bool Remove(T* item)
    {
        return item is null ? throw new ArgumentNullException(nameof(item)) : _pointers.Remove((nint)item);
    }
 
    public void RemoveAt(int index) => _pointers.RemoveAt(index);
 
    public void Clear() => _pointers.Clear();
 
    public int IndexOf(T* item) => _pointers.IndexOf((nint)item);
}