Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Shared / MS / Utility / ItemMap.cs / 1 / ItemMap.cs
using System;
using System.Collections;
using System.Diagnostics;
namespace MS.Utility
{
//
// ItemStructMap
//
// Disable warnings about fields never being assigned to
// This struct is designed to function with its fields starting at
// their default values and without the need of surfacing a constructor
// other than the deafult
#pragma warning disable 649
internal struct ItemStructMap
{
public int EnsureEntry(int key)
{
int index = Search(key);
if (index < 0)
{
// Not found, add Entry
// Create initial capacity, if necessary
if (Entries == null)
{
Entries = new Entry[SearchTypeThreshold];
}
// Convert not-found index to insertion point
index = ~index;
Entry[] destEntries = Entries;
// Increase capacity, if necessary
if ((Count + 1) > Entries.Length)
{
destEntries = new Entry[Entries.Length * 2];
// Initialize start of new array
Array.Copy(Entries, 0, destEntries, 0, index);
}
// Shift entries to make room for new key at provided insertion point
Array.Copy(Entries, index, destEntries, index + 1, Count - index);
// Ensure Source and Destination arrays are the same
Entries = destEntries;
// Clear new entry
Entries[index] = EmptyEntry;
// Set
Entries[index].Key = key;
Count++;
}
return index;
}
public int Search(int key)
{
int keyPv = Int32.MaxValue;
int iPv = 0;
// Use fastest search based on size
if (Count > SearchTypeThreshold)
{
// Binary Search
int iLo = 0;
int iHi = Count - 1;
while (iLo <= iHi)
{
iPv = (iHi + iLo) / 2;
keyPv = Entries[iPv].Key;
if (key == keyPv)
{
return iPv;
}
if (key < keyPv)
{
iHi = iPv - 1;
}
else
{
iLo = iPv + 1;
}
}
}
else
{
// Linear search
for (int i = 0; i < Count; i++)
{
iPv = i;
keyPv = Entries[iPv].Key;
if (key == keyPv)
{
return iPv;
}
if (key < keyPv)
{
break;
}
}
}
// iPv and keyPv will match and have the last pivot check
// Return a negative value whose bitwise compliment
// is this index of the first Entry that is greater
// than the key passed in (sorted insertion point)
if (key > keyPv)
{
iPv++;
}
return ~iPv;
}
private const int SearchTypeThreshold = 4;
public Entry[] Entries;
public int Count;
public struct Entry
{
public int Key;
public T Value;
}
private static Entry EmptyEntry;
}
#pragma warning restore 649
}
// 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.Diagnostics;
namespace MS.Utility
{
//
// ItemStructMap
//
// Disable warnings about fields never being assigned to
// This struct is designed to function with its fields starting at
// their default values and without the need of surfacing a constructor
// other than the deafult
#pragma warning disable 649
internal struct ItemStructMap
{
public int EnsureEntry(int key)
{
int index = Search(key);
if (index < 0)
{
// Not found, add Entry
// Create initial capacity, if necessary
if (Entries == null)
{
Entries = new Entry[SearchTypeThreshold];
}
// Convert not-found index to insertion point
index = ~index;
Entry[] destEntries = Entries;
// Increase capacity, if necessary
if ((Count + 1) > Entries.Length)
{
destEntries = new Entry[Entries.Length * 2];
// Initialize start of new array
Array.Copy(Entries, 0, destEntries, 0, index);
}
// Shift entries to make room for new key at provided insertion point
Array.Copy(Entries, index, destEntries, index + 1, Count - index);
// Ensure Source and Destination arrays are the same
Entries = destEntries;
// Clear new entry
Entries[index] = EmptyEntry;
// Set
Entries[index].Key = key;
Count++;
}
return index;
}
public int Search(int key)
{
int keyPv = Int32.MaxValue;
int iPv = 0;
// Use fastest search based on size
if (Count > SearchTypeThreshold)
{
// Binary Search
int iLo = 0;
int iHi = Count - 1;
while (iLo <= iHi)
{
iPv = (iHi + iLo) / 2;
keyPv = Entries[iPv].Key;
if (key == keyPv)
{
return iPv;
}
if (key < keyPv)
{
iHi = iPv - 1;
}
else
{
iLo = iPv + 1;
}
}
}
else
{
// Linear search
for (int i = 0; i < Count; i++)
{
iPv = i;
keyPv = Entries[iPv].Key;
if (key == keyPv)
{
return iPv;
}
if (key < keyPv)
{
break;
}
}
}
// iPv and keyPv will match and have the last pivot check
// Return a negative value whose bitwise compliment
// is this index of the first Entry that is greater
// than the key passed in (sorted insertion point)
if (key > keyPv)
{
iPv++;
}
return ~iPv;
}
private const int SearchTypeThreshold = 4;
public Entry[] Entries;
public int Count;
public struct Entry
{
public int Key;
public T Value;
}
private static Entry EmptyEntry;
}
#pragma warning restore 649
}
// 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
- Font.cs
- ErrorHandlingReceiver.cs
- MdiWindowListItemConverter.cs
- contentDescriptor.cs
- MailWebEventProvider.cs
- XmlHelper.cs
- EncoderBestFitFallback.cs
- SourceCollection.cs
- DynamicFilterExpression.cs
- Int32CollectionConverter.cs
- DataSetUtil.cs
- OleDbCommandBuilder.cs
- GeneralTransform.cs
- SqlUtil.cs
- CodeAssignStatement.cs
- AutoCompleteStringCollection.cs
- SlipBehavior.cs
- Events.cs
- TextParagraphView.cs
- SqlDataSourceCustomCommandEditor.cs
- BamlRecordReader.cs
- EntityDataSourceColumn.cs
- SplineKeyFrames.cs
- UnicodeEncoding.cs
- RowType.cs
- TypedTableBaseExtensions.cs
- EndpointAddressAugust2004.cs
- PersistenceMetadataNamespace.cs
- XmlQueryTypeFactory.cs
- RecordBuilder.cs
- SqlParameterizer.cs
- AssemblyAttributes.cs
- AlternationConverter.cs
- XmlSchemaImporter.cs
- Frame.cs
- SQLString.cs
- TemplateFactory.cs
- ConfigXmlWhitespace.cs
- Color.cs
- DataControlFieldHeaderCell.cs
- CollectionMarkupSerializer.cs
- GACIdentityPermission.cs
- _SpnDictionary.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- BuildManagerHost.cs
- TopClause.cs
- CoreSwitches.cs
- SQLBytes.cs
- Brush.cs
- HwndSubclass.cs
- ButtonChrome.cs
- CodeLinePragma.cs
- securitycriticaldataformultiplegetandset.cs
- FacetValues.cs
- SqlInfoMessageEvent.cs
- FastEncoderWindow.cs
- HostProtectionException.cs
- KeyedHashAlgorithm.cs
- DataServiceHostFactory.cs
- OperatingSystem.cs
- SystemResourceHost.cs
- Int64AnimationBase.cs
- VectorAnimationUsingKeyFrames.cs
- DbConnectionPoolCounters.cs
- MessageSecurityOverMsmqElement.cs
- CultureInfoConverter.cs
- cookieexception.cs
- PtsPage.cs
- BuildProvidersCompiler.cs
- EntryIndex.cs
- QilChoice.cs
- EventItfInfo.cs
- MaterialCollection.cs
- CustomCategoryAttribute.cs
- ListMarkerLine.cs
- GeneratedContractType.cs
- ResolveDuplexCD1AsyncResult.cs
- IisTraceListener.cs
- RadioButton.cs
- UTF8Encoding.cs
- StaticTextPointer.cs
- SchemaCollectionPreprocessor.cs
- XmlCountingReader.cs
- MessageBox.cs
- ArithmeticException.cs
- PermissionRequestEvidence.cs
- TextViewDesigner.cs
- PersonalizationStateInfo.cs
- RoutedEventHandlerInfo.cs
- nulltextnavigator.cs
- Char.cs
- InvocationExpression.cs
- ExceptQueryOperator.cs
- ServiceOperationInvoker.cs
- SiteMapDataSourceView.cs
- DependencyObjectProvider.cs
- DynamicResourceExtensionConverter.cs
- LinkedResourceCollection.cs
- DesignDataSource.cs
- RoleService.cs