Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Xml / System / Xml / schema / BitSet.cs / 1 / BitSet.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace System.Xml.Schema {
using System.Text;
using System.Diagnostics;
internal sealed class BitSet {
private const int bitSlotShift = 5;
private const int bitSlotMask = (1 << bitSlotShift) - 1;
private int count;
private uint[] bits;
private BitSet() {
}
public BitSet(int count) {
this.count = count;
bits = new uint[Subscript(count + bitSlotMask)];
}
public int Count {
get { return count; }
}
public bool this[int index] {
get {
return Get(index);
}
}
public void Clear() {
int bitsLength = bits.Length;
for (int i = bitsLength; i-- > 0 ;) {
bits[i] = 0;
}
}
public void Clear(int index) {
int nBitSlot = Subscript(index);
EnsureLength(nBitSlot + 1);
bits[nBitSlot] &= ~((uint)1 << (index & bitSlotMask));
}
public void Set(int index) {
int nBitSlot = Subscript(index);
EnsureLength(nBitSlot + 1);
bits[nBitSlot] |= (uint)1 << (index & bitSlotMask);
}
public bool Get(int index) {
bool fResult = false;
if (index < count) {
int nBitSlot = Subscript(index);
fResult = ((bits[nBitSlot] & (1 << (index & bitSlotMask))) != 0);
}
return fResult;
}
public int NextSet(int startFrom) {
Debug.Assert(startFrom >= -1 && startFrom <= count);
int offset = startFrom + 1;
if (offset == count) {
return -1;
}
int nBitSlot = Subscript(offset);
offset &= bitSlotMask;
uint word = bits[nBitSlot] >> offset;
// locate non-empty slot
while (word == 0) {
if ((++ nBitSlot) == bits.Length ) {
return -1;
}
offset = 0;
word = bits[nBitSlot];
}
while ((word & (uint)1) == 0) {
word >>= 1;
offset ++;
}
return (nBitSlot << bitSlotShift) + offset;
}
public void And(BitSet other) {
/*
* Need to synchronize both this and other->
* This might lead to deadlock if one thread grabs them in one order
* while another thread grabs them the other order.
* Use a trick from Doug Lea's book on concurrency,
* somewhat complicated because BitSet overrides hashCode().
*/
if (this == other) {
return;
}
int bitsLength = bits.Length;
int setLength = other.bits.Length;
int n = (bitsLength > setLength) ? setLength : bitsLength;
for (int i = n ; i-- > 0 ;) {
bits[i] &= other.bits[i];
}
for (; n < bitsLength ; n++) {
bits[n] = 0;
}
}
public void Or(BitSet other) {
if (this == other) {
return;
}
int setLength = other.bits.Length;
EnsureLength(setLength);
for (int i = setLength; i-- > 0 ;) {
bits[i] |= other.bits[i];
}
}
public override int GetHashCode() {
int h = 1234;
for (int i = bits.Length; --i >= 0;) {
h ^= (int)bits[i] * (i + 1);
}
return(int)((h >> 32) ^ h);
}
public override bool Equals(object obj) {
// assume the same type
if (obj != null) {
if (this == obj) {
return true;
}
BitSet other = (BitSet) obj;
int bitsLength = bits.Length;
int setLength = other.bits.Length;
int n = (bitsLength > setLength) ? setLength : bitsLength;
for (int i = n ; i-- > 0 ;) {
if (bits[i] != other.bits[i]) {
return false;
}
}
if (bitsLength > n) {
for (int i = bitsLength ; i-- > n ;) {
if (bits[i] != 0) {
return false;
}
}
}
else {
for (int i = setLength ; i-- > n ;) {
if (other.bits[i] != 0) {
return false;
}
}
}
return true;
}
return false;
}
public BitSet Clone() {
BitSet newset = new BitSet();
newset.count = count;
newset.bits = (uint[])bits.Clone();
return newset;
}
public bool IsEmpty {
get {
uint k = 0;
for (int i = 0; i < bits.Length; i++) {
k |= bits[i];
}
return k == 0;
}
}
public bool Intersects(BitSet other) {
int i = Math.Min(this.bits.Length, other.bits.Length);
while (--i >= 0) {
if ((this.bits[i] & other.bits[i]) != 0) {
return true;
}
}
return false;
}
private int Subscript(int bitIndex) {
return bitIndex >> bitSlotShift;
}
private void EnsureLength(int nRequiredLength) {
/* Doesn't need to be synchronized because it's an internal method. */
if (nRequiredLength > bits.Length) {
/* Ask for larger of doubled size or required size */
int request = 2 * bits.Length;
if (request < nRequiredLength)
request = nRequiredLength;
uint[] newBits = new uint[request];
Array.Copy(bits, newBits, bits.Length);
bits = newBits;
}
}
#if DEBUG
public void Dump(StringBuilder bb) {
for (int i = 0; i < count; i ++) {
bb.Append( Get(i) ? "1" : "0");
}
}
#endif
};
}
// 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
- PointLightBase.cs
- DatagramAdapter.cs
- DateTimeValueSerializer.cs
- HtmlGenericControl.cs
- StandardTransformFactory.cs
- _DigestClient.cs
- FixedPage.cs
- AutomationPattern.cs
- CodeIndexerExpression.cs
- ISAPIWorkerRequest.cs
- InstanceDataCollectionCollection.cs
- SymbolTable.cs
- ComPlusSynchronizationContext.cs
- NavigationWindowAutomationPeer.cs
- documentsequencetextcontainer.cs
- CategoryNameCollection.cs
- GridToolTip.cs
- Rijndael.cs
- XPathScanner.cs
- ParenthesizePropertyNameAttribute.cs
- BrowserDefinitionCollection.cs
- PlaceHolder.cs
- SuppressMessageAttribute.cs
- DateTimeSerializationSection.cs
- TextBoxView.cs
- DrawingGroup.cs
- FileChangesMonitor.cs
- BulletChrome.cs
- MouseEvent.cs
- NominalTypeEliminator.cs
- EncoderParameter.cs
- ModuleBuilderData.cs
- ConditionalDesigner.cs
- ShaperBuffers.cs
- ZipIORawDataFileBlock.cs
- LogWriteRestartAreaAsyncResult.cs
- TypeSystem.cs
- DataGridCellsPanel.cs
- ConfigurationSettings.cs
- _FtpDataStream.cs
- ValidatorCompatibilityHelper.cs
- UIntPtr.cs
- PathStreamGeometryContext.cs
- WorkflowOwnershipException.cs
- CodeExporter.cs
- QueryExtender.cs
- SecurityTokenAuthenticator.cs
- PropertyDescriptors.cs
- TransformDescriptor.cs
- GetKeyedHashRequest.cs
- ObjectSpanRewriter.cs
- Duration.cs
- Encoding.cs
- FtpCachePolicyElement.cs
- StaticExtension.cs
- XsdBuildProvider.cs
- CompareValidator.cs
- AssemblyBuilder.cs
- DataException.cs
- Int32Rect.cs
- DelegateSerializationHolder.cs
- StringPropertyBuilder.cs
- SizeF.cs
- SecureStringHasher.cs
- WindowsListViewGroup.cs
- DesignerHierarchicalDataSourceView.cs
- DataServiceStreamProviderWrapper.cs
- CorePropertiesFilter.cs
- PersonalizationAdministration.cs
- MappingItemCollection.cs
- MdiWindowListItemConverter.cs
- TransactionScope.cs
- SplitterEvent.cs
- BaseTemplateCodeDomTreeGenerator.cs
- IisTraceListener.cs
- TcpProcessProtocolHandler.cs
- PathSegmentCollection.cs
- CapabilitiesUse.cs
- MobileCategoryAttribute.cs
- StandardTransformFactory.cs
- Win32MouseDevice.cs
- ConstraintManager.cs
- PropertyFilter.cs
- OleTxTransaction.cs
- FileFormatException.cs
- QueueProcessor.cs
- DataControlFieldHeaderCell.cs
- DataServiceException.cs
- ComponentDispatcherThread.cs
- BoundColumn.cs
- _OverlappedAsyncResult.cs
- DirectoryInfo.cs
- EntityConnectionStringBuilderItem.cs
- TextContainer.cs
- JavascriptCallbackBehaviorAttribute.cs
- FlowLayout.cs
- SqlNamer.cs
- Lease.cs
- ResXResourceWriter.cs
- TimelineClockCollection.cs