Ejemplo n.º 1
0
        private static ISpecification <T>[] GetFlatArgumentsArray(CompositeSpecificationOperation operation,
                                                                  ISpecification <T>[] arguments)
        {
            if (operation != CompositeSpecificationOperation.And &&
                operation != CompositeSpecificationOperation.Or)
            {
                return(arguments);
            }

            var argsCount = GetFlatArgsCount(operation, arguments);

            if (argsCount == arguments.Length)
            {
                return(arguments);
            }

            var res = new ISpecification <T> [argsCount];
            var idx = 0;

            foreach (var arg in GetFlatArgs(operation, arguments))
            {
                res[idx] = arg;
                ++idx;
            }

            return(res);
        }
Ejemplo n.º 2
0
 /// <summary>Initializes a new instance of the <see cref="CompositeSpecification{T}"/> class.</summary>
 /// <param name="algebra">The algebra.</param>
 /// <param name="operation">The operator.</param>
 /// <param name="arguments">The arguments.</param>
 public CompositeSpecification(ISpecificationAlgebra <T> algebra,
                               CompositeSpecificationOperation operation,
                               params ISpecification <T>[] arguments
                               )
     : base(algebra.GetHighestPrioritizedAlgebra <Specification <T>, ISpecificationAlgebra <T> >(arguments.OfType <IDefineAlgebraicDomain <Specification <T>, ISpecificationAlgebra <T> > >().Select(a => a.Algebra)), null)
 {
     Operation  = operation;
     _arguments = GetFlatArgumentsArray(operation, arguments);
 }
        public static bool CanBeRepresentedByCodeOperator(this CompositeSpecificationOperation operation)
        {
            switch (operation)
            {
            case CompositeSpecificationOperation.And:
            case CompositeSpecificationOperation.Or:
            case CompositeSpecificationOperation.XOr:
                return(true);

            default:
                return(false);
            }
        }
        public static OverloadableCodeBinarySymmetricOperator ToCodeSymmetricBinaryOperator(
            this CompositeSpecificationOperation operation)
        {
            switch (operation)
            {
            case CompositeSpecificationOperation.And: return(OverloadableCodeBinarySymmetricOperator.And);

            case CompositeSpecificationOperation.Or:  return(OverloadableCodeBinarySymmetricOperator.Or);

            case CompositeSpecificationOperation.XOr: return(OverloadableCodeBinarySymmetricOperator.XOr);

            default: throw new NotSupportedException($"Operator {operation} is not supported.");
            }
        }
Ejemplo n.º 5
0
 private static IEnumerable <ISpecification <T> > GetFlatArgs(CompositeSpecificationOperation @operator, IEnumerable <ISpecification <T> > specifications)
 {
     foreach (var spec in specifications)
     {
         if (spec is ICompositeSpecification <T> composite && composite.Operation == @operator)
         {
             foreach (var arg in composite.Arguments)
             {
                 yield return(arg);
             }
         }
         else
         {
             yield return(spec);
         }
     }
 }
Ejemplo n.º 6
0
 private static int GetFlatArgsCount(CompositeSpecificationOperation operation, IEnumerable <ISpecification <T> > specifications)
 {
     return(specifications.Sum(spec => spec is ICompositeSpecification <T> composite && composite.Operation == operation
                         ? composite.Arguments.Count
                         : 1));
 }