aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-06-30 09:41:21 +0200
committerSven Gothel <[email protected]>2023-06-30 09:41:21 +0200
commitb35d62425311ec50e6c80b07372bc411aa287bb4 (patch)
treed5904a514bbb38d977f73d86c848c7e112b89099
parentad79dae90b94d0875416278e9dcedfc08a1de578 (diff)
GlueGen FunctionType/MethodBinding: get*ParameterList(): Use a more flexible way via a ParameterConsumer visitor, also usable for other iterative parameter generator
-rw-r--r--src/java/com/jogamp/gluegen/CMethodBindingEmitter.java4
-rw-r--r--src/java/com/jogamp/gluegen/CodeGenUtils.java11
-rw-r--r--src/java/com/jogamp/gluegen/JavaType.java4
-rw-r--r--src/java/com/jogamp/gluegen/MethodBinding.java172
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java3
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/FunctionType.java94
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/PointerType.java4
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/Type.java2
8 files changed, 210 insertions, 84 deletions
diff --git a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
index d802ee7..3975315 100644
--- a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
+++ b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
@@ -341,7 +341,7 @@ public class CMethodBindingEmitter extends FunctionEmitter {
// javaCallback.cbFuncCEmitter.emitSignature();
unit.emit("static "+cReturnType.getCName()+" func"+jcbNativeBasename+"(");
// javaCallback.cbFuncCEmitter.emitArguments();
- unit.emit(javaCallback.cbFuncBinding.getCParameterList(new StringBuilder(), null).toString());
+ unit.emit(javaCallback.cbFuncBinding.getCParameterList(new StringBuilder(), false, null).toString());
unit.emitln(") {");
// javaCallback.cbFuncCEmitter.emitBody();
{
@@ -360,7 +360,7 @@ public class CMethodBindingEmitter extends FunctionEmitter {
// javaCallback.cbFuncCEmitter.emitBodyCallCFunction();
unit.emitln(" T_"+jcbNativeBasename+"* cb = (T_"+jcbNativeBasename+"*) "+userParamArgName+";");
- unit.emitln(" // C Params: "+javaCallback.cbFuncBinding.getCParameterList(new StringBuilder(), null).toString());
+ unit.emitln(" // C Params: "+javaCallback.cbFuncBinding.getCParameterList(new StringBuilder(), false, null).toString());
unit.emitln(" // J Params: "+javaCallback.cbFuncBinding.getJavaParameterList(new StringBuilder()).toString());
// unit.emitln(" fprintf(stderr, \"YYY Callback01 user %p, id %ld, msg %s\\n\", cb, id, msg);");
diff --git a/src/java/com/jogamp/gluegen/CodeGenUtils.java b/src/java/com/jogamp/gluegen/CodeGenUtils.java
index aa7a4e2..69a9001 100644
--- a/src/java/com/jogamp/gluegen/CodeGenUtils.java
+++ b/src/java/com/jogamp/gluegen/CodeGenUtils.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,16 +58,6 @@ public class CodeGenUtils {
return Character.toLowerCase(string.charAt(0)) + string.substring(1);
}
- /** Appends `param` to `buf` while prepending a comman separator if `needsComma[0]` is true. Sets `needsComma[0]=true` afterwards. */
- public static StringBuilder addParameterToList(final StringBuilder buf, final String param, final boolean[] needsComma) {
- if( needsComma[0] ) {
- buf.append(", ");
- }
- buf.append(param);
- needsComma[0] = true;
- return buf;
- }
-
/**
* Given a java package name (e.g., "java.lang"), return the package as a
* directory path (i.e., "java/lang").
diff --git a/src/java/com/jogamp/gluegen/JavaType.java b/src/java/com/jogamp/gluegen/JavaType.java
index 3bd4943..682a95a 100644
--- a/src/java/com/jogamp/gluegen/JavaType.java
+++ b/src/java/com/jogamp/gluegen/JavaType.java
@@ -1,6 +1,6 @@
-/*
+/**
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2010 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
diff --git a/src/java/com/jogamp/gluegen/MethodBinding.java b/src/java/com/jogamp/gluegen/MethodBinding.java
index 44ed2e3..6059003 100644
--- a/src/java/com/jogamp/gluegen/MethodBinding.java
+++ b/src/java/com/jogamp/gluegen/MethodBinding.java
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
*
@@ -158,37 +158,50 @@ public class MethodBinding {
/**
* Returns the function parameter list, i.e. a comma separated list of argument type and name.
* @param buf StringBuilder instance
+ * @param useTypedef if true and type is typedef'ed, use its name
* @param callingConvention optional calling-convention
* @return given StringBuilder instance
*/
- public StringBuilder getCParameterList(final StringBuilder buf, final String callingConvention) {
- final int n = getNumArguments();
- final boolean[] needsComma = { false };
- for (int i = 0; i < n; i++) {
- final Type t = getCArgumentType(i);
- if( t.isVoid() ) {
- // nop
- } else if( t.isTypedef() ) {
- CodeGenUtils.addParameterToList(buf, t.getName(), needsComma);
- final String argumentName = getArgumentName(i);
- if (argumentName != null) {
- buf.append(" ");
- buf.append(argumentName);
+ public StringBuilder getCParameterList(final StringBuilder buf, final boolean useTypedef, final String callingConvention) {
+ return getCParameterList(buf, useTypedef, callingConvention, null);
+ }
+ /**
+ * Returns the function parameter list, i.e. a comma separated list of argument type and name.
+ * @param buf StringBuilder instance
+ * @param useTypedef if true and type is typedef'ed, use its name
+ * @param callingConvention optional calling-convention
+ * @param exclude optional list of excluded parameter indices
+ * @return given StringBuilder instance
+ */
+ public StringBuilder getCParameterList(final StringBuilder buf, final boolean useTypedef, final String callingConvention, final List<Integer> exclude) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
+ if( !cType.isVoid() && ( null == exclude || !exclude.contains(idx) ) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
}
- } else if ( t.isFunctionPointer() ) {
- final FunctionType ft = t.getTargetFunction();
- CodeGenUtils.addParameterToList(buf, ft.toString(getArgumentName(i), callingConvention, false, true), needsComma);
- } else if (t.isArray()) {
- CodeGenUtils.addParameterToList(buf, t.asArray().toString(getArgumentName(i)), needsComma);
- } else {
- CodeGenUtils.addParameterToList(buf, t.getCName(true), needsComma);
- final String argumentName = getArgumentName(i);
- if (argumentName != null) {
- buf.append(" ");
- buf.append(argumentName);
+ if( useTypedef && cType.isTypedef() ) {
+ buf.append( cType.getName() );
+ if (name != null) {
+ buf.append(" ");
+ buf.append(name);
+ }
+ } else if ( cType.isFunctionPointer() ) {
+ final FunctionType ft = cType.getTargetFunction();
+ buf.append( ft.toString(name, callingConvention, false, true) );
+ } else if (cType.isArray()) {
+ buf.append( cType.asArray().toString(name) );
+ } else {
+ buf.append( cType.getCName(true) );
+ if (name != null) {
+ buf.append(" ");
+ buf.append(name);
+ }
}
+ return true;
+ } else {
+ return false;
}
- }
+ } );
return buf;
}
@@ -198,23 +211,108 @@ public class MethodBinding {
* @return given StringBuilder instance
*/
public StringBuilder getJavaParameterList(final StringBuilder buf) {
- final int n = getNumArguments();
- final boolean[] needsComma = { false };
- for (int i = 0; i < n; i++) {
- final JavaType t = getJavaArgumentType(i);
- if( t.isVoid() ) {
- // nop
+ return getJavaParameterList(buf, null);
+ }
+ /**
+ * Returns the function parameter list, i.e. a comma separated list of argument type and name.
+ * @param buf StringBuilder instance
+ * @param exclude optional list of excluded parameter indices
+ * @return given StringBuilder instance
+ */
+ public StringBuilder getJavaParameterList(final StringBuilder buf, final List<Integer> exclude) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
+ if( !cType.isVoid() && ( null == exclude || !exclude.contains(idx) ) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
+ }
+ buf.append(jType+" "+name);
+ return true;
} else {
- CodeGenUtils.addParameterToList(buf, t.getName(), needsComma);
- final String argumentName = getArgumentName(i);
- if (argumentName != null) {
- buf.append(" ");
- buf.append(argumentName);
+ return false;
+ }
+ } );
+ return buf;
+ }
+ /**
+ * Returns the function parameter list, i.e. a comma separated list of argument type and name.
+ * @param buf StringBuilder instance
+ * @param include list of explicit included parameter indices
+ * @param addTailSeparator add a comma separator in the end if result is not empty
+ * @return given StringBuilder instance
+ */
+ public StringBuilder getJavaSelectParameter(final StringBuilder buf, final List<Integer> include, final boolean addTailSeparator) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
+ if( !cType.isVoid() && include.contains(idx) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
}
+ buf.append(jType+" "+name);
+ return true;
+ } else {
+ return false;
}
+ } );
+ if( addTailSeparator && buf.length() > 0 ) {
+ buf.append(", ");
}
return buf;
}
+ public StringBuilder getJavaCallArgumentList(final StringBuilder buf, final List<Integer> exclude) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
+ if( !cType.isVoid() && ( null == exclude || !exclude.contains(idx) ) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
+ }
+ buf.append(name);
+ return true;
+ } else {
+ return false;
+ }
+ } );
+ return buf;
+ }
+ public StringBuilder getJavaCallSelectArguments(final StringBuilder buf, final List<Integer> include, final boolean addTailSeparator) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
+ if( !cType.isVoid() && include.contains(idx) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
+ }
+ buf.append(name);
+ return true;
+ } else {
+ return false;
+ }
+ } );
+ if( addTailSeparator && buf.length() > 0 ) {
+ buf.append(", ");
+ }
+ return buf;
+ }
+
+ /** {@link #forEachParameter(ParameterConsumer)} Consumer */
+ public static interface ParameterConsumer {
+ /**
+ * Accept the arguments of the traversed collection element
+ * and return true if consumed. Consumed elements will increased passed `consumedCount` state.
+ * @param idx index of current element, ranges [0 .. size-1]
+ * @param consumedCount number of consumed elements, useful for e.g. `boolean needsSeparator = 0 < consumedCount`
+ * @param cType C Type of argument
+ * @param jType Java Type of argument
+ * @param name argument name
+ * @return true to signal consumed and have traversing loop increment `consumedCount`, otherwise false
+ */
+ boolean accept(int idx, int consumedCount, Type cType, JavaType jType, String name);
+ }
+ public int forEachParameter(final ParameterConsumer c) {
+ final int n = getNumArguments();
+ int consumedCount = 0;
+ for (int i = 0; i < n; i++) {
+ if( c.accept(i, consumedCount, getCArgumentType(i), getJavaArgumentType(i), getArgumentName(i)) ) {
+ ++consumedCount;
+ }
+ }
+ return consumedCount;
+ }
public final boolean isReturnCompoundByValue() {
final Type cReturnType = getCReturnType();
diff --git a/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java b/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
index f4cd15f..45f70c5 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
@@ -1,4 +1,5 @@
-/*
+/**
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java b/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
index aab106f..fded079 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
@@ -1,6 +1,6 @@
-/*
+/**
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2010 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -42,7 +42,6 @@ package com.jogamp.gluegen.cgram.types;
import java.util.*;
import com.jogamp.gluegen.ASTLocusTag;
-import com.jogamp.gluegen.CodeGenUtils;
/** Describes a function type, used to model both function
declarations and (via PointerType) function pointers. */
@@ -139,40 +138,77 @@ public class FunctionType extends Type implements Cloneable {
/**
* Returns the function parameter list, i.e. a comma separated list of argument type and name.
* @param buf StringBuilder instance
+ * @param useTypedef if true and type is typedef'ed, use its name
* @param callingConvention optional calling-convention
* @return given StringBuilder instance
*/
- public StringBuilder getParameterList(final StringBuilder buf, final String callingConvention) {
- final int n = getNumArguments();
- final boolean[] needsComma = { false };
- for (int i = 0; i < n; i++) {
- final Type t = getArgumentType(i);
- if( t.isVoid() ) {
- // nop
- } else if( t.isTypedef() ) {
- CodeGenUtils.addParameterToList(buf, t.getName(), needsComma);
- final String argumentName = getArgumentName(i);
- if (argumentName != null) {
- buf.append(" ");
- buf.append(argumentName);
+ public StringBuilder getParameterList(final StringBuilder buf, final boolean useTypedef, final String callingConvention) {
+ return getParameterList(buf, useTypedef, callingConvention, null);
+ }
+ /**
+ * Returns the function parameter list, i.e. a comma separated list of argument type and name.
+ * @param buf StringBuilder instance
+ * @param useTypedef if true and type is typedef'ed, use its name
+ * @param callingConvention optional calling-convention
+ * @param exclude optional list of excluded parameter indices
+ * @return given StringBuilder instance
+ */
+ public StringBuilder getParameterList(final StringBuilder buf, final boolean useTypedef, final String callingConvention, final List<Integer> exclude) {
+ forEachParameter( ( final int idx, final int consumedCount, final Type cType, final String name ) -> {
+ if( !cType.isVoid() && ( null == exclude || !exclude.contains(idx) ) ) {
+ if( 0 < consumedCount ) {
+ buf.append(", ");
}
- } else if ( t.isFunctionPointer() ) {
- final FunctionType ft = t.getTargetFunction();
- CodeGenUtils.addParameterToList(buf, ft.toString(getArgumentName(i), callingConvention, false, true), needsComma);
- } else if (t.isArray()) {
- CodeGenUtils.addParameterToList(buf, t.asArray().toString(getArgumentName(i)), needsComma);
- } else {
- CodeGenUtils.addParameterToList(buf, t.getCName(true), needsComma);
- final String argumentName = getArgumentName(i);
- if (argumentName != null) {
- buf.append(" ");
- buf.append(argumentName);
+ if( useTypedef && cType.isTypedef() ) {
+ buf.append( cType.getName() );
+ if (name != null) {
+ buf.append(" ");
+ buf.append(name);
+ }
+ } else if ( cType.isFunctionPointer() ) {
+ final FunctionType ft = cType.getTargetFunction();
+ buf.append( ft.toString(name, callingConvention, false, true) );
+ } else if (cType.isArray()) {
+ buf.append( cType.asArray().toString(name) );
+ } else {
+ buf.append( cType.getCName(true) );
+ if (name != null) {
+ buf.append(" ");
+ buf.append(name);
+ }
}
+ return true;
+ } else {
+ return false;
}
- }
+ } );
return buf;
}
+ /** {@link #forEachParameter(ParameterConsumer)} Consumer */
+ public static interface ParameterConsumer {
+ /**
+ * Accept the arguments of the traversed collection element
+ * and return true if consumed. Consumed elements will increased passed `consumedCount` state.
+ * @param idx index of current element, ranges [0 .. size-1]
+ * @param consumedCount number of consumed elements, useful for e.g. `boolean needsSeparator = 0 < consumedCount`
+ * @param cType C Type of argument
+ * @param name argument name
+ * @return true to signal consumed and have traversing loop increment `consumedCount`, otherwise false
+ */
+ boolean accept(int idx, int consumedCount, Type cType, String name);
+ }
+ public int forEachParameter(final ParameterConsumer c) {
+ final int n = getNumArguments();
+ int consumedCount = 0;
+ for (int i = 0; i < n; i++) {
+ if( c.accept(i, consumedCount, getArgumentType(i), getArgumentName(i)) ) {
+ ++consumedCount;
+ }
+ }
+ return consumedCount;
+ }
+
/**
* Add an argument's name and type. Use null for unknown argument names.
*/
@@ -229,7 +265,7 @@ public class FunctionType extends Type implements Cloneable {
res.append(")");
}
res.append("(");
- getParameterList(res, callingConvention);
+ getParameterList(res, true, callingConvention);
res.append(")");
return res.toString();
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
index 4d5079d..5cf2d10 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
@@ -1,6 +1,6 @@
-/*
+/**
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2010 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
diff --git a/src/java/com/jogamp/gluegen/cgram/types/Type.java b/src/java/com/jogamp/gluegen/cgram/types/Type.java
index aa7f845..762dfbb 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/Type.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/Type.java
@@ -1,6 +1,6 @@
/*
+ * Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2010 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are