using System; namespace SharpCompress.Common { internal static class FlagUtility { /// /// Returns true if the flag is set on the specified bit field. /// Currently only works with 32-bit bitfields. /// /// Enumeration with Flags attribute /// Flagged variable /// Flag to test /// public static bool HasFlag(long bitField, T flag) where T : struct { return HasFlag(bitField, flag); } /// /// Returns true if the flag is set on the specified bit field. /// Currently only works with 32-bit bitfields. /// /// Enumeration with Flags attribute /// Flagged variable /// Flag to test /// public static bool HasFlag(ulong bitField, T flag) where T : struct { return HasFlag(bitField, flag); } /// /// Returns true if the flag is set on the specified bit field. /// Currently only works with 32-bit bitfields. /// /// Flagged variable /// Flag to test /// public static bool HasFlag(ulong bitField, ulong flag) { return ((bitField & flag) == flag); } public static bool HasFlag(short bitField, short flag) { return ((bitField & flag) == flag); } #if PORTABLE /// /// Generically checks enums in a Windows Phone 7 enivronment /// /// /// /// public static bool HasFlag(this Enum enumVal, Enum flag) { if (enumVal.GetHashCode() > 0) //GetHashCode returns the enum value. But it's something very crazy if not set beforehand { ulong num = Convert.ToUInt64(flag.GetHashCode()); return ((Convert.ToUInt64(enumVal.GetHashCode()) & num) == num); } else { return false; } } #endif /// /// Returns true if the flag is set on the specified bit field. /// Currently only works with 32-bit bitfields. /// /// Enumeration with Flags attribute /// Flagged variable /// Flag to test /// public static bool HasFlag(T bitField, T flag) where T : struct { return HasFlag(Convert.ToInt64(bitField), Convert.ToInt64(flag)); } /// /// Returns true if the flag is set on the specified bit field. /// Currently only works with 32-bit bitfields. /// /// Flagged variable /// Flag to test /// public static bool HasFlag(long bitField, long flag) { return ((bitField & flag) == flag); } /// /// Sets a bit-field to either on or off for the specified flag. /// /// Flagged variable /// Flag to change /// bool /// The flagged variable with the flag changed public static long SetFlag(long bitField, long flag, bool @on) { if (@on) { return bitField | flag; } return bitField & (~flag); } /// /// Sets a bit-field to either on or off for the specified flag. /// /// Enumeration with Flags attribute /// Flagged variable /// Flag to change /// bool /// The flagged variable with the flag changed public static long SetFlag(T bitField, T flag, bool @on) where T : struct { return SetFlag(Convert.ToInt64(bitField), Convert.ToInt64(flag), @on); } } }