| #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); |
| } |
| } |