Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MethodAccessException.cs
- EntityContainerEntitySet.cs
- XmlCompatibilityReader.cs
- TextMarkerSource.cs
- LicenseProviderAttribute.cs
- MenuItemStyleCollection.cs
- NonPrimarySelectionGlyph.cs
- SessionPageStateSection.cs
- FaultDescriptionCollection.cs
- WebPartExportVerb.cs
- DefaultObjectSerializer.cs
- DSACryptoServiceProvider.cs
- Matrix3D.cs
- ChooseAction.cs
- WebPartUtil.cs
- smtpconnection.cs
- Schema.cs
- CodeGeneratorOptions.cs
- _SafeNetHandles.cs
- BitStack.cs
- NetworkInformationPermission.cs
- FontEmbeddingManager.cs
- UpdateManifestForBrowserApplication.cs
- DataGridViewControlCollection.cs
- SqlNode.cs
- FieldInfo.cs
- GenericTypeParameterBuilder.cs
- MenuStrip.cs
- OciHandle.cs
- QuadraticBezierSegment.cs
- Int32CollectionConverter.cs
- ClipboardData.cs
- ErrorFormatter.cs
- OleDbInfoMessageEvent.cs
- TextEditorSpelling.cs
- EmissiveMaterial.cs
- TempFiles.cs
- Visual3D.cs
- DelayedRegex.cs
- RichTextBox.cs
- InkCanvasSelectionAdorner.cs
- XslAstAnalyzer.cs
- RemotingException.cs
- FlowLayout.cs
- FileCodeGroup.cs
- PolyBezierSegment.cs
- BoolExpressionVisitors.cs
- SoapConverter.cs
- safex509handles.cs
- HtmlGenericControl.cs
- GraphicsPath.cs
- DPAPIProtectedConfigurationProvider.cs
- ItemTypeToolStripMenuItem.cs
- QuinticEase.cs
- TreeView.cs
- Soap.cs
- AssociatedControlConverter.cs
- VBIdentifierDesigner.xaml.cs
- IndicCharClassifier.cs
- ComponentCommands.cs
- FileSystemEventArgs.cs
- ValidatorUtils.cs
- ScrollBarRenderer.cs
- TableCellAutomationPeer.cs
- Rfc2898DeriveBytes.cs
- _ProxyChain.cs
- FontNameEditor.cs
- sqlpipe.cs
- UserPreferenceChangingEventArgs.cs
- SqlDelegatedTransaction.cs
- DefaultPrintController.cs
- Matrix3D.cs
- HiddenField.cs
- ConfigurationManagerInternalFactory.cs
- ThrowHelper.cs
- NoClickablePointException.cs
- DefaultParameterValueAttribute.cs
- MailMessageEventArgs.cs
- NameValueConfigurationCollection.cs
- Preprocessor.cs
- SQLMoneyStorage.cs
- BaseDataBoundControl.cs
- TileBrush.cs
- UMPAttributes.cs
- TimeSpanSecondsConverter.cs
- EntityClassGenerator.cs
- ResourcesChangeInfo.cs
- SymbolDocumentInfo.cs
- RtfNavigator.cs
- CustomError.cs
- SeparatorAutomationPeer.cs
- ConstraintStruct.cs
- Closure.cs
- DataGridViewColumnCollection.cs
- XPathNodePointer.cs
- TextEditorDragDrop.cs
- FastEncoderWindow.cs
- SerTrace.cs
- HttpCookie.cs
- PartialList.cs