Skip to content

Commit 3bbfe6c

Browse files
committed
Replace Unsafe.SizeOf<T>() with sizeof(T)
1 parent 2edbb0a commit 3bbfe6c

File tree

19 files changed

+44
-48
lines changed

19 files changed

+44
-48
lines changed

build/Community.Toolkit.Common.props

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
2323
<LangVersion>11.0</LangVersion>
2424
<Nullable>enable</Nullable>
25+
26+
<!--
27+
Suppress ref safety warnings in unsafe contexts (see https://github.com/dotnet/csharplang/issues/6476).
28+
This is used eg. to replace Unsafe.SizeOf<T>() calls with just sizeof(T). The warning is not necessary
29+
since in order to use these APIs the caller already has to be in an unsafe context.
30+
-->
31+
<NoWarn>$(NoWarn);CS8500</NoWarn>
2532
</PropertyGroup>
2633

2734
<PropertyGroup>

src/CommunityToolkit.Diagnostics/Extensions/ValueTypeExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static class ValueTypeExtensions
4444
public static unsafe string ToHexString<T>(this T value)
4545
where T : unmanaged
4646
{
47-
int sizeOfT = Unsafe.SizeOf<T>();
47+
int sizeOfT = sizeof(T);
4848
int bufferSize = (2 * sizeOfT) + 2;
4949
char* p = stackalloc char[bufferSize];
5050

src/CommunityToolkit.Diagnostics/Guard.String.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using System;
66
using System.Diagnostics.CodeAnalysis;
7-
using System.IO;
87
using System.Runtime.CompilerServices;
98

109
#pragma warning disable CS8777

src/CommunityToolkit.HighPerformance/Buffers/Internals/ArrayMemoryManager{TFrom,TTo}.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ public override Span<TTo> GetSpan()
7070
/// <inheritdoc/>
7171
public override unsafe MemoryHandle Pin(int elementIndex = 0)
7272
{
73-
if ((uint)elementIndex >= (uint)(this.length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>()))
73+
if ((uint)elementIndex >= (uint)(this.length * sizeof(TFrom) / sizeof(TTo)))
7474
{
7575
ThrowArgumentOutOfRangeExceptionForInvalidIndex();
7676
}
7777

78-
int bytePrefix = this.offset * Unsafe.SizeOf<TFrom>();
79-
int byteSuffix = elementIndex * Unsafe.SizeOf<TTo>();
78+
int bytePrefix = this.offset * sizeof(TFrom);
79+
int byteSuffix = elementIndex * sizeof(TTo);
8080
int byteOffset = bytePrefix + byteSuffix;
8181

8282
GCHandle handle = GCHandle.Alloc(this.array, GCHandleType.Pinned);

src/CommunityToolkit.HighPerformance/Buffers/Internals/ProxyMemoryManager{TFrom,TTo}.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using System;
66
using System.Buffers;
7-
using System.Runtime.CompilerServices;
87
using System.Runtime.InteropServices;
98
using CommunityToolkit.HighPerformance.Buffers.Internals.Interfaces;
109
using RuntimeHelpers = CommunityToolkit.HighPerformance.Helpers.Internals.RuntimeHelpers;
@@ -57,17 +56,17 @@ public override Span<TTo> GetSpan()
5756
}
5857

5958
/// <inheritdoc/>
60-
public override MemoryHandle Pin(int elementIndex = 0)
59+
public override unsafe MemoryHandle Pin(int elementIndex = 0)
6160
{
62-
if ((uint)elementIndex >= (uint)(this.length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>()))
61+
if ((uint)elementIndex >= (uint)(this.length * sizeof(TFrom) / sizeof(TTo)))
6362
{
6463
ThrowArgumentExceptionForInvalidIndex();
6564
}
6665

67-
int bytePrefix = this.offset * Unsafe.SizeOf<TFrom>();
68-
int byteSuffix = elementIndex * Unsafe.SizeOf<TTo>();
66+
int bytePrefix = this.offset * sizeof(TFrom);
67+
int byteSuffix = elementIndex * sizeof(TTo);
6968
int byteOffset = bytePrefix + byteSuffix;
70-
int shiftedOffset = Math.DivRem(byteOffset, Unsafe.SizeOf<TFrom>(), out int remainder);
69+
int shiftedOffset = Math.DivRem(byteOffset, sizeof(TFrom), out int remainder);
7170

7271
if (remainder != 0)
7372
{

src/CommunityToolkit.HighPerformance/Buffers/Internals/StringMemoryManager{TTo}.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ public override Span<TTo> GetSpan()
6666
/// <inheritdoc/>
6767
public override unsafe MemoryHandle Pin(int elementIndex = 0)
6868
{
69-
if ((uint)elementIndex >= (uint)(this.length * Unsafe.SizeOf<char>() / Unsafe.SizeOf<TTo>()))
69+
if ((uint)elementIndex >= (uint)(this.length * sizeof(char) / sizeof(TTo)))
7070
{
7171
ThrowArgumentOutOfRangeExceptionForInvalidIndex();
7272
}
7373

74-
int bytePrefix = this.offset * Unsafe.SizeOf<char>();
75-
int byteSuffix = elementIndex * Unsafe.SizeOf<TTo>();
74+
int bytePrefix = this.offset * sizeof(char);
75+
int byteSuffix = elementIndex * sizeof(TTo);
7676
int byteOffset = bytePrefix + byteSuffix;
7777

7878
GCHandle handle = GCHandle.Alloc(this.text, GCHandleType.Pinned);

src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ public static Stream AsStream(this IBufferWriter<byte> writer)
4545
/// <param name="writer">The target <see cref="IBufferWriter{T}"/> instance to write to.</param>
4646
/// <param name="value">The input value to write to <paramref name="writer"/>.</param>
4747
/// <exception cref="ArgumentException">Thrown if <paramref name="writer"/> reaches the end.</exception>
48-
public static void Write<T>(this IBufferWriter<byte> writer, T value)
48+
public static unsafe void Write<T>(this IBufferWriter<byte> writer, T value)
4949
where T : unmanaged
5050
{
51-
int length = Unsafe.SizeOf<T>();
51+
int length = sizeof(T);
5252
Span<byte> span = writer.GetSpan(1);
5353

5454
if (span.Length < length)

src/CommunityToolkit.HighPerformance/Extensions/ReadOnlySpanExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,13 @@ public static ReadOnlySpan2D<T> AsSpan2D<T>(this ReadOnlySpan<T> span, int offse
210210
/// <param name="value">The reference to the target item to get the index for.</param>
211211
/// <returns>The index of <paramref name="value"/> within <paramref name="span"/>, or <c>-1</c>.</returns>
212212
[MethodImpl(MethodImplOptions.AggressiveInlining)]
213-
public static int IndexOf<T>(this ReadOnlySpan<T> span, in T value)
213+
public static unsafe int IndexOf<T>(this ReadOnlySpan<T> span, in T value)
214214
{
215215
ref T r0 = ref MemoryMarshal.GetReference(span);
216216
ref T r1 = ref Unsafe.AsRef(value);
217217
IntPtr byteOffset = Unsafe.ByteOffset(ref r0, ref r1);
218218

219-
nint elementOffset = byteOffset / (nint)(uint)Unsafe.SizeOf<T>();
219+
nint elementOffset = byteOffset / (nint)(uint)sizeof(T);
220220

221221
if ((nuint)elementOffset >= (uint)span.Length)
222222
{

src/CommunityToolkit.HighPerformance/Extensions/SpanExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,12 @@ public static Span<TTo> Cast<TFrom, TTo>(this Span<TFrom> span)
148148
/// <param name="value">The reference to the target item to get the index for.</param>
149149
/// <returns>The index of <paramref name="value"/> within <paramref name="span"/>, or <c>-1</c>.</returns>
150150
[MethodImpl(MethodImplOptions.AggressiveInlining)]
151-
public static int IndexOf<T>(this Span<T> span, ref T value)
151+
public static unsafe int IndexOf<T>(this Span<T> span, ref T value)
152152
{
153153
ref T r0 = ref MemoryMarshal.GetReference(span);
154154
IntPtr byteOffset = Unsafe.ByteOffset(ref r0, ref value);
155155

156-
nint elementOffset = byteOffset / (nint)(uint)Unsafe.SizeOf<T>();
156+
nint elementOffset = byteOffset / (nint)(uint)sizeof(T);
157157

158158
if ((nuint)elementOffset >= (uint)span.Length)
159159
{

src/CommunityToolkit.HighPerformance/Extensions/StreamExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,12 @@ public static void Write(this Stream stream, ReadOnlySpan<byte> buffer)
202202
#if NETSTANDARD2_1_OR_GREATER
203203
[MethodImpl(MethodImplOptions.AggressiveInlining)]
204204
#endif
205-
public static T Read<T>(this Stream stream)
205+
public static unsafe T Read<T>(this Stream stream)
206206
where T : unmanaged
207207
{
208208
#if NETSTANDARD2_1_OR_GREATER
209209
T result = default;
210-
int length = Unsafe.SizeOf<T>();
210+
int length = sizeof(T);
211211

212212
unsafe
213213
{
@@ -219,7 +219,7 @@ public static T Read<T>(this Stream stream)
219219

220220
return result;
221221
#else
222-
int length = Unsafe.SizeOf<T>();
222+
int length = sizeof(T);
223223
byte[] buffer = ArrayPool<byte>.Shared.Rent(length);
224224

225225
try
@@ -247,19 +247,19 @@ public static T Read<T>(this Stream stream)
247247
#if NETSTANDARD2_1_OR_GREATER
248248
[MethodImpl(MethodImplOptions.AggressiveInlining)]
249249
#endif
250-
public static void Write<T>(this Stream stream, in T value)
250+
public static unsafe void Write<T>(this Stream stream, in T value)
251251
where T : unmanaged
252252
{
253253
#if NETSTANDARD2_1_OR_GREATER
254254
ref T r0 = ref Unsafe.AsRef(value);
255255
ref byte r1 = ref Unsafe.As<T, byte>(ref r0);
256-
int length = Unsafe.SizeOf<T>();
256+
int length = sizeof(T);
257257

258258
ReadOnlySpan<byte> span = MemoryMarshal.CreateReadOnlySpan(ref r1, length);
259259

260260
stream.Write(span);
261261
#else
262-
int length = Unsafe.SizeOf<T>();
262+
int length = sizeof(T);
263263
byte[] buffer = ArrayPool<byte>.Shared.Rent(length);
264264

265265
try

0 commit comments

Comments
 (0)