Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Common / Utils / Boolean / NegationPusher.cs / 1305376 / NegationPusher.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Linq; namespace System.Data.Common.Utils.Boolean { // Top-down push-down of negation in Boolean expressions. // - !(A or B) iff. !A and !B // - !(A and B) iff. !A or !B // - !!A iff. A // Uses two visitor classes: one to handle negated subtrees (essentially creates // an inverted tree) and one to handle non-negated subtrees (replicates until it // encounters NotExpr) internal static class NegationPusher { internal static BoolExpr> EliminateNot (BoolExpr > expression) { return expression.Accept(NonNegatedDomainConstraintTreeVisitor .Instance); } private class NonNegatedTreeVisitor : BasicVisitor { internal static readonly NonNegatedTreeVisitor Instance = new NonNegatedTreeVisitor (); protected NonNegatedTreeVisitor() { } internal override BoolExpr VisitNot(NotExpr expression) { return expression.Child.Accept(NegatedTreeVisitor .Instance); } } private class NegatedTreeVisitor : Visitor > { internal static readonly NegatedTreeVisitor Instance = new NegatedTreeVisitor (); protected NegatedTreeVisitor() { } internal override BoolExpr VisitTrue(TrueExpr expression) { return FalseExpr .Value; } internal override BoolExpr VisitFalse(FalseExpr expression) { return TrueExpr .Value; } internal override BoolExpr VisitTerm(TermExpr expression) { return new NotExpr (expression); } internal override BoolExpr VisitNot(NotExpr expression) { return expression.Child.Accept(NonNegatedTreeVisitor .Instance); } internal override BoolExpr VisitAnd(AndExpr expression) { return new OrExpr (expression.Children.Select(child => child.Accept(this))); } internal override BoolExpr VisitOr(OrExpr expression) { return new AndExpr (expression.Children.Select(child => child.Accept(this))); } } private class NonNegatedDomainConstraintTreeVisitor : NonNegatedTreeVisitor > { internal new static readonly NonNegatedDomainConstraintTreeVisitor Instance = new NonNegatedDomainConstraintTreeVisitor (); private NonNegatedDomainConstraintTreeVisitor() { } internal override BoolExpr > VisitNot(NotExpr > expression) { return expression.Child.Accept(NegatedDomainConstraintTreeVisitor .Instance); } } private class NegatedDomainConstraintTreeVisitor : NegatedTreeVisitor > { internal new static readonly NegatedDomainConstraintTreeVisitor Instance = new NegatedDomainConstraintTreeVisitor (); private NegatedDomainConstraintTreeVisitor() { } internal override BoolExpr > VisitNot(NotExpr > expression) { return expression.Child.Accept(NonNegatedDomainConstraintTreeVisitor .Instance); } internal override BoolExpr > VisitTerm(TermExpr > expression) { return new TermExpr >(expression.Identifier.InvertDomainConstraint()); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Linq; namespace System.Data.Common.Utils.Boolean { // Top-down push-down of negation in Boolean expressions. // - !(A or B) iff. !A and !B // - !(A and B) iff. !A or !B // - !!A iff. A // Uses two visitor classes: one to handle negated subtrees (essentially creates // an inverted tree) and one to handle non-negated subtrees (replicates until it // encounters NotExpr) internal static class NegationPusher { internal static BoolExpr> EliminateNot (BoolExpr > expression) { return expression.Accept(NonNegatedDomainConstraintTreeVisitor .Instance); } private class NonNegatedTreeVisitor : BasicVisitor { internal static readonly NonNegatedTreeVisitor Instance = new NonNegatedTreeVisitor (); protected NonNegatedTreeVisitor() { } internal override BoolExpr VisitNot(NotExpr expression) { return expression.Child.Accept(NegatedTreeVisitor .Instance); } } private class NegatedTreeVisitor : Visitor > { internal static readonly NegatedTreeVisitor Instance = new NegatedTreeVisitor (); protected NegatedTreeVisitor() { } internal override BoolExpr VisitTrue(TrueExpr expression) { return FalseExpr .Value; } internal override BoolExpr VisitFalse(FalseExpr expression) { return TrueExpr .Value; } internal override BoolExpr VisitTerm(TermExpr expression) { return new NotExpr (expression); } internal override BoolExpr VisitNot(NotExpr expression) { return expression.Child.Accept(NonNegatedTreeVisitor .Instance); } internal override BoolExpr VisitAnd(AndExpr expression) { return new OrExpr (expression.Children.Select(child => child.Accept(this))); } internal override BoolExpr VisitOr(OrExpr expression) { return new AndExpr (expression.Children.Select(child => child.Accept(this))); } } private class NonNegatedDomainConstraintTreeVisitor : NonNegatedTreeVisitor > { internal new static readonly NonNegatedDomainConstraintTreeVisitor Instance = new NonNegatedDomainConstraintTreeVisitor (); private NonNegatedDomainConstraintTreeVisitor() { } internal override BoolExpr > VisitNot(NotExpr > expression) { return expression.Child.Accept(NegatedDomainConstraintTreeVisitor .Instance); } } private class NegatedDomainConstraintTreeVisitor : NegatedTreeVisitor > { internal new static readonly NegatedDomainConstraintTreeVisitor Instance = new NegatedDomainConstraintTreeVisitor (); private NegatedDomainConstraintTreeVisitor() { } internal override BoolExpr > VisitNot(NotExpr > expression) { return expression.Child.Accept(NonNegatedDomainConstraintTreeVisitor .Instance); } internal override BoolExpr > VisitTerm(TermExpr > expression) { return new TermExpr >(expression.Identifier.InvertDomainConstraint()); } } } } // 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
- FileFormatException.cs
- FontUnit.cs
- OutputCacheSettingsSection.cs
- EntityDataSourceEntitySetNameItem.cs
- ChannelToken.cs
- AuthorizationRuleCollection.cs
- AdornerHitTestResult.cs
- MarkupCompiler.cs
- unitconverter.cs
- DataGridViewCellStyleEditor.cs
- DynamicDataResources.Designer.cs
- WebPartZoneCollection.cs
- DbModificationClause.cs
- ConfigPathUtility.cs
- SQLCharsStorage.cs
- NativeCppClassAttribute.cs
- SamlAssertionKeyIdentifierClause.cs
- ValidateNames.cs
- WindowCollection.cs
- BamlReader.cs
- DebugTracing.cs
- DataServiceKeyAttribute.cs
- IRCollection.cs
- BamlWriter.cs
- PropertyDescriptorCollection.cs
- CheckBox.cs
- WindowsEditBoxRange.cs
- ActivityDesignerHighlighter.cs
- AssemblyBuilder.cs
- ErrorFormatter.cs
- Base64Decoder.cs
- HybridWebProxyFinder.cs
- MasterPageParser.cs
- DataGridViewBindingCompleteEventArgs.cs
- BypassElementCollection.cs
- EntityDataSourceReferenceGroup.cs
- HelloMessage11.cs
- RecordsAffectedEventArgs.cs
- FontInfo.cs
- wgx_commands.cs
- TextEditorDragDrop.cs
- AppLevelCompilationSectionCache.cs
- XslAst.cs
- TraceHandler.cs
- Query.cs
- TypeSystemHelpers.cs
- RetriableClipboard.cs
- _TransmitFileOverlappedAsyncResult.cs
- ListViewItemSelectionChangedEvent.cs
- ToolStripStatusLabel.cs
- CompilerState.cs
- DataGridItemCollection.cs
- FontNamesConverter.cs
- DESCryptoServiceProvider.cs
- BehaviorDragDropEventArgs.cs
- Attributes.cs
- _SecureChannel.cs
- ParserHooks.cs
- TextBox.cs
- GridViewPageEventArgs.cs
- Match.cs
- HostingEnvironmentSection.cs
- Vector3DConverter.cs
- ParameterElementCollection.cs
- ErrorWrapper.cs
- SafePointer.cs
- EntityProxyTypeInfo.cs
- WebPartActionVerb.cs
- ContractMapping.cs
- AxisAngleRotation3D.cs
- GridItemCollection.cs
- ChangeToolStripParentVerb.cs
- NewArray.cs
- DialogResultConverter.cs
- DbProviderManifest.cs
- SqlBuffer.cs
- DbConnectionPoolOptions.cs
- DataGridRelationshipRow.cs
- DataServiceQuery.cs
- M3DUtil.cs
- PassportIdentity.cs
- OleAutBinder.cs
- NumericExpr.cs
- WindowsTooltip.cs
- ItemAutomationPeer.cs
- DesignerUtility.cs
- ExpressionNode.cs
- MenuTracker.cs
- CommunicationObject.cs
- DateTimeFormat.cs
- XamlToRtfParser.cs
- ResXDataNode.cs
- StorageAssociationTypeMapping.cs
- ToolboxItemFilterAttribute.cs
- DefaultBindingPropertyAttribute.cs
- TypeDelegator.cs
- ConnectionManagementSection.cs
- TableLayoutSettingsTypeConverter.cs
- AttributeUsageAttribute.cs
- CodeIdentifier.cs