//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;
namespace System.Data.Common.Utils.Boolean
{
///
/// Services related to different identifier types for Boolean expressions.
///
internal abstract class IdentifierService
{
#region Static members
internal static readonly IdentifierService Instance = GetIdentifierService();
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static IdentifierService GetIdentifierService()
{
Type identifierType = typeof(T_Identifier);
if (identifierType.IsGenericType &&
identifierType.GetGenericTypeDefinition() == typeof(DomainConstraint<,>))
{
// initialize a domain constraint literal service
Type[] genericArguments = identifierType.GetGenericArguments();
Type variableType = genericArguments[0];
Type elementType = genericArguments[1];
return (IdentifierService)Activator.CreateInstance(
typeof(DomainConstraintIdentifierService<,>).MakeGenericType(identifierType, variableType, elementType));
}
else
{
// initialize a generic literal service for all other identifier types
return new GenericIdentifierService();
}
}
#endregion
#region Constructors
private IdentifierService()
{
}
#endregion
#region Service methods
///
/// Returns negation of the given literal.
///
internal abstract Literal NegateLiteral(Literal literal);
///
/// Creates a new conversion context.
///
internal abstract ConversionContext CreateConversionContext();
///
/// Performs local simplification appropriate to the current identifier.
///
internal abstract BoolExpr LocalSimplify(BoolExpr expression);
#endregion
private class GenericIdentifierService : IdentifierService
{
internal override Literal NegateLiteral(Literal literal)
{
// just invert the sign
return new Literal(literal.Term, !literal.IsTermPositive);
}
internal override ConversionContext CreateConversionContext()
{
return new GenericConversionContext();
}
internal override BoolExpr LocalSimplify(BoolExpr expression)
{
return expression.Accept(Simplifier.Instance);
}
}
private class DomainConstraintIdentifierService : IdentifierService>
{
internal override Literal> NegateLiteral(Literal> literal)
{
// negate the literal by inverting the range, rather than changing the sign
// of the literal
TermExpr> term = new TermExpr>(
literal.Term.Identifier.InvertDomainConstraint());
return new Literal>(term, literal.IsTermPositive);
}
internal override ConversionContext> CreateConversionContext()
{
return new DomainConstraintConversionContext();
}
internal override BoolExpr> LocalSimplify(BoolExpr> expression)
{
expression = NegationPusher.EliminateNot(expression);
return expression.Accept(Simplifier>.Instance);
}
}
}
}