Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / Visitors / LinqMaximalSubtreeNominator.cs / 1 / LinqMaximalSubtreeNominator.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Collections.Generic; using System.Diagnostics; namespace System.Data.Objects.ELinq { ////// Goes from the bottom to top and nominates nodes where all the nodes /// below the node return true from the shouldBeNominatedDelegate /// internal sealed class LinqMaximalSubtreeNominator : ExpressionVisitor { readonly HashSet_candidates; readonly Func _shouldBeNominatedDelegate; bool _cannotBeNominated = false; // not creatable private LinqMaximalSubtreeNominator(HashSet candidates, Func shouldBeNominatedDelegate) { _candidates = candidates; _shouldBeNominatedDelegate = shouldBeNominatedDelegate; } internal static HashSet Nominate(Expression expression, HashSet candidates, Func shouldBeNominatedDelegate) { Debug.Assert(candidates != null, "Candidates hashset cannot be null"); LinqMaximalSubtreeNominator nominator = new LinqMaximalSubtreeNominator(candidates, shouldBeNominatedDelegate); nominator.Visit(expression); return nominator._candidates; } internal static HashSet FindMaximalSubtrees(Expression expression, Func shouldBeNominatedDelegate) { HashSet nominees = Nominate(expression, new HashSet (), shouldBeNominatedDelegate); return MaximalSubtreeVisitor.FindMaximalSubtrees(nominees, expression); } internal override Expression Visit(Expression exp) { if (exp != null) { bool saveCannotBeNominated = _cannotBeNominated; _cannotBeNominated = false; base.Visit(exp); if (!_cannotBeNominated) { // everyone below me can be nominated, so // see if this one can be also if (_shouldBeNominatedDelegate(exp)) { _candidates.Add(exp); } else { _cannotBeNominated = true; } } _cannotBeNominated |= saveCannotBeNominated; } return exp; } /// /// Visitor that identifies maximal subtrees given a set of nominees. It walks the tree top down /// and when it identifies a nominated node, adds it to the _subtree set and stops walking. /// private sealed class MaximalSubtreeVisitor : ExpressionVisitor { private readonly HashSet_subtrees; private readonly HashSet _nominees; private MaximalSubtreeVisitor(HashSet nominees) { _nominees = nominees; _subtrees = new HashSet (); } internal static HashSet FindMaximalSubtrees(HashSet nominees, Expression query) { MaximalSubtreeVisitor visitor = new MaximalSubtreeVisitor(nominees); visitor.Visit(query); return visitor._subtrees; } internal override Expression Visit(Expression exp) { if (exp != null && _nominees.Contains(exp)) { _subtrees.Add(exp); return exp; } return base.Visit(exp); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Collections.Generic; using System.Diagnostics; namespace System.Data.Objects.ELinq { ////// Goes from the bottom to top and nominates nodes where all the nodes /// below the node return true from the shouldBeNominatedDelegate /// internal sealed class LinqMaximalSubtreeNominator : ExpressionVisitor { readonly HashSet_candidates; readonly Func _shouldBeNominatedDelegate; bool _cannotBeNominated = false; // not creatable private LinqMaximalSubtreeNominator(HashSet candidates, Func shouldBeNominatedDelegate) { _candidates = candidates; _shouldBeNominatedDelegate = shouldBeNominatedDelegate; } internal static HashSet Nominate(Expression expression, HashSet candidates, Func shouldBeNominatedDelegate) { Debug.Assert(candidates != null, "Candidates hashset cannot be null"); LinqMaximalSubtreeNominator nominator = new LinqMaximalSubtreeNominator(candidates, shouldBeNominatedDelegate); nominator.Visit(expression); return nominator._candidates; } internal static HashSet FindMaximalSubtrees(Expression expression, Func shouldBeNominatedDelegate) { HashSet nominees = Nominate(expression, new HashSet (), shouldBeNominatedDelegate); return MaximalSubtreeVisitor.FindMaximalSubtrees(nominees, expression); } internal override Expression Visit(Expression exp) { if (exp != null) { bool saveCannotBeNominated = _cannotBeNominated; _cannotBeNominated = false; base.Visit(exp); if (!_cannotBeNominated) { // everyone below me can be nominated, so // see if this one can be also if (_shouldBeNominatedDelegate(exp)) { _candidates.Add(exp); } else { _cannotBeNominated = true; } } _cannotBeNominated |= saveCannotBeNominated; } return exp; } /// /// Visitor that identifies maximal subtrees given a set of nominees. It walks the tree top down /// and when it identifies a nominated node, adds it to the _subtree set and stops walking. /// private sealed class MaximalSubtreeVisitor : ExpressionVisitor { private readonly HashSet_subtrees; private readonly HashSet _nominees; private MaximalSubtreeVisitor(HashSet nominees) { _nominees = nominees; _subtrees = new HashSet (); } internal static HashSet FindMaximalSubtrees(HashSet nominees, Expression query) { MaximalSubtreeVisitor visitor = new MaximalSubtreeVisitor(nominees); visitor.Visit(query); return visitor._subtrees; } internal override Expression Visit(Expression exp) { if (exp != null && _nominees.Contains(exp)) { _subtrees.Add(exp); return exp; } return base.Visit(exp); } } } } // 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
- TrackBarRenderer.cs
- ScrollChrome.cs
- ImageCodecInfo.cs
- AutoResizedEvent.cs
- TaskResultSetter.cs
- PopOutPanel.cs
- DataObjectMethodAttribute.cs
- DirectionalLight.cs
- ProviderConnectionPoint.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs
- EllipticalNodeOperations.cs
- Exception.cs
- Command.cs
- PtsCache.cs
- StyleCollection.cs
- PolicyConversionContext.cs
- ContentFilePart.cs
- Console.cs
- ProtectedConfigurationProviderCollection.cs
- DataRelation.cs
- Light.cs
- StreamingContext.cs
- Int32Animation.cs
- PropertyDescriptorComparer.cs
- AxisAngleRotation3D.cs
- HtmlWindowCollection.cs
- DbProviderFactory.cs
- SchemaNamespaceManager.cs
- Group.cs
- ProxyManager.cs
- ISCIIEncoding.cs
- QilChoice.cs
- AvTraceDetails.cs
- XamlValidatingReader.cs
- RedistVersionInfo.cs
- ThousandthOfEmRealPoints.cs
- SchemaNotation.cs
- DesignTableCollection.cs
- XhtmlConformanceSection.cs
- HttpModuleCollection.cs
- ZipIOExtraField.cs
- localization.cs
- MatrixAnimationBase.cs
- MasterPageBuildProvider.cs
- XPathAncestorQuery.cs
- HttpResponseInternalWrapper.cs
- RangeBase.cs
- OneOf.cs
- X509Extension.cs
- PriorityItem.cs
- DispatcherOperation.cs
- VideoDrawing.cs
- ToolStripContainer.cs
- TimeIntervalCollection.cs
- DataGridViewTopLeftHeaderCell.cs
- DragCompletedEventArgs.cs
- FontStretch.cs
- TrackingRecord.cs
- Effect.cs
- TextMarkerSource.cs
- SelectionPattern.cs
- XmlDataImplementation.cs
- HttpApplication.cs
- FloaterBaseParaClient.cs
- SoapExtensionTypeElement.cs
- HttpApplication.cs
- FullTextLine.cs
- Margins.cs
- DataGridState.cs
- DependencySource.cs
- RowUpdatedEventArgs.cs
- InstalledFontCollection.cs
- PublisherMembershipCondition.cs
- DoubleUtil.cs
- OletxResourceManager.cs
- MsmqProcessProtocolHandler.cs
- UniqueConstraint.cs
- BindToObject.cs
- Quaternion.cs
- GenericUriParser.cs
- RequiredFieldValidator.cs
- SystemWebCachingSectionGroup.cs
- ChangeDirector.cs
- StringDictionaryEditor.cs
- NegotiateStream.cs
- CacheOutputQuery.cs
- ItemContainerGenerator.cs
- DbModificationCommandTree.cs
- SecurityResources.cs
- MemberDescriptor.cs
- ChtmlTextWriter.cs
- EventLogSession.cs
- AssemblyBuilder.cs
- XmlSchemaNotation.cs
- CodeTypeReferenceExpression.cs
- ChildDocumentBlock.cs
- TreePrinter.cs
- RootProfilePropertySettingsCollection.cs
- SessionStateModule.cs
- CollectionBuilder.cs