SimpleBitVector32.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / Util / SimpleBitVector32.cs / 1305376 / SimpleBitVector32.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Web.Util { 
    using System; 

    // 
    // This is a cut down copy of System.Collections.Specialized.BitVector32. The
    // reason this is here is because it is used rather intensively by Control and
    // WebControl. As a result, being able to inline this operations results in a
    // measurable performance gain, at the expense of some maintainability. 
    //
    [Serializable] 
    internal struct SimpleBitVector32 { 
        private int data;
 
        internal SimpleBitVector32(int data) {
            this.data = data;
        }
 
        internal int IntegerValue {
            get { return data; } 
            set { data = value; } 
        }
 
        internal bool this[int bit] {
            get {
                return (data & bit) == bit;
            } 
            set {
                int _data = data; 
                if(value) { 
                    data = _data | bit;
                } 
                else {
                    data = _data & ~bit;
                }
            } 
        }
 
        // Stores and retrieves a positive integer in the bit vector.  The "mask" parameter selects the bits 
        // to use in the vector, and the "offset" parameter is the index of the rightmost bit in the
        // mask.  The offset could be calculated from the mask, but is passed in as a separate constant 
        // for improved performance.  NOTE: Because the data field is a signed integer, only 31 of the 32
        // available bits may be used.
        // Example: To store a 4-bit integer in bits 4-7, use mask=0x000000F0 and offset=4.
        internal int this[int mask, int offset] { 
            get {
#if DEBUG 
                VerifyMaskAndOffset(mask, offset); 
#endif
                return ((data & mask) >> offset); 
            }
            set {
#if DEBUG
                VerifyMaskAndOffset(mask, offset); 
#endif
                Debug.Assert(value >= 0, "Value must be non-negative."); 
 
                Debug.Assert(((value << offset) & ~mask) == 0, "Value must fit within the mask.");
 
                data = (data & ~mask) | (value << offset);
            }
        }
 
#if DEBUG
        private void VerifyMaskAndOffset(int mask, int offset) { 
            Debug.Assert(mask > 0, "Mask must be nonempty and non-negative."); 

            // Offset must be between 0 and 30 inclusive, since only 31 bits are available and at least one bit must be used. 
            Debug.Assert(offset >= 0 && offset <= 30, "Offset must be between 0 and 30 inclusive.");

            Debug.Assert((mask & ((1 << offset) - 1)) == 0, "All mask bits to the right of the offset index must be zero.");
 
            Debug.Assert(((mask >> offset) & 1) == 1, "The mask bit at the offset index must be one.");
        } 
#endif 

        internal void Set(int bit) { 
            data |= bit;
        }

        internal void Clear(int bit) { 
            data &= ~bit;
        } 
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK