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 / Common / Utils / Boolean / NegationPusher.cs / 1 / 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
- WorkflowEnvironment.cs
- CapabilitiesAssignment.cs
- UnmanagedBitmapWrapper.cs
- ConfigurationStrings.cs
- XamlSerializationHelper.cs
- DictionaryCustomTypeDescriptor.cs
- FormViewModeEventArgs.cs
- GridItemPattern.cs
- XmlNamespaceDeclarationsAttribute.cs
- TextEffectResolver.cs
- ThemeInfoAttribute.cs
- NetDataContractSerializer.cs
- HebrewNumber.cs
- XmlReaderSettings.cs
- AlphabeticalEnumConverter.cs
- LinkedResource.cs
- XpsFont.cs
- RectangleGeometry.cs
- XsltFunctions.cs
- PriorityBinding.cs
- AssociationSetMetadata.cs
- BamlBinaryReader.cs
- ProtocolViolationException.cs
- TrackBar.cs
- ManipulationCompletedEventArgs.cs
- GeometryConverter.cs
- IPEndPointCollection.cs
- PropertyBuilder.cs
- AssociatedControlConverter.cs
- GlyphingCache.cs
- MimeBasePart.cs
- SettingsPropertyWrongTypeException.cs
- RestHandlerFactory.cs
- DataControlCommands.cs
- RequestBringIntoViewEventArgs.cs
- BitmapEffectInput.cs
- IProducerConsumerCollection.cs
- MaskInputRejectedEventArgs.cs
- SoapAttributeOverrides.cs
- AggregateNode.cs
- DelegatedStream.cs
- QueryCreatedEventArgs.cs
- TabletDevice.cs
- BasicHttpBindingCollectionElement.cs
- BamlRecords.cs
- IInstanceTable.cs
- CodeTypeOfExpression.cs
- Accessors.cs
- OpenTypeLayout.cs
- TypeSystemProvider.cs
- RadioButtonAutomationPeer.cs
- DefaultMemberAttribute.cs
- StreamHelper.cs
- XmlSchemaSimpleContentRestriction.cs
- InstanceHandleConflictException.cs
- SerializerDescriptor.cs
- ParameterSubsegment.cs
- DelegateSerializationHolder.cs
- CodeDirectoryCompiler.cs
- WebPartConnectionsConnectVerb.cs
- ServiceSecurityAuditElement.cs
- WindowsImpersonationContext.cs
- ConnectionInterfaceCollection.cs
- XmlSchemaComplexContentRestriction.cs
- CompensationExtension.cs
- AnalyzedTree.cs
- DataColumnMappingCollection.cs
- CommentEmitter.cs
- Parser.cs
- ResourceWriter.cs
- DynamicMethod.cs
- StrokeNodeOperations2.cs
- DataGridLengthConverter.cs
- DataDocumentXPathNavigator.cs
- SqlTriggerContext.cs
- QilFactory.cs
- MessageHeaderException.cs
- EdmSchemaError.cs
- StickyNoteHelper.cs
- WebReferenceOptions.cs
- LicenseContext.cs
- DataSourceViewSchemaConverter.cs
- HealthMonitoringSection.cs
- SqlAliaser.cs
- SharedDp.cs
- ReleaseInstanceMode.cs
- Array.cs
- XNameTypeConverter.cs
- ColumnHeader.cs
- TagNameToTypeMapper.cs
- isolationinterop.cs
- DocobjHost.cs
- VirtualDirectoryMappingCollection.cs
- FileSystemInfo.cs
- SortedList.cs
- RoleProviderPrincipal.cs
- InvalidCastException.cs
- TextDecorationCollectionConverter.cs
- XmlSerializerAssemblyAttribute.cs
- QueueException.cs