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
- ConfigXmlComment.cs
- NotFiniteNumberException.cs
- TextParentUndoUnit.cs
- Stackframe.cs
- AbsoluteQuery.cs
- TextMetrics.cs
- WaitHandleCannotBeOpenedException.cs
- StyleHelper.cs
- ListBase.cs
- KeySplineConverter.cs
- ContextBase.cs
- PermissionToken.cs
- ClientCultureInfo.cs
- Int64.cs
- TriggerBase.cs
- MemberDescriptor.cs
- SqlHelper.cs
- MailWebEventProvider.cs
- AutomationTextAttribute.cs
- BaseInfoTable.cs
- AnonymousIdentificationSection.cs
- hresults.cs
- JsonEnumDataContract.cs
- DataGridViewCellStyleConverter.cs
- EmptyStringExpandableObjectConverter.cs
- ConsumerConnectionPointCollection.cs
- DesignerView.cs
- Int16KeyFrameCollection.cs
- PropertyMap.cs
- StringSorter.cs
- PixelShader.cs
- BlobPersonalizationState.cs
- PtsContext.cs
- XamlLoadErrorInfo.cs
- DbException.cs
- Random.cs
- XmlElementList.cs
- MessageQueueConverter.cs
- IntMinMaxAggregationOperator.cs
- ThrowHelper.cs
- SchemaAttDef.cs
- PageVisual.cs
- Stack.cs
- EnumConverter.cs
- XmlSerializationReader.cs
- PolygonHotSpot.cs
- OledbConnectionStringbuilder.cs
- SecurityManager.cs
- X509CertificateStore.cs
- LogWriteRestartAreaAsyncResult.cs
- Enum.cs
- ResXBuildProvider.cs
- CompilerTypeWithParams.cs
- LocalBuilder.cs
- XamlStackWriter.cs
- FixedDSBuilder.cs
- BrushConverter.cs
- WrapPanel.cs
- SelectionRange.cs
- Funcletizer.cs
- MILUtilities.cs
- BufferedGraphics.cs
- BooleanConverter.cs
- Stack.cs
- OdbcError.cs
- TraceUtility.cs
- SaveFileDialog.cs
- ProgressBarAutomationPeer.cs
- DescendantBaseQuery.cs
- Roles.cs
- SchemaTableColumn.cs
- AutomationPatternInfo.cs
- LinearGradientBrush.cs
- BitmapEffectInput.cs
- OdbcHandle.cs
- DbConnectionPool.cs
- RegexStringValidatorAttribute.cs
- PackageRelationshipSelector.cs
- BackStopAuthenticationModule.cs
- CompositeTypefaceMetrics.cs
- Boolean.cs
- MouseCaptureWithinProperty.cs
- PropertyDescriptorCollection.cs
- ItemsPanelTemplate.cs
- KnownTypes.cs
- ListenDesigner.cs
- _ConnectionGroup.cs
- ConsumerConnectionPoint.cs
- StringUtil.cs
- ServiceInstallComponent.cs
- X509CertificateRecipientClientCredential.cs
- UInt16.cs
- TagMapInfo.cs
- ImportContext.cs
- ToolBarPanel.cs
- ConfigXmlCDataSection.cs
- ApplicationActivator.cs
- AnchoredBlock.cs
- ToolStripItemClickedEventArgs.cs
- CompilerErrorCollection.cs