Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add explicitUpcast #671

Merged
merged 13 commits into from
Apr 21, 2023
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

* Add `Info.upcast` to support class hierarchies with virtual inheritance ([pull #671](https://github.com/bytedeco/javacpp/pull/671))
* Pick up `@Adapter`, `@SharedPtr`, etc annotations on `allocate()` as well ([pull #668](https://github.com/bytedeco/javacpp/pull/668))
* Provide `@Virtual(subclasses=false)` to prevent `Generator` from subclassing subclasses ([pull #660](https://github.com/bytedeco/javacpp/pull/660))
* Fix `Loader.getPlatform()` detection for `linux-armhf` with Temurin JDK ([issue bytedeco/javacv#2001](https://github.com/bytedeco/javacv/issues/2001))
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/org/bytedeco/javacpp/annotation/Virtual.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@
/** Pure (abstract) or not. */
boolean value() default false;
boolean subclasses() default true;
}
String method() default "";
}
2 changes: 2 additions & 0 deletions src/main/java/org/bytedeco/javacpp/tools/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class Context {
inaccessible = c.inaccessible;
beanify = c.beanify;
objectify = c.objectify;
upcast = c.upcast;
virtualize = c.virtualize;
variable = c.variable;
infoMap = c.infoMap;
Expand All @@ -65,6 +66,7 @@ class Context {
boolean inaccessible = false;
boolean beanify = false;
boolean objectify = false;
boolean upcast = false;
boolean virtualize = false;
Declarator variable = null;
InfoMap infoMap = null;
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/bytedeco/javacpp/tools/Generator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3406,8 +3406,10 @@ void callback(Class<?> cls, Method callbackMethod, String callbackName, int allo
}

if (methodInfo != null) {
Virtual virtual = callbackMethod.getAnnotation(Virtual.class);
String methodName = (virtual != null && virtual.method().length() > 0) ? virtual.method() : methodInfo.method.getName();
out.println(" if (" + fieldName + " == NULL) {");
out.println(" " + fieldName + " = JavaCPP_getMethodID(env, " + jclasses.index(cls) + ", \"" + methodInfo.method.getName() + "\", \"(" +
out.println(" " + fieldName + " = JavaCPP_getMethodID(env, " + jclasses.index(cls) + ", \"" + methodName + "\", \"(" +
signature(methodInfo.method.getParameterTypes()) + ")" + signature(methodInfo.method.getReturnType()) + "\");");
out.println(" }");
out.println(" jmethodID mid = " + fieldName + ";");
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/org/bytedeco/javacpp/tools/Info.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public Info(Info i) {
skip = i.skip;
skipDefaults = i.skipDefaults;
purify = i.purify;
upcast = i.upcast;
virtualize = i.virtualize;
base = i.base;
cppText = i.cppText;
Expand Down Expand Up @@ -96,7 +97,7 @@ public Info(Info i) {
* To use as keys in maps, etc, intern() must be called on instances returned from native code. */
boolean enumerate = false;
/** Outputs declarations for this class into their subclasses as well.
* Also adds methods for explicit casting, as done for multiple inheritance by default. */
* Also adds methods for upcasting, as done for multiple inheritance by default. */
boolean flatten = false;
/** Maps friend functions. Only functions having in their argument list an instance of the class they are friend
* of are currently supported. They are mapped as instance methods of the class. */
Expand All @@ -116,6 +117,9 @@ public Info(Info i) {
boolean skipDefaults = false;
/** Forces a class to be treated as if it were abstract. */
boolean purify = false;
/** Whether a static_cast is needed to upcast a pointer to this cppName.
* This is necessary for polymorphic classes that are virtually inherited from. */
boolean upcast = false;
/** Annotates virtual functions with @{@link Virtual} and adds appropriate constructors. */
boolean virtualize = false;
/** Allows to override the base class of {@link #pointerTypes}. Defaults to {@link Pointer}. */
Expand Down Expand Up @@ -156,6 +160,8 @@ public Info(Info i) {
public Info skipDefaults(boolean skipDefaults) { this.skipDefaults = skipDefaults; return this; }
public Info purify() { this.purify = true; return this; }
public Info purify(boolean purify) { this.purify = purify; return this; }
public Info upcast() { this.upcast = true; return this; }
public Info upcast(boolean upcast) { this.upcast = upcast; return this; }
public Info virtualize() { this.virtualize = true; return this; }
public Info virtualize(boolean virtualize) { this.virtualize = virtualize; return this; }
public Info base(String base) { this.base = base; return this; }
Expand Down
Loading