Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Central numeric guard for MASVirtualizedItemsSystem contracts. It prevents NaN/Infinity values from entering range
    ''' planning, measurement-cache math, viewport facts, or scroll requests while keeping normalization inside the virtualization
    ''' foundation instead of scattering ad-hoc checks through consumers.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationNumericGuard

        Private Sub New()
        End Sub

        Friend Shared Function IsFinite(value As Single) As Boolean
            Return Not Single.IsNaN(value) AndAlso Not Single.IsInfinity(value)
        End Function

        Friend Shared Function IsFinite(value As Double) As Boolean
            Return Not Double.IsNaN(value) AndAlso Not Double.IsInfinity(value)
        End Function

        Friend Shared Function IsFinitePositive(value As Single) As Boolean
            Return IsFinite(value) AndAlso value > 0.0F
        End Function

        Friend Shared Function IsFinitePositive(value As Double) As Boolean
            Return IsFinite(value) AndAlso value > 0.0R
        End Function

        Friend Shared Function NormalizeNonNegative(value As Single) As Single
            If Not IsFinite(value) OrElse value <= 0.0F Then
                Return 0.0F
            End If

            Return value
        End Function

        Friend Shared Function NormalizeNonNegative(value As Double) As Double
            If Not IsFinite(value) OrElse value <= 0.0R Then
                Return 0.0R
            End If

            Return value
        End Function

        Friend Shared Function NormalizePositiveOrFallback(value As Single, fallback As Single) As Single
            If IsFinitePositive(value) Then
                Return value
            End If

            If IsFinitePositive(fallback) Then
                Return fallback
            End If

            Return 0.0F
        End Function

        Friend Shared Function NormalizePositiveOrFallback(value As Double, fallback As Double) As Double
            If IsFinitePositive(value) Then
                Return value
            End If

            If IsFinitePositive(fallback) Then
                Return fallback
            End If

            Return 0.0R
        End Function

        Friend Shared Function ToSingleSaturated(value As Double) As Single
            Dim normalized As Double = NormalizeNonNegative(value)
            If normalized <= 0.0R Then Return 0.0F
            If normalized >= CDbl(Single.MaxValue) Then Return Single.MaxValue
            Return CSng(normalized)
        End Function

    End Class

End Namespace
