Code:
                         / Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Common / Utils / Boolean / Simplifier.cs / 2 / Simplifier.cs
                        
                        
                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
//  
// 
// @owner [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 
using System; 
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
 
namespace System.Data.Common.Utils.Boolean
{ 
    // Simplifier visitor for Boolean expressions. Performs the following 
    // simplifications bottom-up:
    // - Eliminate True and False (A Or False iff. A, A And True iff. A) 
    // - Resolve tautology (A Or !A iff. True, True Or A iff. True) and
    // contradiction (A And !A iff. False, False And A iff. False)
    // - Flatten nested negations (!!A iff. A)
    // - Evaluate bound literals (!True iff. False, etc.) 
    // - Flatten unary/empty And/Or expressions
    internal class Simplifier : BasicVisitor 
    { 
        internal static readonly Simplifier Instance = new Simplifier();
 
        protected Simplifier()
        {
        }
 
        internal override BoolExpr VisitNot(NotExpr expression)
        { 
            BoolExpr child = expression.Child.Accept(this); 
            switch (child.ExprType)
            { 
                case ExprType.Not:
                    return ((NotExpr)child).Child;
                case ExprType.True: return FalseExpr.Value;
                case ExprType.False: return TrueExpr.Value; 
                default: return base.VisitNot(expression);
            } 
        } 
        internal override BoolExpr VisitAnd(AndExpr expression) 
        {
            return SimplifyTree(expression);
        }
 
        internal override BoolExpr VisitOr(OrExpr expression)
        { 
            return SimplifyTree(expression); 
        }
 
        private BoolExpr SimplifyTree(TreeExpr tree)
        {
            bool isAnd = ExprType.And == tree.ExprType;
            Debug.Assert(isAnd || ExprType.Or == tree.ExprType); 
            // Get list of simplified children, flattening nested And/Or expressions 
            List> simplifiedChildren = new List>(tree.Children.Count); 
            foreach (BoolExpr child in tree.Children)
            { 
                BoolExpr simplifiedChild = child.Accept(this);
                // And(And(A, B), C) iff. And(A, B, C)
                // Or(Or(A, B), C) iff. Or(A, B, C)
                if (simplifiedChild.ExprType == tree.ExprType) 
                {
                    simplifiedChildren.AddRange(((TreeExpr)simplifiedChild).Children); 
                } 
                else
                { 
                    simplifiedChildren.Add(simplifiedChild);
                }
            }
 
            // Track negated children separately to identify tautologies and contradictions
            Dictionary, bool> negatedChildren = new Dictionary, bool>(tree.Children.Count); 
            List> otherChildren = new List>(tree.Children.Count); 
            foreach (BoolExpr simplifiedChild in simplifiedChildren)
            { 
                switch (simplifiedChild.ExprType)
                {
                    case ExprType.Not:
                        negatedChildren[((NotExpr)simplifiedChild).Child] = true; 
                        break;
                    case ExprType.False: 
                        // False And A --> False 
                        if (isAnd) { return FalseExpr.Value; }
                        // False || A --> A (omit False from child collections) 
                        break;
                    case ExprType.True:
                        // True Or A --> True
                        if (!isAnd) { return TrueExpr.Value; } 
                        // True And A --> A (omit True from child collections)
                        break; 
                    default: 
                        otherChildren.Add(simplifiedChild);
                        break; 
                }
            }
            List> children = new List>();
            foreach (BoolExpr child in otherChildren) 
            {
                if (negatedChildren.ContainsKey(child)) 
                { 
                    // A && !A --> False, A || !A --> True
                    if (isAnd) { return FalseExpr.Value; } 
                    else { return TrueExpr.Value; }
                }
                children.Add(child);
            } 
            foreach (BoolExpr child in negatedChildren.Keys)
            { 
                children.Add(child.MakeNegated()); 
            }
            if (0 == children.Count) 
            {
                // And() iff. True
                if (isAnd) { return TrueExpr.Value; }
                // Or() iff. False 
                else { return FalseExpr.Value; }
            } 
            else if (1 == children.Count) 
            {
                // Or(A) iff. A, And(A) iff. A 
                return children[0];
            }
            else
            { 
                // Construct simplified And/Or expression
                TreeExpr result; 
                if (isAnd) { result = new AndExpr(children); } 
                else { result = new OrExpr(children); }
                return result; 
            }
        }
    }
} 
// 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;
 
