File: Resources\BorrowedMemoryManager.cs
Web Access
Project: Microsoft.DotNet.Cli.CoreUtils.csproj (Microsoft.DotNet.Cli.CoreUtils)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.DotNet.Cli.Resources.Internal;

/// <summary>
///  Exposes caller-owned unmanaged memory as <see cref="Memory{T}"/> without taking ownership.
/// </summary>
internal sealed unsafe class BorrowedMemoryManager : MemoryManager<byte>
{
    private readonly byte* _pointer;
    private readonly int _length;

    /// <summary>
    ///  Initializes a manager over caller-owned unmanaged memory.
    /// </summary>
    /// <param name="pointer">A pointer to the first byte.</param>
    /// <param name="length">The number of bytes available from <paramref name="pointer"/>.</param>
    internal BorrowedMemoryManager(byte* pointer, int length)
    {
        _pointer = pointer;
        _length = length;
    }

    /// <inheritdoc/>
    public override Span<byte> GetSpan() => new(_pointer, _length);

    /// <inheritdoc/>
    public override MemoryHandle Pin(int elementIndex = 0)
    {
        ArgumentOutOfRangeException.ThrowIfGreaterThan((uint)elementIndex, (uint)_length);
        return new(_pointer + elementIndex);
    }

    /// <inheritdoc/>
    public override void Unpin()
    {
    }

    /// <inheritdoc/>
    protected override void Dispose(bool disposing)
    {
    }
}