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
- Evaluator.cs
- ColorConvertedBitmap.cs
- CachingHintValidation.cs
- NumberSubstitution.cs
- SessionEndingCancelEventArgs.cs
- XsltArgumentList.cs
- StrictAndMessageFilter.cs
- TreeNodeBinding.cs
- ResourceSetExpression.cs
- HyperLink.cs
- InlineCollection.cs
- OperationResponse.cs
- SecurityManager.cs
- LinqDataSourceStatusEventArgs.cs
- HttpsTransportBindingElement.cs
- SmiMetaData.cs
- Typeface.cs
- FormClosedEvent.cs
- ToolStripDropDownButton.cs
- PersonalizationProvider.cs
- DataMemberFieldEditor.cs
- ColumnClickEvent.cs
- SelectionItemProviderWrapper.cs
- ClusterSafeNativeMethods.cs
- AdapterDictionary.cs
- CodeTypeDeclaration.cs
- DataGridColumnHeaderCollection.cs
- InstallerTypeAttribute.cs
- WindowsFont.cs
- GenerateHelper.cs
- DataSet.cs
- BigInt.cs
- IISUnsafeMethods.cs
- NotFiniteNumberException.cs
- Stylus.cs
- DirectoryInfo.cs
- TemplateColumn.cs
- XPathSingletonIterator.cs
- FeedUtils.cs
- ValidationException.cs
- CoreChannel.cs
- XhtmlConformanceSection.cs
- TableLayoutPanel.cs
- SQLDecimal.cs
- CrossContextChannel.cs
- ReadOnlyMetadataCollection.cs
- ValueHandle.cs
- Calendar.cs
- BindingCollectionElement.cs
- XmlUtil.cs
- AnnotationComponentChooser.cs
- ServiceDocumentFormatter.cs
- processwaithandle.cs
- ResourceDescriptionAttribute.cs
- TypefaceMetricsCache.cs
- Unit.cs
- XmlDigitalSignatureProcessor.cs
- ObjectParameterCollection.cs
- PageStatePersister.cs
- AsymmetricAlgorithm.cs
- IsolatedStorageFile.cs
- XMLDiffLoader.cs
- ListCollectionView.cs
- Int32AnimationBase.cs
- PartialList.cs
- BlockUIContainer.cs
- GridProviderWrapper.cs
- BooleanToVisibilityConverter.cs
- CookielessHelper.cs
- OdbcConnectionStringbuilder.cs
- DataSourceHelper.cs
- ToggleProviderWrapper.cs
- DataGridViewComboBoxColumn.cs
- Decoder.cs
- __Error.cs
- TreeBuilder.cs
- SerialPort.cs
- log.cs
- Vector3DKeyFrameCollection.cs
- XmlUnspecifiedAttribute.cs
- CodeAccessPermission.cs
- PagesSection.cs
- DirectoryNotFoundException.cs
- StoreItemCollection.cs
- XPathNodeHelper.cs
- DataStorage.cs
- DataServiceEntityAttribute.cs
- ZipPackagePart.cs
- DataMemberConverter.cs
- IisTraceListener.cs
- DependencyPropertyValueSerializer.cs
- IItemProperties.cs
- SimpleHandlerFactory.cs
- ConstructorBuilder.cs
- PropertyNames.cs
- WmlLiteralTextAdapter.cs
- documentsequencetextpointer.cs
- TdsParserStaticMethods.cs
- OletxTransactionHeader.cs
- DllHostInitializer.cs