File: RenderTree\ArrayBuilderSegment.cs
Web Access
Project: src\src\Components\Components\src\Microsoft.AspNetCore.Components.csproj (Microsoft.AspNetCore.Components)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable enable
 
using System.Collections;
 
namespace Microsoft.AspNetCore.Components.RenderTree;
 
/// <summary>
/// Types in the Microsoft.AspNetCore.Components.RenderTree are not recommended for use outside
/// of the Blazor framework. These types will change in future release.
/// </summary>
/// <typeparam name="T">The type of the elements in the array</typeparam>
//
// Represents a range of elements within an instance of <see cref="ArrayBuilder{T}"/>.
public readonly struct ArrayBuilderSegment<T> : IEnumerable<T>
{
    // The following fields are memory mapped to the WASM client. Do not re-order or use auto-properties.
    private readonly ArrayBuilder<T>? _builder;
    private readonly int _offset;
    private readonly int _count;
 
    internal ArrayBuilderSegment(ArrayBuilder<T> builder, int offset, int count)
    {
        _builder = builder;
        _offset = offset;
        _count = count;
    }
 
    /// <summary>
    /// Gets the current underlying array holding the segment's elements.
    /// </summary>
    public T[] Array => _builder?.Buffer ?? System.Array.Empty<T>();
 
    /// <summary>
    /// Gets the offset into the underlying array holding the segment's elements.
    /// </summary>
    public int Offset => _offset;
 
    /// <summary>
    /// Gets the number of items in the segment.
    /// </summary>
    public int Count => _count;
 
    /// <summary>
    /// Gets the specified item from the segment.
    /// </summary>
    /// <param name="index">The index into the segment.</param>
    /// <returns>The array entry at the specified index within the segment.</returns>
    public T this[int index]
        => Array[_offset + index];
 
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
        => ((IEnumerable<T>)new ArraySegment<T>(Array, _offset, _count)).GetEnumerator();
 
    IEnumerator IEnumerable.GetEnumerator()
        => ((IEnumerable)new ArraySegment<T>(Array, _offset, _count)).GetEnumerator();
 
    // TODO: If this assembly later moves to netstandard2.1, consider adding a public
    // GetEnumerator method that returns ArraySegment.Enumerator to avoid boxing.
}