Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilCloneVisitor.cs / 1305376 / QilCloneVisitor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { // Create an exact replica of a QIL graph internal class QilCloneVisitor : QilScopedVisitor { private QilFactory fac; private SubstitutionList subs; //----------------------------------------------- // Constructors //----------------------------------------------- public QilCloneVisitor(QilFactory fac) : this(fac, new SubstitutionList()) { } public QilCloneVisitor(QilFactory fac, SubstitutionList subs) { this.fac = fac; this.subs = subs; } //----------------------------------------------- // Entry //----------------------------------------------- public QilNode Clone(QilNode node) { // Assume that iterator nodes at the top-level are references rather than definitions return VisitAssumeReference(node); } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode Visit(QilNode oldNode) { QilNode newNode = null; if (oldNode == null) return null; // ShallowClone any nodes which have not yet been cloned if (oldNode is QilReference) { // Reference nodes may have been cloned previously and put into scope newNode = FindClonedReference(oldNode); } if (newNode == null) newNode = oldNode.ShallowClone(this.fac); return base.Visit(newNode); } ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { // Visit children for (int i = 0; i < parent.Count; i++) { QilNode child = parent[i]; // If child is a reference, if (IsReference(parent, i)) { // Visit the reference and substitute its copy parent[i] = VisitReference(child); // If no substutition found, then use original child if (parent[i] == null) parent[i] = child; } else { // Otherwise, visit the node and substitute its copy parent[i] = Visit(child); } } return parent; } ////// If a cloned reference is in scope, replace "oldNode". Otherwise, return "oldNode". /// protected override QilNode VisitReference(QilNode oldNode) { QilNode newNode = FindClonedReference(oldNode); return base.VisitReference(newNode == null ? oldNode : newNode); } //----------------------------------------------- // QilScopedVisitor methods //----------------------------------------------- ////// Push node and its shallow clone onto the substitution list. /// protected override void BeginScope(QilNode node) { this.subs.AddSubstitutionPair(node, node.ShallowClone(this.fac)); } ////// Pop entry from substitution list. /// protected override void EndScope(QilNode node) { this.subs.RemoveLastSubstitutionPair(); } //----------------------------------------------- // QilCloneVisitor methods //----------------------------------------------- ////// Find the clone of an in-scope reference. /// protected QilNode FindClonedReference(QilNode node) { return this.subs.FindReplacement(node); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Xml; using System.Xml.Xsl; namespace System.Xml.Xsl.Qil { // Create an exact replica of a QIL graph internal class QilCloneVisitor : QilScopedVisitor { private QilFactory fac; private SubstitutionList subs; //----------------------------------------------- // Constructors //----------------------------------------------- public QilCloneVisitor(QilFactory fac) : this(fac, new SubstitutionList()) { } public QilCloneVisitor(QilFactory fac, SubstitutionList subs) { this.fac = fac; this.subs = subs; } //----------------------------------------------- // Entry //----------------------------------------------- public QilNode Clone(QilNode node) { // Assume that iterator nodes at the top-level are references rather than definitions return VisitAssumeReference(node); } //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode Visit(QilNode oldNode) { QilNode newNode = null; if (oldNode == null) return null; // ShallowClone any nodes which have not yet been cloned if (oldNode is QilReference) { // Reference nodes may have been cloned previously and put into scope newNode = FindClonedReference(oldNode); } if (newNode == null) newNode = oldNode.ShallowClone(this.fac); return base.Visit(newNode); } ////// Visit all children of "parent", replacing each child with a copy of each child. /// protected override QilNode VisitChildren(QilNode parent) { // Visit children for (int i = 0; i < parent.Count; i++) { QilNode child = parent[i]; // If child is a reference, if (IsReference(parent, i)) { // Visit the reference and substitute its copy parent[i] = VisitReference(child); // If no substutition found, then use original child if (parent[i] == null) parent[i] = child; } else { // Otherwise, visit the node and substitute its copy parent[i] = Visit(child); } } return parent; } ////// If a cloned reference is in scope, replace "oldNode". Otherwise, return "oldNode". /// protected override QilNode VisitReference(QilNode oldNode) { QilNode newNode = FindClonedReference(oldNode); return base.VisitReference(newNode == null ? oldNode : newNode); } //----------------------------------------------- // QilScopedVisitor methods //----------------------------------------------- ////// Push node and its shallow clone onto the substitution list. /// protected override void BeginScope(QilNode node) { this.subs.AddSubstitutionPair(node, node.ShallowClone(this.fac)); } ////// Pop entry from substitution list. /// protected override void EndScope(QilNode node) { this.subs.RemoveLastSubstitutionPair(); } //----------------------------------------------- // QilCloneVisitor methods //----------------------------------------------- ////// Find the clone of an in-scope reference. /// protected QilNode FindClonedReference(QilNode node) { return this.subs.FindReplacement(node); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Brush.cs
- SizeKeyFrameCollection.cs
- Viewport3DVisual.cs
- ToolStripContentPanel.cs
- ReflectionHelper.cs
- PathSegmentCollection.cs
- TextServicesLoader.cs
- SqlCacheDependencyDatabase.cs
- KeyBinding.cs
- SHA1CryptoServiceProvider.cs
- ReflectionPermission.cs
- ExpressionLink.cs
- AnnotationStore.cs
- FileDialog_Vista_Interop.cs
- WindowsListViewItemCheckBox.cs
- SqlParameterCollection.cs
- TableItemStyle.cs
- XmlMapping.cs
- ConnectionStringsExpressionBuilder.cs
- InvalidTimeZoneException.cs
- EncryptedXml.cs
- VerticalAlignConverter.cs
- RestClientProxyHandler.cs
- LassoHelper.cs
- OpacityConverter.cs
- RegistryConfigurationProvider.cs
- RangeBaseAutomationPeer.cs
- comcontractssection.cs
- ContextMenuStrip.cs
- WsatExtendedInformation.cs
- RightsManagementInformation.cs
- CodeMemberEvent.cs
- DynamicActivityTypeDescriptor.cs
- DataKeyCollection.cs
- CacheOutputQuery.cs
- Point3DValueSerializer.cs
- NotFiniteNumberException.cs
- TimelineClockCollection.cs
- WorkerRequest.cs
- TextElementEnumerator.cs
- UnsafeNativeMethods.cs
- XmlSchemaValidator.cs
- Pkcs7Recipient.cs
- MessageEventSubscriptionService.cs
- GroupItemAutomationPeer.cs
- ThicknessAnimationUsingKeyFrames.cs
- JulianCalendar.cs
- SafeLocalMemHandle.cs
- AttachedPropertiesService.cs
- ReliableDuplexSessionChannel.cs
- SortDescriptionCollection.cs
- LinkLabel.cs
- Preprocessor.cs
- RubberbandSelector.cs
- InstanceHandleConflictException.cs
- NodeLabelEditEvent.cs
- GroupBoxDesigner.cs
- keycontainerpermission.cs
- LineServicesRun.cs
- ManagementObject.cs
- DataMisalignedException.cs
- MeshGeometry3D.cs
- AutomationPattern.cs
- XmlSchemaChoice.cs
- Track.cs
- BamlVersionHeader.cs
- MessagePropertyVariants.cs
- UrlAuthFailureHandler.cs
- Visual3DCollection.cs
- PathBox.cs
- DuplexChannelBinder.cs
- ManagedWndProcTracker.cs
- FormViewDeleteEventArgs.cs
- Helpers.cs
- DependencyPropertyConverter.cs
- RuleRefElement.cs
- SrgsToken.cs
- PagedDataSource.cs
- AccessorTable.cs
- HebrewNumber.cs
- ModelPerspective.cs
- ImageIndexEditor.cs
- ImageList.cs
- MobileContainerDesigner.cs
- MetadataPropertyvalue.cs
- Oid.cs
- EditorPartCollection.cs
- AnimationStorage.cs
- FileVersionInfo.cs
- SqlDependencyListener.cs
- PropertyItem.cs
- XsltLoader.cs
- Italic.cs
- ObjectSecurity.cs
- PropertyItemInternal.cs
- ConfigLoader.cs
- ReturnType.cs
- XmlNamespaceManager.cs
- wgx_commands.cs
- DataMisalignedException.cs