+ elif is_unitary_enum:
+ unitary_enums.add(struct_name)
+ out_c.write("static inline " + struct_name + " " + struct_name + "_from_java(JNIEnv *env, jclass val) {\n")
+ out_c.write("\tswitch ((*env)->CallIntMethod(env, val, ordinal_meth)) {\n")
+ ord_v = 0
+ for idx, struct_line in enumerate(field_lines):
+ if idx == 0:
+ out_java.write("\tpublic enum " + struct_name + " {\n")
+ elif idx == len(field_lines) - 3:
+ assert(struct_line.endswith("_Sentinel,"))
+ elif idx == len(field_lines) - 2:
+ out_java.write("\t}\n")
+ elif idx == len(field_lines) - 1:
+ assert(struct_line == "")
+ else:
+ out_java.write("\t" + struct_line + "\n")
+ out_c.write("\t\tcase %d: return %s;\n" % (ord_v, struct_line.strip().strip(",")))
+ ord_v = ord_v + 1
+ out_c.write("\t}\n")
+ out_c.write("\tassert(false);\n")
+ out_c.write("}\n")
+
+ ord_v = 0
+ out_c.write("static inline jclass " + struct_name + "_to_java(JNIEnv *env, " + struct_name + " val) {\n")
+ out_c.write("\t// TODO: This is pretty inefficient, we really need to cache the field IDs and class\n")
+ out_c.write("\tjclass enum_class = (*env)->FindClass(env, \"Lorg/ldk/impl/bindings$" + struct_name + ";\");\n")
+ out_c.write("\tassert(enum_class != NULL);\n")
+ out_c.write("\tswitch (val) {\n")
+ for idx, struct_line in enumerate(field_lines):
+ if idx > 0 and idx < len(field_lines) - 3:
+ variant = struct_line.strip().strip(",")
+ out_c.write("\t\tcase " + variant + ": {\n")
+ out_c.write("\t\t\tjfieldID field = (*env)->GetStaticFieldID(env, enum_class, \"" + variant + "\", \"Lorg/ldk/impl/bindings$" + struct_name + ";\");\n")
+ out_c.write("\t\t\tassert(field != NULL);\n")
+ out_c.write("\t\t\treturn (*env)->GetStaticObjectField(env, enum_class, field);\n")
+ out_c.write("\t\t}\n")
+ ord_v = ord_v + 1
+ out_c.write("\t\tdefault: assert(false);\n")
+ out_c.write("\t}\n")
+ out_c.write("}\n\n")
+ elif len(trait_fn_lines) > 0: