Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GridViewColumn.cs
- DataServiceRequestOfT.cs
- AsyncStreamReader.cs
- MarginsConverter.cs
- AspNetSynchronizationContext.cs
- TimeStampChecker.cs
- UserInitiatedRoutedEventPermission.cs
- JournalEntryStack.cs
- DataTablePropertyDescriptor.cs
- HtmlTable.cs
- HyperLinkColumn.cs
- ValidationPropertyAttribute.cs
- HttpCookie.cs
- WebPartHelpVerb.cs
- WebPartConnectionsDisconnectVerb.cs
- NativeMethodsOther.cs
- FloaterBaseParaClient.cs
- DataFormat.cs
- XamlToRtfWriter.cs
- SoapSchemaExporter.cs
- BamlResourceContent.cs
- DispatcherOperation.cs
- SiteMapNodeItem.cs
- ListViewInsertedEventArgs.cs
- CollectionView.cs
- PropagatorResult.cs
- ReferenceEqualityComparer.cs
- MemberPath.cs
- MenuBindingsEditorForm.cs
- oledbmetadatacolumnnames.cs
- StandardCommandToolStripMenuItem.cs
- ItemsPresenter.cs
- FontStyle.cs
- BaseTemplateBuildProvider.cs
- MethodCallTranslator.cs
- MethodAccessException.cs
- Exception.cs
- XmlQualifiedName.cs
- BinaryKeyIdentifierClause.cs
- AppliedDeviceFiltersEditor.cs
- _StreamFramer.cs
- SettingsProviderCollection.cs
- TextEditorContextMenu.cs
- TypeReference.cs
- StateManagedCollection.cs
- WindowsScrollBarBits.cs
- ConnectionManagementElement.cs
- StatusBarDrawItemEvent.cs
- ConsoleEntryPoint.cs
- RangeValidator.cs
- InputProcessorProfiles.cs
- PanelStyle.cs
- GPPOINTF.cs
- ReceiveActivity.cs
- PackageFilter.cs
- RepeaterItemEventArgs.cs
- FamilyMap.cs
- GlyphsSerializer.cs
- AuthorizationRuleCollection.cs
- BatchStream.cs
- Error.cs
- IProvider.cs
- ToolboxBitmapAttribute.cs
- WebPartManagerInternals.cs
- NavigatingCancelEventArgs.cs
- HwndSubclass.cs
- X509Certificate2.cs
- CryptoHandle.cs
- SQLBytes.cs
- TailCallAnalyzer.cs
- sqlstateclientmanager.cs
- ObsoleteAttribute.cs
- EventsTab.cs
- ColumnMapCopier.cs
- MergeEnumerator.cs
- TreeSet.cs
- StorageModelBuildProvider.cs
- ReturnType.cs
- HttpConfigurationContext.cs
- RootProfilePropertySettingsCollection.cs
- WebPartConnectionCollection.cs
- XmlSchemaAttribute.cs
- RuleAction.cs
- PictureBoxDesigner.cs
- UxThemeWrapper.cs
- AggregateNode.cs
- XmlSchemaAttribute.cs
- BoundPropertyEntry.cs
- ParserContext.cs
- ObjectReferenceStack.cs
- HiddenFieldPageStatePersister.cs
- RsaKeyIdentifierClause.cs
- StrokeCollection2.cs
- DataExpression.cs
- TypeDescriptionProvider.cs
- ISAPIApplicationHost.cs
- safesecurityhelperavalon.cs
- GridLengthConverter.cs
- isolationinterop.cs
- StrokeCollection.cs