File: Data\LinkedRowRootCursorBase.cs
Web Access
Project: src\src\Microsoft.ML.Core\Microsoft.ML.Core.csproj (Microsoft.ML.Core)
// 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.
 
using Microsoft.ML.Runtime;
 
namespace Microsoft.ML.Data;
 
/// <summary>
/// A base class for a <see cref="DataViewRowCursor"/> that has an input cursor, but still needs to do work on
/// <see cref="DataViewRowCursor.MoveNext"/>. Note that the default
/// <see cref="LinkedRowRootCursorBase.GetGetter{TValue}(DataViewSchema.Column)"/> assumes that each input column is exposed as an
/// output column with the same column index.
/// </summary>
[BestFriend]
internal abstract class LinkedRowRootCursorBase : LinkedRootCursorBase
{
    private readonly bool[] _active;
 
    /// <summary>Gets row's schema.</summary>
    public sealed override DataViewSchema Schema { get; }
 
    protected LinkedRowRootCursorBase(IChannelProvider provider, DataViewRowCursor input, DataViewSchema schema, bool[] active)
        : base(provider, input)
    {
        Ch.CheckValue(schema, nameof(schema));
        Ch.Check(active == null || active.Length == schema.Count);
        _active = active;
        Schema = schema;
    }
 
    /// <summary>
    /// Returns whether the given column is active in this row.
    /// </summary>
    public sealed override bool IsColumnActive(DataViewSchema.Column column)
    {
        Ch.Check(column.Index < Schema.Count);
        return _active == null || _active[column.Index];
    }
 
    /// <summary>
    /// Returns a value getter delegate to fetch the value of column with the given columnIndex, from the row.
    /// This throws if the column is not active in this row, or if the type
    /// <typeparamref name="TValue"/> differs from this column's type.
    /// </summary>
    /// <typeparam name="TValue"> is the column's content type.</typeparam>
    /// <param name="column"> is the output column whose getter should be returned.</param>
    public override ValueGetter<TValue> GetGetter<TValue>(DataViewSchema.Column column)
    {
        return Input.GetGetter<TValue>(column);
    }
}