Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Xml / System / Xml / BitStack.cs / 1 / BitStack.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml { using System; using System.Diagnostics; ////// Manages a stack of bits. Exposes push, pop, and peek operations. /// internal class BitStack { private uint[] bitStack; private int stackPos; private uint curr; ////// Initialize stack. /// public BitStack() { // Set sentinel bit in 1st position. As bits are shifted onto this.curr, this sentinel // bit shifts to the left. When it's about to overflow, this.curr will be pushed // onto an unsigned int stack and the sentinel bit will be reset to 0x1. this.curr = 0x1; } ////// Push a 0 or 1 bit onto the stack. /// public void PushBit(bool bit) { if ((this.curr & 0x80000000) != 0) { // If sentinel bit has reached the last position, push this.curr PushCurr(); } // Shift new bit onto this.curr (which must have at least one open position) this.curr = (this.curr << 1) | (bit ? 1u : 0u); } ////// Pop the top bit from the stack and return it. /// public bool PopBit() { bool bit; Debug.Assert(this.curr != 0x1, "Stack empty"); // Shift rightmost bit from this.curr bit = (this.curr & 0x1) != 0; this.curr >>= 1; if (this.curr == 0x1) { // If sentinel bit has reached the rightmost position, pop this.curr PopCurr(); } return bit; } ////// Return the top bit on the stack without pushing or popping. /// public bool PeekBit() { Debug.Assert(this.curr != 0x1, "Stack empty"); return (this.curr & 0x1) != 0; } ////// Return true if there are currently no bits on the stack. /// public bool IsEmpty { get { return this.curr == 0x1; } } ////// this.curr has enough space for 31 bits (minus 1 for sentinel bit). Once this space is /// exhausted, a uint stack is created to handle the overflow. /// private void PushCurr() { int len; if (this.bitStack == null) { this.bitStack = new uint[16]; } // Push current unsigned int (which has been filled) onto a stack // and initialize this.curr to be used for future pushes. this.bitStack[this.stackPos++] = this.curr; this.curr = 0x1; // Resize stack if necessary len = this.bitStack.Length; if (this.stackPos >= len) { uint[] bitStackNew = new uint[2 * len]; Array.Copy(this.bitStack, bitStackNew, len); this.bitStack = bitStackNew; } } ////// If all bits have been popped from this.curr, then pop the previous uint value from the stack in /// order to provide another 31 bits. /// private void PopCurr() { if (this.stackPos > 0) this.curr = this.bitStack[--this.stackPos]; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml { using System; using System.Diagnostics; ////// Manages a stack of bits. Exposes push, pop, and peek operations. /// internal class BitStack { private uint[] bitStack; private int stackPos; private uint curr; ////// Initialize stack. /// public BitStack() { // Set sentinel bit in 1st position. As bits are shifted onto this.curr, this sentinel // bit shifts to the left. When it's about to overflow, this.curr will be pushed // onto an unsigned int stack and the sentinel bit will be reset to 0x1. this.curr = 0x1; } ////// Push a 0 or 1 bit onto the stack. /// public void PushBit(bool bit) { if ((this.curr & 0x80000000) != 0) { // If sentinel bit has reached the last position, push this.curr PushCurr(); } // Shift new bit onto this.curr (which must have at least one open position) this.curr = (this.curr << 1) | (bit ? 1u : 0u); } ////// Pop the top bit from the stack and return it. /// public bool PopBit() { bool bit; Debug.Assert(this.curr != 0x1, "Stack empty"); // Shift rightmost bit from this.curr bit = (this.curr & 0x1) != 0; this.curr >>= 1; if (this.curr == 0x1) { // If sentinel bit has reached the rightmost position, pop this.curr PopCurr(); } return bit; } ////// Return the top bit on the stack without pushing or popping. /// public bool PeekBit() { Debug.Assert(this.curr != 0x1, "Stack empty"); return (this.curr & 0x1) != 0; } ////// Return true if there are currently no bits on the stack. /// public bool IsEmpty { get { return this.curr == 0x1; } } ////// this.curr has enough space for 31 bits (minus 1 for sentinel bit). Once this space is /// exhausted, a uint stack is created to handle the overflow. /// private void PushCurr() { int len; if (this.bitStack == null) { this.bitStack = new uint[16]; } // Push current unsigned int (which has been filled) onto a stack // and initialize this.curr to be used for future pushes. this.bitStack[this.stackPos++] = this.curr; this.curr = 0x1; // Resize stack if necessary len = this.bitStack.Length; if (this.stackPos >= len) { uint[] bitStackNew = new uint[2 * len]; Array.Copy(this.bitStack, bitStackNew, len); this.bitStack = bitStackNew; } } ////// If all bits have been popped from this.curr, then pop the previous uint value from the stack in /// order to provide another 31 bits. /// private void PopCurr() { if (this.stackPos > 0) this.curr = this.bitStack[--this.stackPos]; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IdleTimeoutMonitor.cs
- LinqDataSource.cs
- AggregateNode.cs
- Int32KeyFrameCollection.cs
- CharEntityEncoderFallback.cs
- InputScopeConverter.cs
- IsolatedStorageFileStream.cs
- ClientUrlResolverWrapper.cs
- DataGridRow.cs
- Geometry.cs
- Int32Rect.cs
- MailWriter.cs
- XamlToRtfParser.cs
- CompareInfo.cs
- BuildManagerHost.cs
- HttpHeaderCollection.cs
- MeasureItemEvent.cs
- DataControlCommands.cs
- TextSelection.cs
- TraceLog.cs
- UpdateCommand.cs
- EventTask.cs
- GridViewPageEventArgs.cs
- SchemaMerger.cs
- RecordManager.cs
- LassoHelper.cs
- HttpModule.cs
- ContentType.cs
- SqlCacheDependencyDatabaseCollection.cs
- CapabilitiesState.cs
- MemoryMappedViewAccessor.cs
- XmlNodeComparer.cs
- ListItemCollection.cs
- MouseOverProperty.cs
- ExpressionNormalizer.cs
- FormViewRow.cs
- ValidatingCollection.cs
- XmlCollation.cs
- ContainerFilterService.cs
- WebHttpBindingElement.cs
- DataBoundControlParameterTarget.cs
- ClientSponsor.cs
- TrackBar.cs
- WindowsComboBox.cs
- CorrelationScope.cs
- PageWrapper.cs
- NullableIntMinMaxAggregationOperator.cs
- ApplicationDirectoryMembershipCondition.cs
- MULTI_QI.cs
- VectorValueSerializer.cs
- EncoderReplacementFallback.cs
- ObjectAnimationUsingKeyFrames.cs
- ArraySortHelper.cs
- BamlResourceDeserializer.cs
- PersistenceProviderBehavior.cs
- ImageSource.cs
- DataErrorValidationRule.cs
- CustomLineCap.cs
- WebHttpSecurityModeHelper.cs
- ZipPackagePart.cs
- SafeCryptoHandles.cs
- CompositeCollection.cs
- DoubleAnimation.cs
- GlobalizationSection.cs
- safelink.cs
- StructuredTypeEmitter.cs
- AudioFileOut.cs
- CommunicationObjectManager.cs
- TextEditorTyping.cs
- EntityDataSourceChangingEventArgs.cs
- HttpListenerContext.cs
- SessionStateContainer.cs
- SystemDiagnosticsSection.cs
- HtmlImage.cs
- DeadCharTextComposition.cs
- DataTableMapping.cs
- CodeTypeParameter.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- HttpListenerContext.cs
- NoneExcludedImageIndexConverter.cs
- FunctionDetailsReader.cs
- DependencyObject.cs
- EmptyReadOnlyDictionaryInternal.cs
- FragmentQueryProcessor.cs
- JsonDataContract.cs
- XmlSchemaSimpleContentRestriction.cs
- XmlCDATASection.cs
- X509CertificateTokenFactoryCredential.cs
- DropDownList.cs
- ServiceOperationParameter.cs
- X509Certificate2Collection.cs
- NegatedConstant.cs
- DataSetMappper.cs
- SynchronizingStream.cs
- TdsValueSetter.cs
- CFStream.cs
- DbConnectionInternal.cs
- ReachUIElementCollectionSerializer.cs
- TableColumnCollectionInternal.cs
- SmtpCommands.cs