Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Shared / MS / Internal / Xaml / Context / XamlContextStack.cs / 1305600 / XamlContextStack.cs
using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Globalization; namespace MS.Internal.Xaml.Context { //This stack has the following features: // 1) it recycles frames // 2) it is, and avoids activator.createinstance with the creationDelegate class XamlContextStack where T : XamlFrame { private int _depth = -1; T _currentFrame = null; T _recycledFrame = null; Func _creationDelegate; public XamlContextStack(Func creationDelegate) { _creationDelegate = creationDelegate; Grow(); _depth = 0; Debug.Assert(CurrentFrame != null); Debug.Assert(CurrentFrame.Depth == Depth); } public XamlContextStack(XamlContextStack source, bool copy) { _creationDelegate = source._creationDelegate; _depth = source.Depth; if (!copy) { _currentFrame = source.CurrentFrame; } else { T iteratorFrame = source.CurrentFrame; T lastFrameInNewStack = null; while (iteratorFrame != null) { T newFrame = (T)iteratorFrame.Clone(); if (_currentFrame == null) { _currentFrame = newFrame; } if (lastFrameInNewStack != null) { lastFrameInNewStack.Previous = newFrame; } lastFrameInNewStack = newFrame; iteratorFrame = (T)iteratorFrame.Previous; } } } //allocate a new frame as the new currentFrame; private void Grow() { T lastFrame = _currentFrame; _currentFrame = _creationDelegate(); _currentFrame.Previous = lastFrame; } public T CurrentFrame { get { return _currentFrame; } } public T PreviousFrame { get { return (T)_currentFrame.Previous; } } public T PreviousPreviousFrame { get { return (T)_currentFrame.Previous.Previous; } } public T GetFrame(int depth) { T iteratorFrame = _currentFrame; Debug.Assert(iteratorFrame != null); while (iteratorFrame.Depth > depth) { iteratorFrame = (T)iteratorFrame.Previous; } return iteratorFrame; } //Consumers of this stack call PushScope, and we'll either allocate a new frame // or we'll grab one from our recycled linked list. public void PushScope() { if (_recycledFrame == null) { Grow(); } else //use recycled frame { T lastFrame = _currentFrame; _currentFrame = _recycledFrame; _recycledFrame = (T)_recycledFrame.Previous; _currentFrame.Previous = lastFrame; } _depth++; Debug.Assert(CurrentFrame.Depth == Depth); } //Consumers of this stack call PopScope, and we'll move the currentFrame from the main // linked list to the recylced linked list and call .Reset public void PopScope() { _depth--; T frameToRecycle = _currentFrame; _currentFrame = (T)_currentFrame.Previous; frameToRecycle.Previous = _recycledFrame; _recycledFrame = frameToRecycle; frameToRecycle.Reset(); Debug.Assert(CurrentFrame.Depth == Depth); } public int Depth { get { return _depth; } set { _depth = value; } } //In case the stack needs to survive and you don't want to keep the recylced frames around. public void Trim() { _recycledFrame = null; } public string Frames { get { StringBuilder sb = new StringBuilder(); T iteratorFrame = _currentFrame; sb.AppendLine("Stack: " + (_currentFrame == null ? -1 : _currentFrame.Depth + 1).ToString(CultureInfo.InvariantCulture) + " frames"); ShowFrame(sb, _currentFrame); return sb.ToString(); } } private void ShowFrame(StringBuilder sb, T iteratorFrame) { if (iteratorFrame == null) return; if (iteratorFrame.Previous != null) ShowFrame(sb, (T)iteratorFrame.Previous); sb.AppendLine(" " + iteratorFrame.Depth + " " + iteratorFrame.ToString()); } } } // 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
- DateTimeConstantAttribute.cs
- StubHelpers.cs
- AppLevelCompilationSectionCache.cs
- PLINQETWProvider.cs
- CodeCatchClause.cs
- BrowserDefinition.cs
- ContainerSelectorBehavior.cs
- metadatamappinghashervisitor.cs
- LoginView.cs
- PersonalizableTypeEntry.cs
- IndexedGlyphRun.cs
- Internal.cs
- PropertyEmitter.cs
- DesignerTextBoxAdapter.cs
- ObjectListItemCollection.cs
- XmlQueryOutput.cs
- SymbolMethod.cs
- ManagedCodeMarkers.cs
- QilParameter.cs
- HttpResponseHeader.cs
- DispatcherSynchronizationContext.cs
- TabRenderer.cs
- WindowsFormsSynchronizationContext.cs
- InstanceCompleteException.cs
- MissingManifestResourceException.cs
- CssStyleCollection.cs
- DataGridParentRows.cs
- LinqDataSource.cs
- ToolStripComboBox.cs
- SecurityUtils.cs
- JavaScriptString.cs
- BinaryObjectReader.cs
- MetadataProperty.cs
- EventRecord.cs
- LinqExpressionNormalizer.cs
- NameScopePropertyAttribute.cs
- FileRecordSequenceHelper.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- URIFormatException.cs
- ApplicationFileParser.cs
- PersonalizableAttribute.cs
- SessionStateItemCollection.cs
- PointConverter.cs
- CurrentChangedEventManager.cs
- SchemaLookupTable.cs
- XmlSiteMapProvider.cs
- UnsafeNativeMethodsTablet.cs
- PixelFormatConverter.cs
- SignatureToken.cs
- ExceptionTrace.cs
- LicenseException.cs
- VirtualDirectoryMappingCollection.cs
- TextElementCollectionHelper.cs
- ClientData.cs
- EntityCommandCompilationException.cs
- LicenseException.cs
- CallSiteBinder.cs
- SBCSCodePageEncoding.cs
- Part.cs
- GridViewColumnCollection.cs
- AnnotationHighlightLayer.cs
- TextShapeableCharacters.cs
- UInt64Converter.cs
- ContentPlaceHolderDesigner.cs
- SubstitutionList.cs
- MergeFailedEvent.cs
- FontNameEditor.cs
- GridItem.cs
- DataViewSettingCollection.cs
- StateChangeEvent.cs
- Timer.cs
- SectionXmlInfo.cs
- CodeConstructor.cs
- GlobalProxySelection.cs
- FilteredAttributeCollection.cs
- AdRotator.cs
- IUnknownConstantAttribute.cs
- ToolStripItemBehavior.cs
- EncoderExceptionFallback.cs
- ResourceSet.cs
- WebPartChrome.cs
- ZipIOCentralDirectoryBlock.cs
- UInt64Storage.cs
- ColumnBinding.cs
- MetadataElement.cs
- DPAPIProtectedConfigurationProvider.cs
- SHA256.cs
- DecimalStorage.cs
- XmlSchemaDatatype.cs
- SapiRecoInterop.cs
- SmiSettersStream.cs
- MenuItemBinding.cs
- EmptyEnumerator.cs
- CellTreeNodeVisitors.cs
- ExpressionVisitorHelpers.cs
- SqlVersion.cs
- HttpServerVarsCollection.cs
- CommandDevice.cs
- Rect3D.cs
- ReachDocumentSequenceSerializer.cs