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, IConvertible
{
return HasFlag(bitField, flag.ToInt64(null));
}
///
/// 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, IConvertible
{
return HasFlag(bitField, flag.ToUInt64(null));
}
///
/// 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
#if THREEFIVE
///
/// Generically checks enums in a .NET 3.5
///
///
///
///
public static bool HasFlag(this Enum enumVal, Enum flag)
{
return (Convert.ToInt32(enumVal) & Convert.ToInt32(flag)) == Convert.ToInt32(flag);
}
#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.
///
/// Enumeration with Flags attribute
/// Flagged variable
/// Flag to change
/// bool
/// The flagged variable with the flag changed
public static long SetFlag(long bitField, T flag, bool @on)
where T : struct, IConvertible
{
if (@on)
{
return bitField | flag.ToInt64(null);
}
else
{
return bitField & (~flag.ToInt64(null));
}
}
///
/// 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, IConvertible
{
return SetFlag(bitField.ToInt64(null), flag, @on);
}
}
}