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
- AnnotationAdorner.cs
- InstanceDescriptor.cs
- DetailsViewAutoFormat.cs
- QueryLifecycle.cs
- GridPattern.cs
- Label.cs
- TextEditorSelection.cs
- Emitter.cs
- SecureStringHasher.cs
- DateTimeConverter.cs
- XmlAnyElementAttribute.cs
- CodeDomConfigurationHandler.cs
- LinqDataSourceSelectEventArgs.cs
- SystemIPv6InterfaceProperties.cs
- Propagator.Evaluator.cs
- DetailsViewModeEventArgs.cs
- Brush.cs
- ProcessHostConfigUtils.cs
- SynchronizedInputAdaptor.cs
- XmlValidatingReader.cs
- DescendantOverDescendantQuery.cs
- Point3DValueSerializer.cs
- TextAdaptor.cs
- WebPartConnectionsCancelEventArgs.cs
- SchemaCollectionCompiler.cs
- UIElement3D.cs
- RectAnimationBase.cs
- CellConstantDomain.cs
- UserMapPath.cs
- ButtonRenderer.cs
- SortExpressionBuilder.cs
- SortDescriptionCollection.cs
- Bold.cs
- MoveSizeWinEventHandler.cs
- AnnotationMap.cs
- AnnotationResource.cs
- DecoderNLS.cs
- Method.cs
- DataGridViewRowHeaderCell.cs
- ASCIIEncoding.cs
- XPathDocumentIterator.cs
- TextRangeEditTables.cs
- LoginUtil.cs
- DataServiceContext.cs
- TextRangeAdaptor.cs
- XmlUtil.cs
- TextContainer.cs
- SpecialTypeDataContract.cs
- CoTaskMemHandle.cs
- DPTypeDescriptorContext.cs
- EntityTransaction.cs
- CollectionContainer.cs
- Opcode.cs
- TextModifierScope.cs
- ContextBase.cs
- WebPartMovingEventArgs.cs
- UdpContractFilterBehavior.cs
- BaseComponentEditor.cs
- IdentityManager.cs
- GlyphRunDrawing.cs
- RangeContentEnumerator.cs
- SqlCacheDependencyDatabase.cs
- GridView.cs
- LoginUtil.cs
- EditBehavior.cs
- SqlTransaction.cs
- LiteralSubsegment.cs
- CompositeDataBoundControl.cs
- StringSorter.cs
- DrawingContextWalker.cs
- SuppressMessageAttribute.cs
- XsltSettings.cs
- ComPlusDiagnosticTraceRecords.cs
- CodeCompileUnit.cs
- AdRotator.cs
- BehaviorService.cs
- CodeSnippetTypeMember.cs
- CultureTableRecord.cs
- CompilerState.cs
- ImportCatalogPart.cs
- MembershipPasswordException.cs
- HtmlDocument.cs
- DocumentCollection.cs
- DetailsViewPagerRow.cs
- DependencySource.cs
- XmlConvert.cs
- GeneralTransform3DTo2DTo3D.cs
- BufferManager.cs
- HttpRequestTraceRecord.cs
- TdsParserSafeHandles.cs
- WebControlAdapter.cs
- SpellCheck.cs
- PinnedBufferMemoryStream.cs
- CryptoConfig.cs
- WorkflowRuntimeServicesBehavior.cs
- ToolboxComponentsCreatedEventArgs.cs
- HttpRawResponse.cs
- SR.cs
- TextRenderer.cs
- FilterEventArgs.cs