Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Utils / Set.cs / 1305376 / Set.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// Util.cs
//
// [....]
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System.Collections.Generic;
namespace System.Linq.Parallel
{
///
/// A set for various operations. Shamelessly stolen from LINQ's source code.
/// @
internal class Set
{
int[] buckets;
Slot[] slots;
int count;
int freeList;
IEqualityComparer comparer;
internal Set() : this(null)
{
}
internal Set(IEqualityComparer comparer)
{
if (comparer == null) comparer = EqualityComparer.Default;
this.comparer = comparer;
buckets = new int[7];
slots = new Slot[7];
freeList = -1;
}
// If value is not in set, add it and return true; otherwise return false
internal bool Add(TElement value)
{
return !Find(value, true);
}
// Check whether value is in set
internal bool Contains(TElement value)
{
return Find(value, false);
}
// If value is in set, remove it and return true; otherwise return false
internal bool Remove(TElement value)
{
int hashCode = comparer.GetHashCode(value) & 0x7FFFFFFF;
int bucket = hashCode % buckets.Length;
int last = -1;
for (int i = buckets[bucket] - 1; i >= 0; last = i, i = slots[i].next)
{
if (slots[i].hashCode == hashCode && comparer.Equals(slots[i].value, value))
{
if (last < 0)
{
buckets[bucket] = slots[i].next + 1;
}
else
{
slots[last].next = slots[i].next;
}
slots[i].hashCode = -1;
slots[i].value = default(TElement);
slots[i].next = freeList;
freeList = i;
return true;
}
}
return false;
}
internal bool Find(TElement value, bool add)
{
int hashCode = comparer.GetHashCode(value) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length] - 1; i >= 0; i = slots[i].next)
{
if (slots[i].hashCode == hashCode && comparer.Equals(slots[i].value, value)) return true;
}
if (add)
{
int index;
if (freeList >= 0)
{
index = freeList;
freeList = slots[index].next;
}
else
{
if (count == slots.Length) Resize();
index = count;
count++;
}
int bucket = hashCode % buckets.Length;
slots[index].hashCode = hashCode;
slots[index].value = value;
slots[index].next = buckets[bucket] - 1;
buckets[bucket] = index + 1;
}
return false;
}
void Resize()
{
int newSize = checked(count * 2 + 1);
int[] newBuckets = new int[newSize];
Slot[] newSlots = new Slot[newSize];
Array.Copy(slots, 0, newSlots, 0, count);
for (int i = 0; i < count; i++)
{
int bucket = newSlots[i].hashCode % newSize;
newSlots[i].next = newBuckets[bucket] - 1;
newBuckets[bucket] = i + 1;
}
buckets = newBuckets;
slots = newSlots;
}
internal struct Slot
{
internal int hashCode;
internal TElement value;
internal int next;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// Util.cs
//
// [....]
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System.Collections.Generic;
namespace System.Linq.Parallel
{
///
/// A set for various operations. Shamelessly stolen from LINQ's source code.
/// @
internal class Set
{
int[] buckets;
Slot[] slots;
int count;
int freeList;
IEqualityComparer comparer;
internal Set() : this(null)
{
}
internal Set(IEqualityComparer comparer)
{
if (comparer == null) comparer = EqualityComparer.Default;
this.comparer = comparer;
buckets = new int[7];
slots = new Slot[7];
freeList = -1;
}
// If value is not in set, add it and return true; otherwise return false
internal bool Add(TElement value)
{
return !Find(value, true);
}
// Check whether value is in set
internal bool Contains(TElement value)
{
return Find(value, false);
}
// If value is in set, remove it and return true; otherwise return false
internal bool Remove(TElement value)
{
int hashCode = comparer.GetHashCode(value) & 0x7FFFFFFF;
int bucket = hashCode % buckets.Length;
int last = -1;
for (int i = buckets[bucket] - 1; i >= 0; last = i, i = slots[i].next)
{
if (slots[i].hashCode == hashCode && comparer.Equals(slots[i].value, value))
{
if (last < 0)
{
buckets[bucket] = slots[i].next + 1;
}
else
{
slots[last].next = slots[i].next;
}
slots[i].hashCode = -1;
slots[i].value = default(TElement);
slots[i].next = freeList;
freeList = i;
return true;
}
}
return false;
}
internal bool Find(TElement value, bool add)
{
int hashCode = comparer.GetHashCode(value) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length] - 1; i >= 0; i = slots[i].next)
{
if (slots[i].hashCode == hashCode && comparer.Equals(slots[i].value, value)) return true;
}
if (add)
{
int index;
if (freeList >= 0)
{
index = freeList;
freeList = slots[index].next;
}
else
{
if (count == slots.Length) Resize();
index = count;
count++;
}
int bucket = hashCode % buckets.Length;
slots[index].hashCode = hashCode;
slots[index].value = value;
slots[index].next = buckets[bucket] - 1;
buckets[bucket] = index + 1;
}
return false;
}
void Resize()
{
int newSize = checked(count * 2 + 1);
int[] newBuckets = new int[newSize];
Slot[] newSlots = new Slot[newSize];
Array.Copy(slots, 0, newSlots, 0, count);
for (int i = 0; i < count; i++)
{
int bucket = newSlots[i].hashCode % newSize;
newSlots[i].next = newBuckets[bucket] - 1;
newBuckets[bucket] = i + 1;
}
buckets = newBuckets;
slots = newSlots;
}
internal struct Slot
{
internal int hashCode;
internal TElement value;
internal int next;
}
}
}
// 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
- DataError.cs
- ColumnWidthChangingEvent.cs
- TypeName.cs
- XmlWrappingReader.cs
- TlsnegoTokenAuthenticator.cs
- MultipleViewPattern.cs
- MailMessageEventArgs.cs
- RegexInterpreter.cs
- LightweightEntityWrapper.cs
- FieldAccessException.cs
- EventHandlersStore.cs
- SizeAnimationBase.cs
- PageClientProxyGenerator.cs
- RSAOAEPKeyExchangeDeformatter.cs
- CompressionTransform.cs
- Validator.cs
- ItemCollection.cs
- HandlerFactoryWrapper.cs
- TemplateControlParser.cs
- SignatureResourceHelper.cs
- DocumentDesigner.cs
- Win32.cs
- TransformValueSerializer.cs
- WebPartConnectionCollection.cs
- TreeNodeSelectionProcessor.cs
- ClientEventManager.cs
- RemotingConfiguration.cs
- ArglessEventHandlerProxy.cs
- WorkflowTransactionService.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- DiscoveryReferences.cs
- RegionData.cs
- FocusManager.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- XmlDigitalSignatureProcessor.cs
- RenderDataDrawingContext.cs
- DbMetaDataFactory.cs
- XmlSchemaNotation.cs
- ConsoleCancelEventArgs.cs
- TextDecorationUnitValidation.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- XmlSchemaAnnotated.cs
- HttpHandler.cs
- SystemParameters.cs
- TypeSystemProvider.cs
- BounceEase.cs
- PasswordTextNavigator.cs
- XPathItem.cs
- HttpRuntime.cs
- HtmlInputRadioButton.cs
- ItemsPresenter.cs
- ListViewInsertionMark.cs
- StylusSystemGestureEventArgs.cs
- NativeBuffer.cs
- TraceSection.cs
- SystemColors.cs
- AttachedPropertiesService.cs
- GeneralTransform.cs
- ActivityExecutor.cs
- EntityCodeGenerator.cs
- FileLevelControlBuilderAttribute.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- HostSecurityManager.cs
- EncodingTable.cs
- XmlExpressionDumper.cs
- DbConnectionPoolGroupProviderInfo.cs
- ImageFormat.cs
- OrderByQueryOptionExpression.cs
- InputReport.cs
- CodeTypeReferenceSerializer.cs
- MailMessage.cs
- SecurityManager.cs
- UrlMappingsModule.cs
- DynamicHyperLink.cs
- PropertyDescriptor.cs
- ProcessModelInfo.cs
- ScriptReferenceEventArgs.cs
- KnownTypeAttribute.cs
- JavaScriptSerializer.cs
- XmlAtomicValue.cs
- QueueProcessor.cs
- HatchBrush.cs
- OracleBFile.cs
- DataGridColumnHeaderItemAutomationPeer.cs
- EncoderReplacementFallback.cs
- CapabilitiesState.cs
- TableAdapterManagerHelper.cs
- CodeGroup.cs
- ConsumerConnectionPointCollection.cs
- SegmentInfo.cs
- BrowserDefinition.cs
- TemplateXamlParser.cs
- GrammarBuilderRuleRef.cs
- XmlSortKeyAccumulator.cs
- Mapping.cs
- PanelStyle.cs
- IndexedEnumerable.cs
- RowUpdatingEventArgs.cs
- _ListenerRequestStream.cs
- MemoryStream.cs