blob: 02391465721dcb6be46cfe0296d5de04a925a678 [file] [log] [blame]
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#endregion
using System;
using System.Security;
using Google.Protobuf.Collections;
namespace Google.Protobuf;
/// <summary>
/// An unsafe class that provides a set of methods to access the underlying data representations of
/// collections.
/// </summary>
[SecuritySafeCritical]
public static class UnsafeCollectionOperations
{
/// <summary>
/// <para>
/// Returns a <see cref="Span{T}"/> that wraps the current backing array of the given
/// <see cref="RepeatedField{T}"/>.
/// </para>
/// <para>
/// Values in the <see cref="Span{T}"/> should not be set to null. Use
/// <see cref="RepeatedField{T}.Remove(T)"/> or <see cref="RepeatedField{T}.RemoveAt(int)"/> to
/// remove items instead.
/// </para>
/// <para>
/// The returned <see cref="Span{T}"/> is only valid until the size of the
/// <see cref="RepeatedField{T}"/> is modified, after which its state becomes undefined.
/// Modifying existing elements without changing the size is safe as long as the modifications
/// do not set null values.
/// </para>
/// </summary>
/// <typeparam name="T">
/// The type of elements in the <see cref="RepeatedField{T}"/>.
/// </typeparam>
/// <param name="field">
/// The <see cref="RepeatedField{T}"/> for which to wrap the current backing array. Must not be
/// null.
/// </param>
/// <returns>
/// A <see cref="Span{T}"/> that wraps the current backing array of the
/// <see cref="RepeatedField{T}"/>.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Thrown if <paramref name="field"/> is <see langword="null"/>.
/// </exception>
public static Span<T> AsSpan<T>(RepeatedField<T> field)
{
ProtoPreconditions.CheckNotNull(field, nameof(field));
return field.AsSpan();
}
/// <summary>
/// <para>
/// Sets the count of the specified <see cref="RepeatedField{T}"/> to the given value.
/// </para>
/// <para>
/// This method should only be called if the subsequent code guarantees to populate
/// the field with the specified number of items.
/// </para>
/// <para>
/// If count is less than <see cref="RepeatedField{T}.Count"/>, the collection is effectively
/// trimmed down to the first count elements. <see cref="RepeatedField{T}.Capacity"/>
/// is unchanged, meaning the underlying array remains allocated.
/// </para>
/// </summary>
/// <typeparam name="T">
/// The type of elements in the <see cref="RepeatedField{T}"/>.
/// </typeparam>
/// <param name="field">
/// The field to set the count of. Must not be null.
/// </param>
/// <param name="count">
/// The value to set the field's count to. Must be non-negative.
/// </param>
/// <exception cref="ArgumentNullException">
/// Thrown if <paramref name="field"/> is <see langword="null"/>.
/// </exception>
/// <exception cref="ArgumentOutOfRangeException">
/// Thrown if <paramref name="count"/> is negative.
/// </exception>
public static void SetCount<T>(RepeatedField<T> field, int count)
{
ProtoPreconditions.CheckNotNull(field, nameof(field));
field.SetCount(count);
}
}