Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / CompMod / System / Collections / Generic / BitHelper.cs / 1305376 / BitHelper.cs
using System; using System.Collections; using System.Text; namespace System.Collections.Generic { ////// ABOUT: /// Helps with operations that rely on bit marking to indicate whether an item in the /// collection should be added, removed, visited already, etc. /// /// BitHelper doesn't allocate the array; you must pass in an array or ints allocated on the /// stack or heap. ToIntArrayLength() tells you the int array size you must allocate. /// /// USAGE: /// Suppose you need to represent a bit array of length (i.e. logical bit array length) /// BIT_ARRAY_LENGTH. Then this is the suggested way to instantiate BitHelper: /// **************************************************************************** /// int intArrayLength = BitHelper.ToIntArrayLength(BIT_ARRAY_LENGTH); /// BitHelper bitHelper; /// if (intArrayLength less than stack alloc threshold) /// int* m_arrayPtr = stackalloc int[intArrayLength]; /// bitHelper = new BitHelper(m_arrayPtr, intArrayLength); /// else /// int[] m_arrayPtr = new int[intArrayLength]; /// bitHelper = new BitHelper(m_arrayPtr, intArrayLength); /// *************************************************************************** /// /// IMPORTANT: /// The second ctor args, length, should be specified as the length of the int array, not /// the logical bit array. Because length is used for bounds checking into the int array, /// it's especially important to get this correct for the stackalloc version. See the code /// samples above; this is the value gotten from ToIntArrayLength(). /// /// The length ctor argument is the only exception; for other methods -- MarkBit and /// IsMarked -- pass in values as indices into the logical bit array, and it will be mapped /// to the position within the array of ints. /// /// unsafe internal class BitHelper { // should not be serialized private const byte MarkedBitFlag = 1; private const byte IntSize = 32; // m_length of underlying int array (not logical bit array) private int m_length; // ptr to stack alloc'd array of ints private int* m_arrayPtr; // array of ints private int[] m_array; // whether to operate on stack alloc'd or heap alloc'd array private bool useStackAlloc; /// /// Instantiates a BitHelper with a heap alloc'd array of ints /// /// int array to hold bits /// length of int array //// [System.Security.SecurityCritical] internal BitHelper(int* bitArrayPtr, int length) { this.m_arrayPtr = bitArrayPtr; this.m_length = length; useStackAlloc = true; } ///// // /// Instantiates a BitHelper with a heap alloc'd array of ints /// /// int array to hold bits /// length of int array internal BitHelper(int[] bitArray, int length) { this.m_array = bitArray; this.m_length = length; } ////// Mark bit at specified position /// /// //// [System.Security.SecurityCritical] internal unsafe void MarkBit(int bitPosition) { if (useStackAlloc) { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { m_arrayPtr[bitArrayIndex] |= (MarkedBitFlag << (bitPosition % IntSize)); } } else { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { m_array[bitArrayIndex] |= (MarkedBitFlag << (bitPosition % IntSize)); } } } ///// /// Is bit at specified position marked? /// /// ///// // [System.Security.SecurityCritical] internal unsafe bool IsMarked(int bitPosition) { if (useStackAlloc) { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { return ((m_arrayPtr[bitArrayIndex] & (MarkedBitFlag << (bitPosition % IntSize))) != 0); } return false; } else { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { return ((m_array[bitArrayIndex] & (MarkedBitFlag << (bitPosition % IntSize))) != 0); } return false; } } ///// /// How many ints must be allocated to represent n bits. Returns (n+31)/32, but /// avoids overflow /// /// ///internal static int ToIntArrayLength(int n) { return n > 0 ? ((n - 1) / IntSize + 1) : 0; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections; using System.Text; namespace System.Collections.Generic { /// /// ABOUT: /// Helps with operations that rely on bit marking to indicate whether an item in the /// collection should be added, removed, visited already, etc. /// /// BitHelper doesn't allocate the array; you must pass in an array or ints allocated on the /// stack or heap. ToIntArrayLength() tells you the int array size you must allocate. /// /// USAGE: /// Suppose you need to represent a bit array of length (i.e. logical bit array length) /// BIT_ARRAY_LENGTH. Then this is the suggested way to instantiate BitHelper: /// **************************************************************************** /// int intArrayLength = BitHelper.ToIntArrayLength(BIT_ARRAY_LENGTH); /// BitHelper bitHelper; /// if (intArrayLength less than stack alloc threshold) /// int* m_arrayPtr = stackalloc int[intArrayLength]; /// bitHelper = new BitHelper(m_arrayPtr, intArrayLength); /// else /// int[] m_arrayPtr = new int[intArrayLength]; /// bitHelper = new BitHelper(m_arrayPtr, intArrayLength); /// *************************************************************************** /// /// IMPORTANT: /// The second ctor args, length, should be specified as the length of the int array, not /// the logical bit array. Because length is used for bounds checking into the int array, /// it's especially important to get this correct for the stackalloc version. See the code /// samples above; this is the value gotten from ToIntArrayLength(). /// /// The length ctor argument is the only exception; for other methods -- MarkBit and /// IsMarked -- pass in values as indices into the logical bit array, and it will be mapped /// to the position within the array of ints. /// /// unsafe internal class BitHelper { // should not be serialized private const byte MarkedBitFlag = 1; private const byte IntSize = 32; // m_length of underlying int array (not logical bit array) private int m_length; // ptr to stack alloc'd array of ints private int* m_arrayPtr; // array of ints private int[] m_array; // whether to operate on stack alloc'd or heap alloc'd array private bool useStackAlloc; /// /// Instantiates a BitHelper with a heap alloc'd array of ints /// /// int array to hold bits /// length of int array //// [System.Security.SecurityCritical] internal BitHelper(int* bitArrayPtr, int length) { this.m_arrayPtr = bitArrayPtr; this.m_length = length; useStackAlloc = true; } ///// // /// Instantiates a BitHelper with a heap alloc'd array of ints /// /// int array to hold bits /// length of int array internal BitHelper(int[] bitArray, int length) { this.m_array = bitArray; this.m_length = length; } ////// Mark bit at specified position /// /// //// [System.Security.SecurityCritical] internal unsafe void MarkBit(int bitPosition) { if (useStackAlloc) { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { m_arrayPtr[bitArrayIndex] |= (MarkedBitFlag << (bitPosition % IntSize)); } } else { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { m_array[bitArrayIndex] |= (MarkedBitFlag << (bitPosition % IntSize)); } } } ///// /// Is bit at specified position marked? /// /// ///// // [System.Security.SecurityCritical] internal unsafe bool IsMarked(int bitPosition) { if (useStackAlloc) { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { return ((m_arrayPtr[bitArrayIndex] & (MarkedBitFlag << (bitPosition % IntSize))) != 0); } return false; } else { int bitArrayIndex = bitPosition / IntSize; if (bitArrayIndex < m_length && bitArrayIndex >= 0) { return ((m_array[bitArrayIndex] & (MarkedBitFlag << (bitPosition % IntSize))) != 0); } return false; } } ///// /// How many ints must be allocated to represent n bits. Returns (n+31)/32, but /// avoids overflow /// /// ///internal static int ToIntArrayLength(int n) { return n > 0 ? ((n - 1) / IntSize + 1) : 0; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataGridRowHeader.cs
- SingleObjectCollection.cs
- CngUIPolicy.cs
- MetadataItem.cs
- X509ThumbprintKeyIdentifierClause.cs
- UriTemplateClientFormatter.cs
- XmlUtil.cs
- InlineObject.cs
- WebPartHeaderCloseVerb.cs
- Registration.cs
- Expander.cs
- FileReader.cs
- SQLDecimal.cs
- DecoderFallback.cs
- ItemCollection.cs
- UIElement3DAutomationPeer.cs
- WebZoneDesigner.cs
- WriteFileContext.cs
- SystemNetHelpers.cs
- ObjectDataSourceDesigner.cs
- ArrayList.cs
- DoubleLinkListEnumerator.cs
- EventMetadata.cs
- SafeHandles.cs
- PkcsUtils.cs
- WebPartDesigner.cs
- DataGridViewDataConnection.cs
- ServicePoint.cs
- XPathItem.cs
- QuaternionAnimation.cs
- PersonalizationState.cs
- CookieParameter.cs
- Inflater.cs
- ToolboxItemWrapper.cs
- DataGridColumnCollection.cs
- NameValueConfigurationCollection.cs
- ReverseComparer.cs
- BreakRecordTable.cs
- ResourceDisplayNameAttribute.cs
- HttpListenerResponse.cs
- IpcServerChannel.cs
- Expressions.cs
- TextDpi.cs
- EncoderExceptionFallback.cs
- Application.cs
- TripleDES.cs
- safesecurityhelperavalon.cs
- TransactionContextValidator.cs
- FloatUtil.cs
- FixedSOMContainer.cs
- SeparatorAutomationPeer.cs
- ObjectView.cs
- WindowsNonControl.cs
- BufferedStream.cs
- DataGridTableCollection.cs
- EmptyEnumerable.cs
- PartitionedStream.cs
- QueryStringParameter.cs
- RowCache.cs
- EventDescriptorCollection.cs
- ListenerSingletonConnectionReader.cs
- CommandDevice.cs
- StrongNamePublicKeyBlob.cs
- PackWebRequestFactory.cs
- DataServiceProcessingPipeline.cs
- StringBuilder.cs
- WebServiceParameterData.cs
- ToggleButtonAutomationPeer.cs
- ObjectTypeMapping.cs
- DataGridViewCellLinkedList.cs
- OdbcCommandBuilder.cs
- MimeXmlImporter.cs
- XmlChildEnumerator.cs
- MouseEvent.cs
- InertiaExpansionBehavior.cs
- DataGridItemEventArgs.cs
- ContextMenuStripActionList.cs
- ObjectStateEntry.cs
- ScrollEventArgs.cs
- listitem.cs
- DBDataPermissionAttribute.cs
- ProfilePropertySettingsCollection.cs
- ListViewItemCollectionEditor.cs
- UnsettableComboBox.cs
- DefaultValueAttribute.cs
- RegexInterpreter.cs
- ConfigXmlCDataSection.cs
- ValidationSettings.cs
- BamlStream.cs
- LeftCellWrapper.cs
- HttpClientCertificate.cs
- oledbconnectionstring.cs
- DocumentPageViewAutomationPeer.cs
- ScriptRegistrationManager.cs
- DockPatternIdentifiers.cs
- SafePipeHandle.cs
- SourceElementsCollection.cs
- BinaryMessageEncodingElement.cs
- WeakHashtable.cs
- SQLDoubleStorage.cs