Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / 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
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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CompositeDataBoundControl.cs
- XDeferredAxisSource.cs
- SimpleFieldTemplateFactory.cs
- XmlDocumentFragment.cs
- ColumnResult.cs
- UpDownEvent.cs
- HtmlTable.cs
- EntityDataSourceReferenceGroup.cs
- QuaternionRotation3D.cs
- Journaling.cs
- PiiTraceSource.cs
- SystemResources.cs
- HistoryEventArgs.cs
- OleDbTransaction.cs
- SRef.cs
- SimpleMailWebEventProvider.cs
- ObjectListFieldCollection.cs
- SqlBulkCopyColumnMapping.cs
- ActivityInstance.cs
- SocketInformation.cs
- HtmlAnchor.cs
- TreeWalkHelper.cs
- SslStream.cs
- WindowsIdentity.cs
- SystemPens.cs
- PreloadedPackages.cs
- SmtpAuthenticationManager.cs
- XmlSchemaAnnotation.cs
- Publisher.cs
- PenThreadPool.cs
- WindowsStartMenu.cs
- DataControlFieldsEditor.cs
- DetailsViewUpdateEventArgs.cs
- COMException.cs
- DataGridViewCellStyleConverter.cs
- CellQuery.cs
- ScriptBehaviorDescriptor.cs
- SoundPlayerAction.cs
- SspiNegotiationTokenAuthenticator.cs
- EdmSchemaError.cs
- precedingsibling.cs
- Component.cs
- _WebProxyDataBuilder.cs
- FormViewModeEventArgs.cs
- RecordsAffectedEventArgs.cs
- MsmqIntegrationBinding.cs
- PropertyExpression.cs
- ToolStripContainer.cs
- Selection.cs
- NameValueSectionHandler.cs
- TriggerAction.cs
- ExpanderAutomationPeer.cs
- MobileCapabilities.cs
- Int32Rect.cs
- RowVisual.cs
- SQLDecimalStorage.cs
- XamlSerializationHelper.cs
- ProgressBarBrushConverter.cs
- LiteralDesigner.cs
- TableCell.cs
- Pair.cs
- ContextMenu.cs
- EditorPartCollection.cs
- XPathNodeIterator.cs
- OptimizerPatterns.cs
- TypeNameParser.cs
- BrowserCapabilitiesFactoryBase.cs
- MethodAccessException.cs
- SqlCacheDependencyDatabaseCollection.cs
- StructuredTypeEmitter.cs
- CancellationHandler.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- BulletChrome.cs
- NetSectionGroup.cs
- Deflater.cs
- StyleSheetDesigner.cs
- DoubleStorage.cs
- MutableAssemblyCacheEntry.cs
- HWStack.cs
- HostedImpersonationContext.cs
- WindowsScrollBarBits.cs
- AsyncPostBackErrorEventArgs.cs
- HttpWrapper.cs
- AssertUtility.cs
- ThreadExceptionDialog.cs
- Byte.cs
- PageScaling.cs
- CryptoApi.cs
- OrderedParallelQuery.cs
- CodeTryCatchFinallyStatement.cs
- SspiSafeHandles.cs
- NamespaceCollection.cs
- RoleService.cs
- DatePickerTextBox.cs
- CompilationUnit.cs
- HttpsTransportBindingElement.cs
- FixedPageProcessor.cs
- XmlSchemaImport.cs
- HttpProcessUtility.cs
- sqlser.cs