@Override public TypeConstructorExpr clone() { return new TypeConstructorExpr(type, args.stream().map(x -> x.clone()).collect(Collectors.toList())); }
@Override public MemberLookupExpr clone() { return new MemberLookupExpr(structure.clone(), member); }
@Override public UnaryExpr clone() { return new UnaryExpr(expr.clone(), op); }
@Override public FunctionCallExpr clone() { return new FunctionCallExpr(callee, args.stream().map(x -> x.clone()).collect(Collectors.toList())); }
@Override public ScalarInitializer clone() { return new ScalarInitializer(expr.clone()); }
@Override public ExprCaseLabel clone() { return new ExprCaseLabel(expr.clone()); }
@Override public ExprStmt clone() { return new ExprStmt(expr.clone()); }
@Override public ParenExpr clone() { return new ParenExpr(expr.clone()); }
private Expr identityConstructor(Expr original, Expr withIdentityApplied) { return macroConstructor(Constants.GLF_IDENTITY, original.clone(), withIdentityApplied); }
@Override public Expr apply(Expr expr, BasicType type, boolean constContext, int depth, Fuzzer fuzzer) { // clamp(expr, expr, expr) assert BasicType.allNumericTypes().contains(type); return identityConstructor( expr, new FunctionCallExpr("clamp", applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer), applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer), applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer))); }
@Override public Expr apply(Expr expr, BasicType type, boolean constContext, int depth, Fuzzer fuzzer) { // min(expr, expr) assert BasicType.allNumericTypes().contains(type); return identityConstructor( expr, new FunctionCallExpr("min", applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer), applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer))); }
@Override public Expr apply(Expr expr, BasicType type, boolean constContext, int depth, Fuzzer fuzzer) { // max(expr, expr) assert BasicType.allNumericTypes().contains(type); return identityConstructor( expr, new FunctionCallExpr("max", applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer), applyIdentityFunction(expr.clone(), type, constContext, depth, fuzzer))); }
@Override public ReturnStmt clone() { if (expr == null) { return new ReturnStmt(); } return new ReturnStmt(expr.clone()); }
@Override public IfStmt clone() { return new IfStmt(condition.clone(), thenStmt.clone(), elseStmt == null ? null : elseStmt.clone()); }
private void addOpportunities() { for (Pair<VariableDeclInfo, VariableIdentifierExpr> pair : inlineableUsages) { if (!blackList.contains(pair.getLeft())) { addOpportunity(new SimplifyExprReductionOpportunity( parentMap.getParent(pair.getRight()), new ParenExpr(((ScalarInitializer) pair.getLeft().getInitializer()).getExpr().clone()), pair.getRight(), getVistitationDepth())); } } }
@Override public WhileStmt clone() { return new WhileStmt(getCondition().clone(), getBody().clone()); }
@Override public DoStmt clone() { return new DoStmt(getBody().clone(), getCondition().clone()); }