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);
}
}
}