| File: Data\LinkedRootCursorBase.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> /// Base class for a cursor has an input cursor, but still needs to do work on <see cref="DataViewRowCursor.MoveNext"/>. /// </summary> [BestFriend] internal abstract class LinkedRootCursorBase : RootCursorBase { /// <summary>Gets the input cursor.</summary> protected DataViewRowCursor Input { get; } /// <summary> /// Returns the root cursor of the input. It should be used to perform <see cref="DataViewRowCursor.MoveNext"/> /// operations, but with the distinction, as compared to <see cref="SynchronizedCursorBase"/>, that this is not /// a simple passthrough, but rather very implementation specific. For example, a common usage of this class is /// on filter cursor implementations, where how that input cursor is consumed is very implementation specific. /// That is why this is <see langword="protected"/>, not <see langword="private"/>. /// </summary> protected DataViewRowCursor Root { get; } private bool _disposed; protected LinkedRootCursorBase(IChannelProvider provider, DataViewRowCursor input) : base(provider) { Ch.AssertValue(input, nameof(input)); Input = input; Root = Input is SynchronizedCursorBase snycInput ? snycInput.Root : input; } protected override void Dispose(bool disposing) { if (_disposed) return; if (disposing) { Input.Dispose(); // The base class should set the state to done under these circumstances. } _disposed = true; base.Dispose(disposing); } }