namespace System.Data.Common.Utils.Boolean
{ 
    // Simplifier visitor for Boolean expressions. Performs the following 
    // simplifications bottom-up:
    // - Eliminate True and False (A Or False iff. A, A And True iff. A) 
    // - Resolve tautology (A Or !A iff. True, True Or A iff. True) and
    // contradiction (A And !A iff. False, False And A iff. False)
    // - Flatten nested negations (!!A iff. A)
    // - Evaluate bound literals (!True iff. False, etc.) 
    // - Flatten unary/empty And/Or expressions
    internal class Simplifier : BasicVisitor 
    { 
        internal static readonly Simplifier Instance = new Simplifier();
 
        protected Simplifier()
        {
        }
 
        internal override BoolExpr VisitNot(NotExpr expression)
        { 
            BoolExpr child = expression.Child.Accept(this); 
            switch (child.ExprType)
            { 
                case ExprType.Not:
                    return ((NotExpr)child).Child;
                case ExprType.True: return FalseExpr.Value;
                case ExprType.False: return TrueExpr.Value; 
                default: return base.VisitNot(expression);
            } 
        } 
        internal override BoolExpr VisitAnd(AndExpr expression) 
        {
            return SimplifyTree(expression);
        }
 
        internal override BoolExpr VisitOr(OrExpr expression)
        { 
            return SimplifyTree(expression); 
        }
 
