@Override public void visitTypeConstructorExpr(TypeConstructorExpr typeConstructorExpr) { for (Expr e : typeConstructorExpr.getArgs()) { visitChildFromParent(e, typeConstructorExpr); } }
@Override public void visitTypeConstructorExpr(TypeConstructorExpr typeConstructorExpr) { out.append(typeConstructorExpr.getTypename() + "("); boolean first = true; for (Expr e : typeConstructorExpr.getArgs()) { if (!first) { out.append(", "); } first = false; visit(e); } out.append(")"); }
private boolean isZeroFloatVecOrSquareMat(Expr expr) { if (!(expr instanceof TypeConstructorExpr)) { return false; } if (!Arrays.asList(BasicType.VEC2, BasicType.VEC3, BasicType.VEC4, BasicType.MAT2X2, BasicType.MAT3X3, BasicType.MAT4X4).contains(typer.lookupType(expr))) { return false; } return ((TypeConstructorExpr) expr).getArgs() .stream().allMatch(item -> isZeroFloat(item) || isZeroFloatVecOrSquareMat(item)); }
private boolean isOneFloatVec(Expr expr) { if (!(expr instanceof TypeConstructorExpr)) { return false; } if (!Arrays.asList(BasicType.VEC2, BasicType.VEC3, BasicType.VEC4) .contains(typer.lookupType(expr))) { return false; } return ((TypeConstructorExpr) expr).getArgs() .stream().allMatch(item -> isOneFloat(item) || isOneFloatVec(item)); }
private static boolean isFpVectorConstant(Expr expr) { return expr instanceof TypeConstructorExpr && Arrays.asList(BasicType.VEC2.toString(), BasicType.VEC3.toString(), BasicType.VEC4.toString()) .contains(((TypeConstructorExpr) expr).getTypename()) && ((TypeConstructorExpr) expr).getArgs() .stream() .allMatch(FoldConstantReductionOpportunities::isFpConstant); }
private void findFoldFpScalarVectorBinaryOpportunities(IAstNode parent, Expr child, Expr lhs, Expr rhs, BinaryOperator<Float> op) { if (isFpConstant(lhs) && isFpVectorConstant(rhs)) { final TypeConstructorExpr typeConstructorExpr = (TypeConstructorExpr) rhs; addReplaceWithExpr(parent, child, new TypeConstructorExpr(typeConstructorExpr.getTypename(), typeConstructorExpr.getArgs() .stream() .map(item -> (FloatConstantExpr) item) .map(item -> new FloatConstantExpr(op.apply( Float.valueOf(((FloatConstantExpr) lhs).getValue()), Float.valueOf(item.getValue())).toString())) .collect(Collectors.toList()))); } if (isFpConstant(rhs) && isFpVectorConstant(lhs)) { final TypeConstructorExpr typeConstructorExpr = (TypeConstructorExpr) lhs; addReplaceWithExpr(parent, child, new TypeConstructorExpr(typeConstructorExpr.getTypename(), typeConstructorExpr.getArgs() .stream() .map(item -> (FloatConstantExpr) item) .map(item -> new FloatConstantExpr(op.apply( Float.valueOf(item.getValue()), Float.valueOf(((FloatConstantExpr) rhs).getValue())).toString())) .collect(Collectors.toList()))); } }