< Summary

Information
Class: IceRpc.Transports.Internal.FlagEnumExtensions
Assembly: IceRpc
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Transports/Internal/FlagEnumExtensions.cs
Tag: 1986_28452893481
Line coverage
90%
Covered lines: 20
Uncovered lines: 2
Coverable lines: 22
Total lines: 41
Line coverage: 90.9%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage
100%
Covered methods: 4
Fully covered methods: 3
Total methods: 4
Method coverage: 100%
Full method coverage: 75%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
TrySetFlag(...)100%11100%
TrySetFlag(...)100%11100%
HasFlag(...)100%11100%
ClearFlag(...)50%2271.42%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Transports/Internal/FlagEnumExtensions.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using System.Runtime.CompilerServices;
 4
 5namespace IceRpc.Transports.Internal;
 6
 7/// <summary>The flag enum extensions help with atomically set/get enumeration flags on an integer value. The
 8/// enumeration underlying type must be an integer as well.</summary>
 9internal static class FlagEnumExtensions
 10{
 11    internal static bool TrySetFlag<T>(this ref int source, T flag) where T : Enum
 7810812    {
 7810813        int flagValue = Unsafe.As<T, int>(ref flag);
 7810814        int previousValue = Interlocked.Or(ref source, flagValue);
 7810815        return previousValue != (previousValue | flagValue);
 7810816    }
 17
 18    internal static bool TrySetFlag<T>(this ref int source, T flag, out int newValue) where T : Enum
 1331619    {
 1331620        int flagValue = Unsafe.As<T, int>(ref flag);
 1331621        int previousValue = Interlocked.Or(ref source, flagValue);
 1331622        newValue = previousValue | flagValue;
 1331623        return previousValue != newValue;
 1331624    }
 25
 26    internal static bool HasFlag<T>(this ref int source, T flag) where T : Enum
 21162827    {
 21162828        int flagValue = Unsafe.As<T, int>(ref flag);
 21162829        return (Volatile.Read(ref source) & flagValue) == flagValue;
 21162830    }
 31
 32    internal static void ClearFlag<T>(this ref int source, T flag) where T : Enum
 7076033    {
 7076034        int flagValue = Unsafe.As<T, int>(ref flag);
 7076035        int previousValue = Interlocked.And(ref source, ~flagValue);
 7076036        if (previousValue == (previousValue & ~flagValue))
 037        {
 038            throw new InvalidOperationException("The state was already cleared.");
 39        }
 7076040    }
 41}