using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.CompilerServices; namespace SharpCompress; internal static class NotNullExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable Empty(this IEnumerable? source) => source ?? []; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable Empty(this T? source) { if (source is null) { return []; } return source.AsEnumerable(); } #if LEGACY_DOTNET [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T NotNull(this T? obj, string? message = null) where T : class { if (obj is null) { throw new ArgumentNullException(message ?? "Value is null"); } return obj; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T NotNull(this T? obj, string? message = null) where T : struct { if (obj is null) { throw new ArgumentNullException(message ?? "Value is null"); } return obj.Value; } #else [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T NotNull( [NotNull] this T? obj, [CallerArgumentExpression(nameof(obj))] string? paramName = null ) where T : class { ArgumentNullException.ThrowIfNull(obj, paramName); return obj; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T NotNull( [NotNull] this T? obj, [CallerArgumentExpression(nameof(obj))] string? paramName = null ) where T : struct { if (!obj.HasValue) { throw new ArgumentNullException(paramName); } return obj.Value; } #endif [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string NotNullOrEmpty(this string obj, string name) { obj.NotNull(name); if (obj.Length == 0) { throw new ArgumentException("String is empty.", name); } return obj; } }