private IEnumerable <ProgramState> TrySetObjectConstraint(ObjectConstraint constraint, SymbolicValueConstraints oldConstraints, ProgramState programState) { if (oldConstraints.HasConstraint <BoolConstraint>()) { if (constraint == ObjectConstraint.Null) { return(Enumerable.Empty <ProgramState>()); } return(new[] { programState }); } var oldObjectConstraint = oldConstraints.GetConstraintOrDefault <ObjectConstraint>(); if (oldObjectConstraint != null) { if (oldObjectConstraint != constraint) { return(Enumerable.Empty <ProgramState>()); } return(new[] { programState.SetConstraint(this, constraint) }); } throw new NotSupportedException($"Neither {nameof(BoolConstraint)}, nor {nameof(ObjectConstraint)}"); }
internal override IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraints leftConstraints, SymbolicValueConstraints rightConstraints, ProgramState programState) { if (boolConstraint == BoolConstraint.False) { return(RightOperand.TrySetConstraints(leftConstraints, programState) .SelectMany(ps => LeftOperand.TrySetConstraints(rightConstraints, ps))); } return(RightOperand.TrySetOppositeConstraints(leftConstraints, programState) .SelectMany(ps => LeftOperand.TrySetOppositeConstraints(rightConstraints, ps))); }
private IEnumerable <ProgramState> TrySetBoolConstraint(BoolConstraint constraint, SymbolicValueConstraints oldConstraints, ProgramState programState) { if (oldConstraints.HasConstraint(ObjectConstraint.Null)) { // It was null, and now it should be true or false return(Enumerable.Empty <ProgramState>()); } var oldBoolConstraint = oldConstraints.GetConstraintOrDefault <BoolConstraint>(); if (oldBoolConstraint != null && oldBoolConstraint != constraint) { return(Enumerable.Empty <ProgramState>()); } // Either same bool constraint, or previously not null, and now a bool constraint return(new[] { programState.SetConstraint(this, constraint) }); }
private IEnumerable <ProgramState> TrySetConstraints(SymbolicValueConstraints constraints, ProgramState programState, bool isOppositeConstraints) { IEnumerable <ProgramState> programStates = new [] { programState }; if (constraints == null) { return(programStates); } foreach (var constraint in constraints.GetConstraints()) { programStates = programStates.SelectMany(ps => isOppositeConstraints ? TrySetOppositeConstraint(constraint, ps) : TrySetConstraint(constraint, ps)); } return(programStates); }
internal abstract IEnumerable <ProgramState> SetConstraint(BoolConstraint boolConstraint, SymbolicValueConstraints leftConstraints, SymbolicValueConstraints rightConstraints, ProgramState programState);
public IEnumerable <ProgramState> TrySetOppositeConstraints(SymbolicValueConstraints constraints, ProgramState programState) { return(TrySetConstraints(constraints, programState, true)); }
public bool TryGetConstraints(ProgramState programState, out SymbolicValueConstraints constraints) { return(programState.Constraints.TryGetValue(this, out constraints)); }