        private BoolExpr SimplifyTree(TreeExpr tree)
        {
            bool isAnd = ExprType.And == tree.ExprType;
            Debug.Assert(isAnd || ExprType.Or == tree.ExprType); 
            // Get list of simplified children, flattening nested And/Or expressions 
            List> simplifiedChildren = new List>(tree.Children.Count); 
            foreach (BoolExpr child in tree.Children)
            { 
                BoolExpr simplifiedChild = child.Accept(this);
                // And(And(A, B), C) iff. And(A, B, C)
                // Or(Or(A, B), C) iff. Or(A, B, C)
                if (simplifiedChild.ExprType == tree.ExprType) 
                {
                    simplifiedChildren.AddRange(((TreeExpr)simplifiedChild).Children); 
                } 
                else
                { 
                    simplifiedChildren.Add(simplifiedChild);
                }
            }
 
            // Track negated children separately to identify tautologies and contradictions
            Dictionary, bool> negatedChildren = new Dictionary, bool>(tree.Children.Count); 
            List> otherChildren = new List>(tree.Children.Count); 
            foreach (BoolExpr simplifiedChild in simplifiedChildren)
            { 
                switch (simplifiedChild.ExprType)
                {
                    case ExprType.Not:
                        negatedChildren[((NotExpr)simplifiedChild).Child] = true; 
                        break;
                    case ExprType.False: 
                        // False And A --> False 
                        if (isAnd) { return FalseExpr.Value; }
                        // False || A --> A (omit False from child collections) 
                        break;
                    case ExprType.True:
                        // True Or A --> True
                        if (!isAnd) { return TrueExpr.Value; } 
                        // True And A --> A (omit True from child collections)
                        break; 
                    default: 
                        otherChildren.Add(simplifiedChild);
                        break; 
                }
            }
            List> children = new List>();
            foreach (BoolExpr child in otherChildren) 
            {
                if (negatedChildren.ContainsKey(child)) 
                { 
                    // A && !A --> False, A || !A --> True
                    if (isAnd) { return FalseExpr.Value; } 
                    else { return TrueExpr.Value; }
                }
                children.Add(child);
            } 
            foreach (BoolExpr child in negatedChildren.Keys)
            { 
                children.Add(child.MakeNegated()); 
            }
            if (0 == children.Count) 
            {
                // And() iff. True
                if (isAnd) { return TrueExpr.Value; }
                // Or() iff. False 
                else { return FalseExpr.Value; }
            } 
            else if (1 == children.Count) 
            {
                // Or(A) iff. A, And(A) iff. A 
                return children[0];
            }
            else
            { 
                // Construct simplified And/Or expression
                TreeExpr result; 
                if (isAnd) { result = new AndExpr(children); } 
                else { result = new OrExpr(children); }
                return result; 
            }
        }
    }
} 
// 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
- HierarchicalDataBoundControlAdapter.cs
- TransformPattern.cs
- SqlSupersetValidator.cs
- DesignerUtility.cs
- BuildManager.cs
- ArithmeticException.cs
- ProcessThread.cs
- ClientSettingsSection.cs
- ColumnCollection.cs
- activationcontext.cs
- LineGeometry.cs
- ObjectCloneHelper.cs
- XPathMultyIterator.cs
- TableLayoutColumnStyleCollection.cs
- ToolStripContentPanel.cs
- ButtonColumn.cs
- Color.cs
- SafeNativeMethodsMilCoreApi.cs
- BindingList.cs
- TransformedBitmap.cs
- ServiceModelSectionGroup.cs
- XDRSchema.cs
- TableHeaderCell.cs
- QilCloneVisitor.cs
- QueryContinueDragEvent.cs
- Geometry3D.cs
- XmlQueryType.cs
- NamespaceDisplay.xaml.cs
- MemoryStream.cs
- ReceiveMessageContent.cs
- SynchronizedDisposablePool.cs
- TreeNodeCollection.cs
- DataGridViewButtonColumn.cs
- WriteTimeStream.cs
- LayoutManager.cs
- StsCommunicationException.cs
- PreviewControlDesigner.cs
- UniformGrid.cs
- XPathBuilder.cs
- PlaceHolder.cs
- TextTrailingWordEllipsis.cs
- CodeNamespaceCollection.cs
- ObfuscationAttribute.cs
- autovalidator.cs
- CacheOutputQuery.cs
- SiteMapNodeItem.cs
- SchemaDeclBase.cs
- PrinterResolution.cs
- ConstantSlot.cs
- DataContractFormatAttribute.cs
- LateBoundBitmapDecoder.cs
- CacheModeValueSerializer.cs
- _SslState.cs
- OutputWindow.cs
- ControlUtil.cs
- LockCookie.cs
- XmlBinaryReaderSession.cs
- DataRowExtensions.cs
- TypeToken.cs
- QueryableFilterRepeater.cs
- RunInstallerAttribute.cs
- SrgsGrammarCompiler.cs
- LinqExpressionNormalizer.cs
- ProxyWebPartManager.cs
- LayoutManager.cs
- Normalization.cs
- ZoomingMessageFilter.cs
- EntityContainerEmitter.cs
- SchemaComplexType.cs
- Select.cs
- Compensate.cs
- Int64Storage.cs
- X509AsymmetricSecurityKey.cs
- IndentTextWriter.cs
- StringUtil.cs
- CopyCodeAction.cs
- FileDataSourceCache.cs
- SelectionEditor.cs
- ImportCatalogPart.cs
- SecurityException.cs
- NavigationPropertySingletonExpression.cs
- Application.cs
- RowToFieldTransformer.cs
- ModelPropertyCollectionImpl.cs
- FrameworkTextComposition.cs
- CodeExporter.cs
- ObjectViewListener.cs
- ServiceOperationListItem.cs
- MethodExpr.cs
- TransformProviderWrapper.cs
- ConnectionsZone.cs
- NegationPusher.cs
- ExitEventArgs.cs
- OutOfProcStateClientManager.cs
- ValidatorCompatibilityHelper.cs
- SimpleType.cs
- TemplateControlParser.cs
- Ref.cs
- PartialList.cs
- ExceptionList.cs