/// <summary>
 /// Determines whether all of the flags in <paramref name="desiredFlags"/>
 /// </summary>
 /// <param name="value">Value to test</param>
 /// <param name="desiredFlags">Flags we wish to find</param>
 /// <returns>Whether all the flags in <paramref name="desiredFlags"/> are in <paramref name="value"/>.</returns>
 /// <exception cref="TypeArgumentException"><typeparamref name="T"/> is not a flags enum.</exception>
 public static bool HasAll <T>(this T value, T desiredFlags) where T : struct, IEnumConstraint
 {
     ThrowIfNotFlags <T>();
     return(EnumInternals <T> .Equality(value.And(desiredFlags), desiredFlags));
 }
 /// <summary>
 /// Returns the inverse of a value, with no consideration for which bits are used
 /// by values within the enum (i.e. a simple bitwise negation).
 /// </summary>
 /// <typeparam name="T">Enum type</typeparam>
 /// <param name="value">Value to invert</param>
 /// <returns>The bitwise negation of the value</returns>
 /// <exception cref="TypeArgumentException"><typeparamref name="T"/> is not a flags enum.</exception>
 public static T AllBitsInverse <T>(this T value) where T : struct, IEnumConstraint
 {
     ThrowIfNotFlags <T>();
     return(EnumInternals <T> .Not(value));
 }
 /// <summary>
 /// Returns whether this value is an empty set of fields, i.e. the zero value.
 /// </summary>
 /// <typeparam name="T">Enum type</typeparam>
 /// <param name="value">Value to test</param>
 /// <returns>True if the value is empty (zero); False otherwise.</returns>
 /// <exception cref="TypeArgumentException"><typeparamref name="T"/> is not a flags enum.</exception>
 public static bool IsEmpty <T>(this T value) where T : struct, IEnumConstraint
 {
     ThrowIfNotFlags <T>();
     return(EnumInternals <T> .IsEmpty(value));
 }
 /// <summary>
 /// Returns the bitwise "or" of two values.
 /// </summary>
 /// internal static
 /// <param name="first">First value</param>
 /// <param name="second">Second value</param>
 /// <returns>The bitwise "or" of the two values</returns>
 /// <exception cref="TypeArgumentException"><typeparamref name="T"/> is not a flags enum.</exception>
 public static T Or <T>(this T first, T second) where T : struct, IEnumConstraint
 {
     ThrowIfNotFlags <T>();
     return(EnumInternals <T> .Or(first, second));
 }