blob: 5c4061e9b4bdd0d26571b7608a413574fd01449a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using System.Runtime.CompilerServices;
namespace System.Buffers
{
/// <summary>
/// Manager of <see cref="System.Memory{T}"/> that provides the implementation.
/// </summary>
public abstract class MemoryManager<T> : IMemoryOwner<T>, IPinnable
{
/// <summary>
/// Returns a <see cref="System.Memory{T}"/>.
/// </summary>
public virtual Memory<T> Memory => new Memory<T>(this, GetSpan().Length);
/// <summary>
/// Returns a span wrapping the underlying memory.
/// </summary>
public abstract Span<T> GetSpan();
/// <summary>
/// Returns a handle to the memory that has been pinned and hence its address can be taken.
/// </summary>
/// <param name="elementIndex">The offset to the element within the memory at which the returned <see cref="MemoryHandle"/> points to. (default = 0)</param>
public abstract MemoryHandle Pin(int elementIndex = 0);
/// <summary>
/// Lets the garbage collector know that the object is free to be moved now.
/// </summary>
public abstract void Unpin();
/// <summary>
/// Returns a <see cref="System.Memory{T}"/> for the current <see cref="MemoryManager{T}"/>.
/// </summary>
/// <param name="length">The element count in the memory, starting at offset 0.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected Memory<T> CreateMemory(int length) => new Memory<T>(this, length);
/// <summary>
/// Returns a <see cref="System.Memory{T}"/> for the current <see cref="MemoryManager{T}"/>.
/// </summary>
/// <param name="start">The offset to the element which the returned memory starts at.</param>
/// <param name="length">The element count in the memory, starting at element offset <paramref name="start"/>.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected Memory<T> CreateMemory(int start, int length) => new Memory<T>(this, start, length);
/// <summary>
/// Returns an array segment.
/// <remarks>Returns the default array segment if not overriden.</remarks>
/// </summary>
protected internal virtual bool TryGetArray(out ArraySegment<T> segment)
{
segment = default;
return false;
}
/// <summary>
/// Implements IDisposable.
/// </summary>
void IDisposable.Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Clean up of any leftover managed and unmanaged resources.
/// </summary>
protected abstract void Dispose(bool disposing);
}
}
|