123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace BDInfo
- {
- using System.Diagnostics;
- using System.Text;
- using System;
- /// <devdoc>
- /// <para>Provides a simple light bit vector with easy integer or Boolean access to
- /// a 32 bit storage.</para>
- /// </devdoc>
- public struct BitVector32
- {
- private uint data;
- /// <devdoc>
- /// <para>Initializes a new instance of the BitVector32 structure with the specified internal data.</para>
- /// </devdoc>
- public BitVector32(int data)
- {
- this.data = (uint)data;
- }
- /// <devdoc>
- /// <para>Initializes a new instance of the BitVector32 structure with the information in the specified
- /// value.</para>
- /// </devdoc>
- public BitVector32(BitVector32 value)
- {
- this.data = value.data;
- }
- /// <devdoc>
- /// <para>Gets or sets a value indicating whether all the specified bits are set.</para>
- /// </devdoc>
- public bool this[int bit]
- {
- get
- {
- return (data & bit) == (uint)bit;
- }
- set
- {
- if (value)
- {
- data |= (uint)bit;
- }
- else
- {
- data &= ~(uint)bit;
- }
- }
- }
- /// <devdoc>
- /// <para>Gets or sets the value for the specified section.</para>
- /// </devdoc>
- public int this[Section section]
- {
- get
- {
- return (int)((data & (uint)(section.Mask << section.Offset)) >> section.Offset);
- }
- set
- {
- value <<= section.Offset;
- int offsetMask = (0xFFFF & (int)section.Mask) << section.Offset;
- data = (data & ~(uint)offsetMask) | ((uint)value & (uint)offsetMask);
- }
- }
- /// <devdoc>
- /// returns the raw data stored in this bit vector...
- /// </devdoc>
- public int Data
- {
- get
- {
- return (int)data;
- }
- }
- private static short CountBitsSet(short mask)
- {
- // yes, I know there are better algorithms, however, we know the
- // bits are always right aligned, with no holes (i.e. always 00000111,
- // never 000100011), so this is just fine...
- //
- short value = 0;
- while ((mask & 0x1) != 0)
- {
- value++;
- mask >>= 1;
- }
- return value;
- }
- /// <devdoc>
- /// <para> Creates the first mask in a series.</para>
- /// </devdoc>
- public static int CreateMask()
- {
- return CreateMask(0);
- }
- /// <devdoc>
- /// Creates the next mask in a series.
- /// </devdoc>
- public static int CreateMask(int previous)
- {
- if (previous == 0)
- {
- return 1;
- }
- if (previous == unchecked((int)0x80000000))
- {
- throw new InvalidOperationException("Bit vector full");
- }
- return previous << 1;
- }
- /// <devdoc>
- /// Given a highValue, creates the mask
- /// </devdoc>
- private static short CreateMaskFromHighValue(short highValue)
- {
- short required = 16;
- while ((highValue & 0x8000) == 0)
- {
- required--;
- highValue <<= 1;
- }
- ushort value = 0;
- while (required > 0)
- {
- required--;
- value <<= 1;
- value |= 0x1;
- }
- return unchecked((short)value);
- }
- /// <devdoc>
- /// <para>Creates the first section in a series, with the specified maximum value.</para>
- /// </devdoc>
- public static Section CreateSection(short maxValue)
- {
- return CreateSectionHelper(maxValue, 0, 0);
- }
- /// <devdoc>
- /// <para>Creates the next section in a series, with the specified maximum value.</para>
- /// </devdoc>
- public static Section CreateSection(short maxValue, Section previous)
- {
- return CreateSectionHelper(maxValue, previous.Mask, previous.Offset);
- }
- private static Section CreateSectionHelper(short maxValue, short priorMask, short priorOffset)
- {
- if (maxValue < 1)
- {
- throw new ArgumentOutOfRangeException("maxValue");
- }
- #if DEBUG
- int maskCheck = CreateMaskFromHighValue(maxValue);
- int offsetCheck = priorOffset + CountBitsSet(priorMask);
- Debug.Assert(maskCheck <= short.MaxValue && offsetCheck < 32, "Overflow on BitVector32");
- #endif
- short offset = (short)(priorOffset + CountBitsSet(priorMask));
- if (offset >= 32)
- {
- throw new InvalidOperationException("Bit vector full");
- }
- return new Section(CreateMaskFromHighValue(maxValue), offset);
- }
- public override bool Equals(object o)
- {
- if (!(o is BitVector32))
- {
- return false;
- }
- return data == ((BitVector32)o).data;
- }
- public override int GetHashCode()
- {
- return base.GetHashCode();
- }
- /// <devdoc>
- /// </devdoc>
- public static string ToString(BitVector32 value)
- {
- StringBuilder sb = new StringBuilder(/*"BitVector32{".Length*/12 + /*32 bits*/32 + /*"}".Length"*/1);
- sb.Append("BitVector32{");
- int locdata = (int)value.data;
- for (int i = 0; i < 32; i++)
- {
- if ((locdata & 0x80000000) != 0)
- {
- sb.Append("1");
- }
- else
- {
- sb.Append("0");
- }
- locdata <<= 1;
- }
- sb.Append("}");
- return sb.ToString();
- }
- /// <devdoc>
- /// </devdoc>
- public override string ToString()
- {
- return BitVector32.ToString(this);
- }
- /// <devdoc>
- /// <para>
- /// Represents an section of the vector that can contain a integer number.</para>
- /// </devdoc>
- public struct Section
- {
- private readonly short mask;
- private readonly short offset;
- internal Section(short mask, short offset)
- {
- this.mask = mask;
- this.offset = offset;
- }
- public short Mask
- {
- get
- {
- return mask;
- }
- }
- public short Offset
- {
- get
- {
- return offset;
- }
- }
- public override bool Equals(object o)
- {
- if (o is Section)
- return Equals((Section)o);
- else
- return false;
- }
- public bool Equals(Section obj)
- {
- return obj.mask == mask && obj.offset == offset;
- }
- public static bool operator ==(Section a, Section b)
- {
- return a.Equals(b);
- }
- public static bool operator !=(Section a, Section b)
- {
- return !(a == b);
- }
- public override int GetHashCode()
- {
- return base.GetHashCode();
- }
- /// <devdoc>
- /// </devdoc>
- public static string ToString(Section value)
- {
- return "Section{0x" + Convert.ToString(value.Mask, 16) + ", 0x" + Convert.ToString(value.Offset, 16) + "}";
- }
- /// <devdoc>
- /// </devdoc>
- public override string ToString()
- {
- return Section.ToString(this);
- }
- }
- }
- }
|