Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- MenuItemBinding.cs
- AppSettingsSection.cs
- SequentialUshortCollection.cs
- InputLanguageProfileNotifySink.cs
- TemplateColumn.cs
- SqlServer2KCompatibilityAnnotation.cs
- JsonEncodingStreamWrapper.cs
- XmlSchemaGroup.cs
- SimpleHandlerBuildProvider.cs
- RewritingValidator.cs
- DataListItemEventArgs.cs
- XmlDownloadManager.cs
- Version.cs
- RegistryPermission.cs
- UnsafeNativeMethods.cs
- CodeGenerator.cs
- FontFamilyIdentifier.cs
- ZipQueryOperator.cs
- GlyphingCache.cs
- DeferredElementTreeState.cs
- ViewValidator.cs
- ClientUriBehavior.cs
- PenCursorManager.cs
- RequestValidator.cs
- TextTreeTextBlock.cs
- BamlStream.cs
- BitmapSizeOptions.cs
- KeyValuePairs.cs
- ExpandSegmentCollection.cs
- CachedPathData.cs
- BitmapData.cs
- TabControlCancelEvent.cs
- ApplicationManager.cs
- ImageSourceConverter.cs
- DrawingImage.cs
- SaveFileDialog.cs
- QueueProcessor.cs
- InputScopeManager.cs
- UIElementIsland.cs
- Constant.cs
- SqlClientWrapperSmiStream.cs
- MULTI_QI.cs
- Menu.cs
- DataKeyCollection.cs
- HtmlInputRadioButton.cs
- CodeNamespaceCollection.cs
- TransformerInfo.cs
- ThicknessAnimationUsingKeyFrames.cs
- ModuleBuilderData.cs
- TableSectionStyle.cs
- AmbiguousMatchException.cs
- TextReader.cs
- Ipv6Element.cs
- StyleCollection.cs
- XmlReaderSettings.cs
- ToolStripItemRenderEventArgs.cs
- UriScheme.cs
- Group.cs
- NodeInfo.cs
- DataBindEngine.cs
- StylusPointDescription.cs
- HtmlLabelAdapter.cs
- PrimitiveSchema.cs
- SettingsPropertyIsReadOnlyException.cs
- EventDescriptor.cs
- LayoutExceptionEventArgs.cs
- HtmlTitle.cs
- IndexedGlyphRun.cs
- PeerName.cs
- MenuEventArgs.cs
- ClientFormsAuthenticationMembershipProvider.cs
- COM2FontConverter.cs
- ping.cs
- ExtendedPropertyDescriptor.cs
- Or.cs
- CharacterHit.cs
- TextViewBase.cs
- EndpointConfigContainer.cs
- NextPreviousPagerField.cs
- FastEncoderWindow.cs
- ResourceDictionary.cs
- DateRangeEvent.cs
- ViewStateException.cs
- SafeEventLogReadHandle.cs
- Choices.cs
- TypeElementCollection.cs
- ComPersistableTypeElementCollection.cs
- HtmlTableCellCollection.cs
- DataGridViewRowStateChangedEventArgs.cs
- SizeLimitedCache.cs
- DesignerOptionService.cs
- EventDescriptorCollection.cs
- FileUtil.cs
- TraceContext.cs
- GenericTypeParameterBuilder.cs
- ListBoxItemAutomationPeer.cs
- PriorityQueue.cs
- NamedPermissionSet.cs
- Identifier.cs
- SimpleTypeResolver.cs