From 17c3ea01df2cbd28d70841c2cd0b8f4089e18471 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 11 Aug 2025 14:43:18 +0200 Subject: [PATCH 01/42] wip --- src/source/CGenerator.scala | 166 +++++++++++++++++++++++++++++++++ src/source/CMarshal.scala | 40 ++++++++ src/source/CTypeResolver.scala | 59 ++++++++++++ src/source/JavaMarshal.scala | 2 +- src/source/Main.scala | 12 +++ src/source/YamlGenerator.scala | 8 +- src/source/ast.scala | 4 +- src/source/generator.scala | 30 ++++-- src/source/meta.scala | 8 +- src/source/parser.scala | 13 ++- test-suite/djinni/enum.djinni | 2 + test-suite/run_djinni.sh | 7 +- 12 files changed, 334 insertions(+), 17 deletions(-) create mode 100644 src/source/CGenerator.scala create mode 100644 src/source/CMarshal.scala create mode 100644 src/source/CTypeResolver.scala diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala new file mode 100644 index 00000000..207b71c9 --- /dev/null +++ b/src/source/CGenerator.scala @@ -0,0 +1,166 @@ +package djinni + +import generatorTools.{Spec, q} + +import djinni.ast.{Doc, Ident, Interface, ProtobufMessage, TypeParam, TypeRef} +import djinni.writer.IndentWriter + +class CGenerator(spec: Spec) extends Generator(spec) { + + private val cppMarshal = new CppMarshal(spec) + + private def resolveSymbolName(name: String): String = { + return spec.cNamespace + name + } + + private def resolveSymbolTypeName(ident: Ident): String = { + return resolveSymbolName(ident.name) + "_ptr" + } + + private def getPtrSymbolName(name: String): String = { + return resolveSymbolName(name) + "_ptr" + } + + private def writeExternCBegin(w: IndentWriter): Unit = { + w.wl("#ifdef __cplusplus") + w.wl("extern \"C\" {") + w.wl("#endif // __cplusplus") + } + + private def writeExternCEnd(w: IndentWriter): Unit = { + w.wl("#ifdef __cplusplus") + w.wl("} // extern \"C\"") + w.wl("#endif // __cplusplus") + } + + private def writeCFile(origin: String, ident: Ident, ext: String, f: IndentWriter => Unit): Unit = { + createFile(spec.cOutFolder.get, ident.name + "." + ext, (w: IndentWriter) => { + w.wl("// AUTOGENERATED FILE - DO NOT MODIFY!") + w.wl("// This file was generated by Djinni from " + origin) + w.wl + f(w) + w.wl + }) + } + + private def writeCFilePair(origin: String, ident: Ident, doc: Doc)(header: IndentWriter => Unit, impl: IndentWriter => Unit): Unit = { + writeCFile(origin, ident, "h", (w: IndentWriter) => { + w.wl("#pragma once") + w.wl + + w.wl("#include " + q(spec.cBaseLibIncludePrefix + "djinni_c.h")) + + writeDoc(w, doc) + + writeExternCBegin(w) + w.wl + + header(w) + + writeExternCEnd(w) + }) + + writeCFile(origin, ident, "cpp", (w: IndentWriter) => { + w.wl(s"""#include "${ident.name}.h"""") + w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_helpers.hpp")) + + w.wl + impl(w) + }) + } + + override def generateEnum(origin: String, ident: Ident, doc: Doc, e: ast.Enum): Unit = { + writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + val symbolName = resolveSymbolName(ident.name) + val enumCasePrefix = symbolName + "_" + w.w("enum " + symbolName) + w.bracedSemi { + writeEnumOptionNone(w, e, idCpp.enum, "=", enumCasePrefix) + writeEnumOptions(w, e, idCpp.enum, "=", enumCasePrefix) + writeEnumOptionAll(w, e, idCpp.enum, "=", enumCasePrefix) + } + + }, (w: IndentWriter) => { + }) + } + + private def writeCommaDelimited[T](w: IndentWriter, seq: Seq[T], nested: (T) => Unit): Unit = { + val lastIndex = seq.size - 1 + for ((v, i) <- seq.zipWithIndex) { + nested(v) + if (i != lastIndex) { + w.w(", ") + } + } + } + + private def writeParamList(w: IndentWriter, params: Seq[(Ident, CTypeTranslator)]): Unit = { + writeCommaDelimited(w, params, (t: (Ident, CTypeTranslator)) => { + w.w(t._2.typename) + w.w(" " + t._1.name) + }) + } + + override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: ast.Record): Unit = { + val selfCpp = cppMarshal.fqTypename(ident, r) + + val typeResolver = new CTypeResolver(spec) + val prefix = resolveSymbolName(ident.name) + val typeName = resolveSymbolTypeName(ident) + + val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty))) + + writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + w.wl(s"""typedef void * ${typeName};""") + w.wl + + w.w(s"""${typeName} ${prefix}_create(""") + writeParamList(w, associatedFields.map(f => (f._1.ident, f._2))) + w.wl(");") + + w.wl(s"""void ${prefix}_destroy(${typeName} instance);""") + w.wl + + for ((f, t) <- associatedFields) { + w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance);""") + w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value);""") + w.wl + } + }, (w: IndentWriter) => { + w.w(s"""${typeName} ${prefix}_create(""") + writeParamList(w, associatedFields.map(f => (f._1.ident, f._2))) + w.wl(") ") + + w.braced { + w.w(s"""return ::djinni::c_api::makeRecordInstance<${selfCpp}>(""") + + val lastIndex = params.size - 1 + for (((f, t), i) <- associatedFields.zipWithIndex) { + w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance);""") + w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value);""") + w.wl + } + + w.wl(");") + } + + w.wl + w.wl(s"""void ${prefix}_destroy(${typeName} instance) """) + w.braced { + w.wl(s"::djinni::c_api::releaseRecordInstance<${selfCpp}>(instance);") + } + + + + }) + } + + override def generateInterface(origin: String, ident: Ident, doc: Doc, typeParams: Seq[TypeParam], i: Interface): Unit = { + writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + w.wl("// This is a test interface") + + }, (w: IndentWriter) => { + w.wl("// Impl goes here") + }) + } +} diff --git a/src/source/CMarshal.scala b/src/source/CMarshal.scala new file mode 100644 index 00000000..9ffe2abc --- /dev/null +++ b/src/source/CMarshal.scala @@ -0,0 +1,40 @@ +package djinni + +import generatorTools.Spec + +import djinni.ast.TypeRef + +class CMarshal(spec: Spec) extends Marshal(spec) { + + override def typename(tm: meta.MExpr): String = { + return fqTypename(tm) + } + + override def fqTypename(tm: meta.MExpr): String = { + throw new RuntimeException("Not implemented") + } + + override def paramType(tm: meta.MExpr): String = { + return fqParamType(tm) + } + + override def fqParamType(tm: meta.MExpr): String = { + throw new RuntimeException("Not implemented") + } + + override def returnType(ret: Option[TypeRef]): String = { + return fqReturnType(ret) + } + + override def fqReturnType(ret: Option[TypeRef]): String = { + throw new RuntimeException("Not implemented") + } + + override def fieldType(tm: meta.MExpr): String = { + throw new RuntimeException("Unapplicable") + } + + override def fqFieldType(tm: meta.MExpr): String = { + throw new RuntimeException("Unapplicable") + } +} diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala new file mode 100644 index 00000000..532bf890 --- /dev/null +++ b/src/source/CTypeResolver.scala @@ -0,0 +1,59 @@ +package djinni + +import generatorTools.Spec + +import djinni.ast.TypeRef + +class CTypeTranslator(val typename: String, val toCppExpr: String, val fromCppExpr: String) + +class CTypeResolver(val spec: Spec) { + + val cppMarshal = new CppMarshal(spec) + + private val publicImports = Set.empty[String] + private var importStatements = List.empty[String] + + + def valueTypeName(str: String): String = { + spec.cNamespace + str + } + + def ptrTypeName(str: String): String = { + spec.cNamespace + str + "_ptr" + } + + def resolve(typeRef: TypeRef): CTypeTranslator = { + typeRef.resolved.base match { + case meta.MParam(name) => { + throw new AssertionError("Unsupported MParam type") + } + case meta.MDef(name, numParams, defType, body) => { + body match { + case ast.Enum(options, flags) => new CTypeTranslator(valueTypeName(name), "", "") + case ast.Record(ext, fields, consts, derivingTypes) => new CTypeTranslator(ptrTypeName(name), "", "") + case ast.Interface(ext, methods, consts) => new CTypeTranslator(ptrTypeName(name), "", "") + case ast.ProtobufMessage(cpp, java, objc, ts, swift) => throw new AssertionError("Unsupported") + } + } + case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => { + new CTypeTranslator(c.typename, "", "") + } + case meta.MProtobuf(name, numParams, body) => return new CTypeTranslator("djinni_binary_ref", "", "") + case opaque: meta.MOpaque => { + opaque match { + case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => new CTypeTranslator(cName, "", "") + case meta.MString => new CTypeTranslator("djinni_string", "djinni_string_to_cpp", "djinni_string_from_cpp") + case meta.MDate => new CTypeTranslator("djinni_date", "djinni_date_to_cpp", "djinni_date_from_cpp") + case meta.MBinary => new CTypeTranslator("djinni_binary_ref", "djinni_binary_to_cpp", "djinni_binary_from_cpp") + case meta.MOptional => new CTypeTranslator("djinni_optional", "", "") + case meta.MList => new CTypeTranslator("djinni_list", "", "") + case meta.MSet => new CTypeTranslator("djinni_set", "", "") + case meta.MMap => new CTypeTranslator("djinni_map", "", "") + case meta.MArray => new CTypeTranslator("djinni_array", "", "") + case meta.MVoid => new CTypeTranslator("void", "", "") + } + } + } + } + +} diff --git a/src/source/JavaMarshal.scala b/src/source/JavaMarshal.scala index 49a7bc2d..0748a900 100644 --- a/src/source/JavaMarshal.scala +++ b/src/source/JavaMarshal.scala @@ -89,7 +89,7 @@ class JavaMarshal(spec: Spec) extends Marshal(spec) { def isEnumFlags(m: Meta): Boolean = m match { case MDef(_, _, _, Enum(_, true)) => true - case MExtern(_, _, _, Enum(_, true), _, _, _, _, _,_,_,_,_,_) => true + case MExtern(_, _, _, Enum(_, true), _, _, _, _, _,_,_,_,_,_, _) => true case _ => false } def isEnumFlags(tm: MExpr): Boolean = tm.base match { diff --git a/src/source/Main.scala b/src/source/Main.scala index b7356bbb..d96a5fc6 100644 --- a/src/source/Main.scala +++ b/src/source/Main.scala @@ -111,6 +111,9 @@ object Main { var composerIncludePrefix: String = "" var composerIncludeCppPrefix: String = "" var composerBaseLibIncludePrefix: String = "" + var cOutFolder: Option[File] = None + var cNamespace: String = "" + var cBaseLibIncludePrefix: String = "" var swiftOutFolder: Option[File] = None var swiftModule: String = "Module" var swiftIdentStyle = IdentStyle.swiftDefault @@ -301,6 +304,12 @@ object Main { opt[File]("composer-ts-out").valueName("").foreach(x => composerTsOutFolder = Some(x)) .text("The output for the Composer TypeScript interface files (Generator disabled if unspecified).") note("") + opt[File]("c-out").valueName("").foreach(x => cOutFolder = Some(x)) + .text("The output for the C files (Generated disabled if unspecified).") + opt[String]("c-namespace").valueName(" cNamespace = x) + .text("The C namespace, used as function prefixes for generated functions") + opt[String]("c-base-lib-include-prefix").valueName("...").foreach(x => cBaseLibIncludePrefix = x) + .text("The C base library's include path, relative to the C files.") opt[File]("swift-out").valueName("").foreach(x => swiftOutFolder = Some(x)) .text("The output folder for Swift files (Generator disabled if unspecified).") opt[String]("swift-module").valueName("").foreach(swiftModule = _) @@ -520,6 +529,9 @@ object Main { composerClassIdentStyle, composerFileIdentStyle, composerTsOutFolder, + cOutFolder, + cNamespace, + cBaseLibIncludePrefix, swiftOutFolder, swiftIdentStyle, swiftModule, diff --git a/src/source/YamlGenerator.scala b/src/source/YamlGenerator.scala index 1633a902..acc9c9e7 100644 --- a/src/source/YamlGenerator.scala +++ b/src/source/YamlGenerator.scala @@ -323,7 +323,13 @@ object YamlGenerator { getOptionalField(td, "swift", "generic", false)), MExtern.Swiftxx( getOptionalField(td, "swiftxx", "translator"), - getOptionalField(td, "swiftxx", "header")) + getOptionalField(td, "swiftxx", "header")), + MExtern.C( + getOptionalField(td, "c", "typename"), + getOptionalField(td, "c", "public_header"), + getOptionalField(td, "c", "private_header"), + getOptionalField(td, "c", "translator") + ) ) private def nested(td: ExternTypeDecl, key: String) = { diff --git a/src/source/ast.scala b/src/source/ast.scala index 771e3b0a..67836be6 100644 --- a/src/source/ast.scala +++ b/src/source/ast.scala @@ -52,9 +52,9 @@ case class ExternTypeDecl(override val ident: Ident, override val params: Seq[Ty case class ProtobufTypeDecl(override val ident: Ident, override val params: Seq[TypeParam], override val body: TypeDef, override val origin: String) extends TypeDecl // `Ext.js` is shared by both wasm and valdi -case class Ext(java: Boolean, cpp: Boolean, objc: Boolean, js: Boolean, swift: Boolean) { +case class Ext(java: Boolean, cpp: Boolean, cc: Boolean, objc: Boolean, js: Boolean, swift: Boolean) { def any(): Boolean = { - java || cpp || objc || js || swift + java || cpp || cc || objc || js || swift } } diff --git a/src/source/generator.scala b/src/source/generator.scala index e959adf2..ce6d3a54 100644 --- a/src/source/generator.scala +++ b/src/source/generator.scala @@ -113,6 +113,9 @@ package object generatorTools { composerClassIdentStyle: IdentConverter, composerFileIdentStyle: IdentConverter, composerTsOutFolder: Option[File], + cOutFolder: Option[File], + cNamespace: String, + cBaseLibIncludePrefix: String, swiftOutFolder: Option[File], swiftIdentStyle: SwiftIdentStyle, swiftModule: String, @@ -333,6 +336,12 @@ package object generatorTools { } new ComposerGenerator(spec).generate(idl) } + if (spec.cOutFolder.isDefined) { + if (!spec.skipGeneration) { + createFolder("C", spec.cOutFolder.get) + } + new CGenerator(spec).generate(idl) + } if (spec.tsOutFolder.isDefined) { if (!spec.skipGeneration) { createFolder("TypeScript", spec.tsOutFolder.get) @@ -480,13 +489,20 @@ abstract class Generator(spec: Spec) def generate(idl: Seq[TypeDecl]) { val decls = idl.collect { case itd: InternTypeDecl => itd } - for (td <- decls) td.body match { - case e: Enum => - assert(td.params.isEmpty) - generateEnum(td.origin, td.ident, td.doc, e) - case r: Record => generateRecord(td.origin, td.ident, td.doc, td.params, r) - case i: Interface => generateInterface(td.origin, td.ident, td.doc, td.params, i) - case p: ProtobufMessage => // never need to generate files for protobuf types + for (td <- decls) { + try { + td.body match { + case e: Enum => + assert(td.params.isEmpty) + generateEnum(td.origin, td.ident, td.doc, e) + case r: Record => generateRecord(td.origin, td.ident, td.doc, td.params, r) + case i: Interface => generateInterface(td.origin, td.ident, td.doc, td.params, i) + case p: ProtobufMessage => // never need to generate files for protobuf types + } + } catch { + case t: Throwable => throw new RuntimeException("Failed to process " + td.ident.name, t) + } + } generateModule(decls.filter(td => td.body.isInstanceOf[Interface])) } diff --git a/src/source/meta.scala b/src/source/meta.scala index 89f09e1a..e1e657f6 100644 --- a/src/source/meta.scala +++ b/src/source/meta.scala @@ -33,7 +33,7 @@ abstract sealed class Meta case class MParam(name: String) extends Meta { val numParams = 0 } case class MDef(name: String, override val numParams: Int, defType: DefType, body: TypeDef) extends Meta -case class MExtern(name: String, override val numParams: Int, defType: DefType, body: TypeDef, cpp: MExtern.Cpp, objc: MExtern.Objc, objcpp: MExtern.Objcpp, java: MExtern.Java, jni: MExtern.Jni, wasm: MExtern.Wasm, composer: MExtern.Composer, ts: MExtern.Ts, swift: MExtern.Swift, swiftxx: MExtern.Swiftxx) extends Meta +case class MExtern(name: String, override val numParams: Int, defType: DefType, body: TypeDef, cpp: MExtern.Cpp, objc: MExtern.Objc, objcpp: MExtern.Objcpp, java: MExtern.Java, jni: MExtern.Jni, wasm: MExtern.Wasm, composer: MExtern.Composer, ts: MExtern.Ts, swift: MExtern.Swift, swiftxx: MExtern.Swiftxx, c: MExtern.C) extends Meta object MExtern { // These hold the information marshals need to interface with existing types correctly // All include paths are complete including quotation marks "a/b/c" or angle brackets . @@ -98,6 +98,12 @@ object MExtern { translator: String, header: String ) + case class C( + typename: String, + publicHeader: String, + privateHeader: String, + translator: String + ) } case class MProtobuf(name: String, override val numParams: Int, body: ProtobufMessage) extends Meta diff --git a/src/source/parser.scala b/src/source/parser.scala index b854794e..db38c8d3 100644 --- a/src/source/parser.scala +++ b/src/source/parser.scala @@ -86,12 +86,13 @@ private object IdlParser extends RegexParsers { } def ext(default: Ext) = (rep1("+" ~> ident) >> checkExts) | success(default) - def extRecord = ext(Ext(false, false, false, false, false)) - def extInterface = ext(Ext(true, true, true, true, true)) - def supportLang = ext(Ext(true, true, true, true, true)) + def extRecord = ext(Ext(false, false, false, false, false, false)) + def extInterface = ext(Ext(true, true, true, true, true, true)) + def supportLang = ext(Ext(true, true, true, true, true, true)) def checkExts(parts: List[Ident]): Parser[Ext] = { var foundCpp = false + var foundC = false var foundJava = false var foundObjc = false var foundJavascript = false @@ -109,6 +110,10 @@ private object IdlParser extends RegexParsers { if (foundCpp) return err("Found multiple \"c\" modifiers.") foundCpp = true } + case "cc"=> { + if (foundC) return err("Found multiple \"cc\" modifiers.") + foundC = true + } case "j" => { if (foundJava) return err("Found multiple \"j\" modifiers.") foundJava = true @@ -132,7 +137,7 @@ private object IdlParser extends RegexParsers { } case _ => return err("Invalid modifier \"" + part.name + "\"") } - success(Ext(foundJava, foundCpp, foundObjc, foundJavascript, foundSwift)) + success(Ext(foundJava, foundCpp, foundC, foundObjc, foundJavascript, foundSwift)) } def typeDef: Parser[TypeDef] = record | enum | flags | interface diff --git a/test-suite/djinni/enum.djinni b/test-suite/djinni/enum.djinni index 01bd26ae..bed9d6b2 100644 --- a/test-suite/djinni/enum.djinni +++ b/test-suite/djinni/enum.djinni @@ -1,3 +1,5 @@ +# This is a test +# my dude! color = enum { red; orange; diff --git a/test-suite/run_djinni.sh b/test-suite/run_djinni.sh index b189fbd4..49d2929d 100755 --- a/test-suite/run_djinni.sh +++ b/test-suite/run_djinni.sh @@ -32,6 +32,7 @@ optional_in_relative="djinni/optionals.djinni" temp_out_relative="djinni-output-temp" cpp_out="$base_dir/generated-src/cpp" +c_out="$base_dir/generated-src/c" jni_out="$base_dir/generated-src/jni" objc_out="$base_dir/generated-src/objc" java_out="$base_dir/generated-src/java/com/dropbox/djinni/test" @@ -54,7 +55,7 @@ elif [ $# -eq 1 ]; then echo "Unexpected arguemnt: \"$command\"." 1>&2 exit 1 fi - for dir in "$temp_out" "$cpp_out" "$jni_out" "$java_out"; do + for dir in "$temp_out" "$cpp_out" "$c_out" "$jni_out" "$java_out"; do if [ -e "$dir" ]; then echo "Deleting \"$dir\"..." rm -r "$dir" @@ -149,6 +150,9 @@ fi --ident-swiftxx-class NativeFooBar \ --ident-swiftxx-file NativeFooBar \ \ + --c-out "$temp_out_relative/c" \ + --c-namespace "testsuite_" \ + \ --list-in-files "./generated-src/inFileList.txt" \ --list-out-files "./generated-src/outFileList.txt"\ \ @@ -340,6 +344,7 @@ mirror "wasm" "$temp_out/wasm" "$wasm_out" mirror "ts" "$temp_out/ts" "$ts_out" mirror "swift" "$temp_out/swift" "$swift_out" mirror "swiftxx" "$temp_out/swiftxx" "$swiftxx_out" +mirror "c" "$temp_out/c" "$c_out" date > "$gen_stamp" From 617cecd178332313f3dbd6828241e5a5d0824ec5 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 11 Aug 2025 15:20:27 +0200 Subject: [PATCH 02/42] progress --- src/source/CGenerator.scala | 41 +++++++++++------ src/source/CTypeResolver.scala | 84 +++++++++++++++++++++++++--------- 2 files changed, 89 insertions(+), 36 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 207b71c9..9c9e41e0 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -84,18 +84,18 @@ class CGenerator(spec: Spec) extends Generator(spec) { }) } - private def writeCommaDelimited[T](w: IndentWriter, seq: Seq[T], nested: (T) => Unit): Unit = { + private def writeDelimited[T](w: IndentWriter, seq: Seq[T], delimiter: String)(nested: T => Unit): Unit = { val lastIndex = seq.size - 1 for ((v, i) <- seq.zipWithIndex) { nested(v) if (i != lastIndex) { - w.w(", ") + w.w(delimiter) } } } private def writeParamList(w: IndentWriter, params: Seq[(Ident, CTypeTranslator)]): Unit = { - writeCommaDelimited(w, params, (t: (Ident, CTypeTranslator)) => { + writeDelimited(w, params, ", ")(t => { w.w(t._2.typename) w.w(" " + t._1.name) }) @@ -104,14 +104,14 @@ class CGenerator(spec: Spec) extends Generator(spec) { override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: ast.Record): Unit = { val selfCpp = cppMarshal.fqTypename(ident, r) - val typeResolver = new CTypeResolver(spec) + val typeResolver = new CTypeResolver(spec, cppMarshal) val prefix = resolveSymbolName(ident.name) val typeName = resolveSymbolTypeName(ident) - val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty))) + val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty.resolved))) writeCFilePair(origin, ident, doc)((w: IndentWriter) => { - w.wl(s"""typedef void * ${typeName};""") + w.wl(s"""typedef djinni_record_ptr ${typeName};""") w.wl w.w(s"""${typeName} ${prefix}_create(""") @@ -132,14 +132,11 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(") ") w.braced { - w.w(s"""return ::djinni::c_api::makeRecordInstance<${selfCpp}>(""") + w.w(s"""return ::djinni::c_api::Record<${selfCpp}>::make(""") - val lastIndex = params.size - 1 - for (((f, t), i) <- associatedFields.zipWithIndex) { - w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance);""") - w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value);""") - w.wl - } + writeDelimited(w, associatedFields, ", ")(t => { + w.w(t._2.toCppTranslatorFn(t._1.ident.name)) + }) w.wl(");") } @@ -147,10 +144,24 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl w.wl(s"""void ${prefix}_destroy(${typeName} instance) """) w.braced { - w.wl(s"::djinni::c_api::releaseRecordInstance<${selfCpp}>(instance);") + w.wl(s"::djinni::c_api::Record<${selfCpp}>::release(instance);") } - + val toCppExpr = s"::djinni::c_api::Record<${selfCpp}>::toCpp(instance)" + for ((f, t) <- associatedFields) { + w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance)""") + w.braced { + val param = s"${toCppExpr}->${idCpp.field(f.ident)}" + w.wl(s"return ${t.fromCppTranslatorFn(param)};") + } + w.wl + w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value)""") + w.braced { + val toCppValue = t.toCppTranslatorFn("value") + w.wl(s"${toCppExpr}->${idCpp.field(f.ident)} = ${toCppValue};") + } + w.wl + } }) } diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 532bf890..212ea466 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -2,13 +2,16 @@ package djinni import generatorTools.Spec -import djinni.ast.TypeRef +import djinni.ast.{TypeDef, TypeRef} +import djinni.meta.{MExpr, MPrimitive} -class CTypeTranslator(val typename: String, val toCppExpr: String, val fromCppExpr: String) +class CTypeTranslator(val typename: String, + val toCppTranslatorFn: (String) => String, + val fromCppTranslatorFn: (String) => String) { -class CTypeResolver(val spec: Spec) { +} - val cppMarshal = new CppMarshal(spec) +class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { private val publicImports = Set.empty[String] private var importStatements = List.empty[String] @@ -22,35 +25,74 @@ class CTypeResolver(val spec: Spec) { spec.cNamespace + str + "_ptr" } - def resolve(typeRef: TypeRef): CTypeTranslator = { - typeRef.resolved.base match { + private def makeTranslator(typename: String, translator: String): CTypeTranslator = { + new CTypeTranslator(typename, + (p) => s"${translator}::toCpp(${p})", + (p) => s"${translator}::fromCpp(${p})" + ) + } + + private def resolveOptional(expr: MExpr): CTypeTranslator = { + val resolved = resolve(expr) + var nestedTypename = resolved.typename + + expr.base match { + case opaque: meta.MOpaque => + case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => { + nestedTypename = s"djinni_optional_${resolved.typename}" + } + case _ => + case _ => + } + + return new CTypeTranslator(nestedTypename, + (p) => s"djinni::c_api::Optional::toCpp(${resolved.toCppTranslatorFn(p)})", + (p) => s"djinni::c_api::Optional::fromCpp(${resolved.fromCppTranslatorFn(p)})" + ) + } + + def resolve(expr: MExpr): CTypeTranslator = { + expr.base match { case meta.MParam(name) => { throw new AssertionError("Unsupported MParam type") } case meta.MDef(name, numParams, defType, body) => { + val cppTypename = cppMarshal.fqTypename(name, body) body match { - case ast.Enum(options, flags) => new CTypeTranslator(valueTypeName(name), "", "") - case ast.Record(ext, fields, consts, derivingTypes) => new CTypeTranslator(ptrTypeName(name), "", "") - case ast.Interface(ext, methods, consts) => new CTypeTranslator(ptrTypeName(name), "", "") + case ast.Enum(options, flags) => new CTypeTranslator(valueTypeName(name), + (p) => s"static_cast<${cppTypename}>(${p})", + (p) => s"static_cast<${valueTypeName(name)}>(${p})" + ) + case ast.Record(ext, fields, consts, derivingTypes) => makeTranslator( + ptrTypeName(name), + s"::djinni::c_api::Record<${cppTypename}>" + ) + case ast.Interface(ext, methods, consts) => makeTranslator( + ptrTypeName(name), + s"::djinni::c_api::Record<${cppTypename}>" + ) case ast.ProtobufMessage(cpp, java, objc, ts, swift) => throw new AssertionError("Unsupported") } } case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => { - new CTypeTranslator(c.typename, "", "") + makeTranslator(c.typename, c.translator) } - case meta.MProtobuf(name, numParams, body) => return new CTypeTranslator("djinni_binary_ref", "", "") + case meta.MProtobuf(name, numParams, body) => makeTranslator( + "djinni_binary_ref", + s"::djinni::c_api::Protobuf<${body.cpp.ns}>" + ) case opaque: meta.MOpaque => { opaque match { - case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => new CTypeTranslator(cName, "", "") - case meta.MString => new CTypeTranslator("djinni_string", "djinni_string_to_cpp", "djinni_string_from_cpp") - case meta.MDate => new CTypeTranslator("djinni_date", "djinni_date_to_cpp", "djinni_date_from_cpp") - case meta.MBinary => new CTypeTranslator("djinni_binary_ref", "djinni_binary_to_cpp", "djinni_binary_from_cpp") - case meta.MOptional => new CTypeTranslator("djinni_optional", "", "") - case meta.MList => new CTypeTranslator("djinni_list", "", "") - case meta.MSet => new CTypeTranslator("djinni_set", "", "") - case meta.MMap => new CTypeTranslator("djinni_map", "", "") - case meta.MArray => new CTypeTranslator("djinni_array", "", "") - case meta.MVoid => new CTypeTranslator("void", "", "") + case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => new CTypeTranslator(cName, p => p, p => p) + case meta.MString => makeTranslator("djinni_string", "::djinni::c_api::String") + case meta.MDate => makeTranslator("djinni_date", "::djinni::c_api::Date") + case meta.MBinary => makeTranslator("djinni_binary_ref", "::djinni::c_api::Binary") + case meta.MOptional => resolveOptional(expr.args.head) + case meta.MList => makeTranslator("djinni_list", "::djinni::c_api::List") + case meta.MSet => makeTranslator("djinni_set", "::djinni::c_api::Set") + case meta.MMap => makeTranslator("djinni_map", "::djinni::c_api::Map") + case meta.MArray => makeTranslator("djinni_array", "::djinni::c_api::Array") + case meta.MVoid => new CTypeTranslator("void", p => p, p => p) } } } From d1deed8355a1c8f65a4826a9b81f89a3f50e65f9 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Tue, 12 Aug 2025 08:43:09 +0200 Subject: [PATCH 03/42] optional impl --- src/source/CTypeResolver.scala | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 212ea466..5cc1193b 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -3,7 +3,7 @@ package djinni import generatorTools.Spec import djinni.ast.{TypeDef, TypeRef} -import djinni.meta.{MExpr, MPrimitive} +import djinni.meta.{MExpr, MPrimitive, Meta} class CTypeTranslator(val typename: String, val toCppTranslatorFn: (String) => String, @@ -32,20 +32,29 @@ class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { ) } - private def resolveOptional(expr: MExpr): CTypeTranslator = { - val resolved = resolve(expr) - var nestedTypename = resolved.typename - + private def getPrimitiveOrNull(expr: MExpr): meta.MPrimitive = { expr.base match { case opaque: meta.MOpaque => - case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => { - nestedTypename = s"djinni_optional_${resolved.typename}" + opaque match { + case MPrimitive(_,_,_,_,_,_,_,_) => return opaque.asInstanceOf[MPrimitive] + case _ => } - case _ => case _ => } + null + } + + private def resolveOptional(expr: MExpr): CTypeTranslator = { + val resolved = resolve(expr) + + val primitive = getPrimitiveOrNull(expr) + val nestedTypename = if (primitive != null) { + s"djinni_optional_${resolved.typename}" + } else { + resolved.typename + } - return new CTypeTranslator(nestedTypename, + new CTypeTranslator(nestedTypename, (p) => s"djinni::c_api::Optional::toCpp(${resolved.toCppTranslatorFn(p)})", (p) => s"djinni::c_api::Optional::fromCpp(${resolved.fromCppTranslatorFn(p)})" ) From 6b5181493a1c94e82216ca60831de05a3d558fce Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Tue, 12 Aug 2025 15:24:35 +0200 Subject: [PATCH 04/42] started c helper lib --- src/source/CGenerator.scala | 15 +++--- src/source/CTypeResolver.scala | 43 ++++++++++++----- support-lib/cpp/djinni_c.h | 18 ++++++++ support-lib/cpp/djinni_c_helpers.hpp | 69 ++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 support-lib/cpp/djinni_c.h create mode 100644 support-lib/cpp/djinni_c_helpers.hpp diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 9c9e41e0..4f2ac8b6 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -25,7 +25,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl("#ifdef __cplusplus") w.wl("extern \"C\" {") w.wl("#endif // __cplusplus") - } + } private def writeExternCEnd(w: IndentWriter): Unit = { w.wl("#ifdef __cplusplus") @@ -43,12 +43,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { }) } - private def writeCFilePair(origin: String, ident: Ident, doc: Doc)(header: IndentWriter => Unit, impl: IndentWriter => Unit): Unit = { + private def writeCFilePair(origin: String, ident: Ident, doc: Doc, publicIncludes: Seq[String], privateIncludes: Seq[String])(header: IndentWriter => Unit, impl: IndentWriter => Unit): Unit = { writeCFile(origin, ident, "h", (w: IndentWriter) => { w.wl("#pragma once") w.wl w.wl("#include " + q(spec.cBaseLibIncludePrefix + "djinni_c.h")) + publicIncludes.foreach(w.wl) writeDoc(w, doc) @@ -63,6 +64,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { writeCFile(origin, ident, "cpp", (w: IndentWriter) => { w.wl(s"""#include "${ident.name}.h"""") w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_helpers.hpp")) + privateIncludes.foreach(w.wl) w.wl impl(w) @@ -70,7 +72,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { } override def generateEnum(origin: String, ident: Ident, doc: Doc, e: ast.Enum): Unit = { - writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + writeCFilePair(origin, ident, doc, List.empty[String], List.empty[String])((w: IndentWriter) => { val symbolName = resolveSymbolName(ident.name) val enumCasePrefix = symbolName + "_" w.w("enum " + symbolName) @@ -104,13 +106,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: ast.Record): Unit = { val selfCpp = cppMarshal.fqTypename(ident, r) - val typeResolver = new CTypeResolver(spec, cppMarshal) + val typeResolver = new CTypeResolver(ident, spec, cppMarshal) val prefix = resolveSymbolName(ident.name) val typeName = resolveSymbolTypeName(ident) val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty.resolved))) - writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + writeCFilePair(origin, ident, doc, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { w.wl(s"""typedef djinni_record_ptr ${typeName};""") w.wl @@ -167,7 +169,8 @@ class CGenerator(spec: Spec) extends Generator(spec) { } override def generateInterface(origin: String, ident: Ident, doc: Doc, typeParams: Seq[TypeParam], i: Interface): Unit = { - writeCFilePair(origin, ident, doc)((w: IndentWriter) => { + val typeResolver = new CTypeResolver(ident, spec, cppMarshal) + writeCFilePair(origin, ident, doc, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { w.wl("// This is a test interface") }, (w: IndentWriter) => { diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 5cc1193b..88ec59f8 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -1,9 +1,12 @@ package djinni -import generatorTools.Spec +import generatorTools.{DeclRef, ImportRef, Spec, q} -import djinni.ast.{TypeDef, TypeRef} +import djinni.ast.{Ident, TypeDef, TypeRef} import djinni.meta.{MExpr, MPrimitive, Meta} +import djinni.writer.IndentWriter + +import scala.collection.mutable class CTypeTranslator(val typename: String, val toCppTranslatorFn: (String) => String, @@ -11,11 +14,17 @@ class CTypeTranslator(val typename: String, } -class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { +class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal) { + + val publicImports = mutable.TreeSet[String]() + val privateImports = mutable.TreeSet[String]() - private val publicImports = Set.empty[String] - private var importStatements = List.empty[String] + initSelfInclude() + private def initSelfInclude(): Unit = { + val myHeader = q(spec.cppIncludePrefix + spec.cppFileIdentStyle(ident.name) + "." + spec.cppHeaderExt) + privateImports.add(s"#include $myHeader") + } def valueTypeName(str: String): String = { spec.cNamespace + str @@ -36,7 +45,7 @@ class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { expr.base match { case opaque: meta.MOpaque => opaque match { - case MPrimitive(_,_,_,_,_,_,_,_) => return opaque.asInstanceOf[MPrimitive] + case MPrimitive(_, _, _, _, _, _, _, _) => return opaque.asInstanceOf[MPrimitive] case _ => } case _ => @@ -60,12 +69,20 @@ class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { ) } + private def updateImports(meta: Meta): Unit = { + for (r <- cppMarshal.hppReferences(meta, ident.name, false)) r match { + case ImportRef(arg) => privateImports.add("#include " + arg) + case _ => + } + } + def resolve(expr: MExpr): CTypeTranslator = { expr.base match { case meta.MParam(name) => { throw new AssertionError("Unsupported MParam type") } case meta.MDef(name, numParams, defType, body) => { + updateImports(expr.base) val cppTypename = cppMarshal.fqTypename(name, body) body match { case ast.Enum(options, flags) => new CTypeTranslator(valueTypeName(name), @@ -78,18 +95,22 @@ class CTypeResolver(val spec: Spec, val cppMarshal: CppMarshal) { ) case ast.Interface(ext, methods, consts) => makeTranslator( ptrTypeName(name), - s"::djinni::c_api::Record<${cppTypename}>" + s"::djinni::c_api::Interface<${cppTypename}>" ) case ast.ProtobufMessage(cpp, java, objc, ts, swift) => throw new AssertionError("Unsupported") } } case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => { + updateImports(expr.base) makeTranslator(c.typename, c.translator) } - case meta.MProtobuf(name, numParams, body) => makeTranslator( - "djinni_binary_ref", - s"::djinni::c_api::Protobuf<${body.cpp.ns}>" - ) + case meta.MProtobuf(name, numParams, body) => { + updateImports(expr.base) + makeTranslator( + "djinni_binary_ref", + s"::djinni::c_api::Protobuf<${body.cpp.ns}>" + ) + } case opaque: meta.MOpaque => { opaque match { case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => new CTypeTranslator(cName, p => p, p => p) diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h new file mode 100644 index 00000000..3b03054c --- /dev/null +++ b/support-lib/cpp/djinni_c.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +typedef void *djinni_record_ptr; + +#define DJINNI_OPTIONAL_PRIMITIVE(__type__) typedef struct { \ + __type__ value; \ + bool has_value; \ +} djinni_optional_ ## __type__ + +DJINNI_OPTIONAL_PRIMITIVE(bool); +DJINNI_OPTIONAL_PRIMITIVE(int8_t); +DJINNI_OPTIONAL_PRIMITIVE(int16_t); +DJINNI_OPTIONAL_PRIMITIVE(int32_t); +DJINNI_OPTIONAL_PRIMITIVE(int64_t); +DJINNI_OPTIONAL_PRIMITIVE(float); +DJINNI_OPTIONAL_PRIMITIVE(double); diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp new file mode 100644 index 00000000..02b7bc33 --- /dev/null +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include "djinni_c.h" +#include +#include + +namespace djinni::c_api { + +template class Record { +public: + template static djinni_record_ptr make(Args &&...args) { + return reinterpret_cast( + new T(std::forward(args)...)); + } + + static T *toCpp(djinni_record_ptr ptr) { return reinterpret_cast(ptr); } + + static djinni_record_ptr fromCpp(T &&value) { return make(std::move(value)); } + + static void release(djinni_record_ptr ptr) { delete toCpp(ptr); } +}; + +class Optional { +public: + static djinni_optional_bool fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_int8_t fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_int16_t fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_int32_t fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_int64_t fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_float fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + + static djinni_optional_double fromCpp(std::optional value) { + return fromCppPrimitive(value); + } + +private: + template + static Opt fromCppPrimitive(std::optional value) { + Opt out = {0}; + + if (value.has_value()) { + out.has_value = true; + out.value = value.value(); + } + + return out; + } +}; + + + +} // namespace djinni::c_api \ No newline at end of file From 10ca10969086461101c35d12175e35aea0ec1a2a Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 13 Aug 2025 18:57:52 +0200 Subject: [PATCH 05/42] more progress --- src/source/CGenerator.scala | 15 +-- src/source/CTypeResolver.scala | 130 +++++++++++++++---- src/source/Main.scala | 4 + src/source/generator.scala | 1 + support-lib/cpp/djinni_c.h | 49 ++++++- support-lib/cpp/djinni_c_helpers.cpp | 6 + support-lib/cpp/djinni_c_helpers.hpp | 187 +++++++++++++++++++++++++-- 7 files changed, 343 insertions(+), 49 deletions(-) create mode 100644 support-lib/cpp/djinni_c_helpers.cpp diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 4f2ac8b6..3316f11f 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -14,11 +14,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { } private def resolveSymbolTypeName(ident: Ident): String = { - return resolveSymbolName(ident.name) + "_ptr" - } - - private def getPtrSymbolName(name: String): String = { - return resolveSymbolName(name) + "_ptr" + resolveSymbolName(ident.name) + "_ref" } private def writeExternCBegin(w: IndentWriter): Unit = { @@ -113,16 +109,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty.resolved))) writeCFilePair(origin, ident, doc, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { - w.wl(s"""typedef djinni_record_ptr ${typeName};""") + w.wl(s"""typedef djinni_record_ref ${typeName};""") w.wl w.w(s"""${typeName} ${prefix}_create(""") writeParamList(w, associatedFields.map(f => (f._1.ident, f._2))) w.wl(");") - w.wl(s"""void ${prefix}_destroy(${typeName} instance);""") - w.wl - for ((f, t) <- associatedFields) { w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance);""") w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value);""") @@ -144,10 +137,6 @@ class CGenerator(spec: Spec) extends Generator(spec) { } w.wl - w.wl(s"""void ${prefix}_destroy(${typeName} instance) """) - w.braced { - w.wl(s"::djinni::c_api::Record<${selfCpp}>::release(instance);") - } val toCppExpr = s"::djinni::c_api::Record<${selfCpp}>::toCpp(instance)" for ((f, t) <- associatedFields) { diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 88ec59f8..3691f149 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -31,7 +31,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } def ptrTypeName(str: String): String = { - spec.cNamespace + str + "_ptr" + spec.cNamespace + str + "_ref" } private def makeTranslator(typename: String, translator: String): CTypeTranslator = { @@ -53,42 +53,119 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal null } - private def resolveOptional(expr: MExpr): CTypeTranslator = { - val resolved = resolve(expr) + private def makeNestedTranslator(inner: CTypeTranslator, typename: String, translator: String): CTypeTranslator = { + new CTypeTranslator(typename, + (p) => { + val innerToCpp = inner.toCppTranslatorFn("value") + s"${translator}::toCpp(${p}, [](auto value) { return ${innerToCpp}; })" + }, + (p) => { + val innerFromCpp = inner.fromCppTranslatorFn("value") + s"$translator::fromCpp(${p}, [](auto value) { return ${innerFromCpp}); })" + } + ) + } + + private def resolveOptional(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { + val resolved = resolve(expr, asBoxed) val primitive = getPrimitiveOrNull(expr) - val nestedTypename = if (primitive != null) { - s"djinni_optional_${resolved.typename}" + + if (primitive != null && !asBoxed) { + new CTypeTranslator(s"djinni_optional_${resolved.typename}", + (p) => s"djinni::c_api::Optional::toCpp(${resolved.toCppTranslatorFn(p)})", + (p) => s"djinni::c_api::Optional::fromCpp(${resolved.fromCppTranslatorFn(p)})" + ) } else { - resolved.typename + makeNestedTranslator(resolved, resolved.typename, "::djinni::c_api::Optional") } + } - new CTypeTranslator(nestedTypename, - (p) => s"djinni::c_api::Optional::toCpp(${resolved.toCppTranslatorFn(p)})", - (p) => s"djinni::c_api::Optional::fromCpp(${resolved.fromCppTranslatorFn(p)})" - ) + private def resolveListLike(expr: MExpr, translator: String): CTypeTranslator = { + val resolved = resolve(expr, true) + + val cppType = cppMarshal.fqTypename(expr) + makeNestedTranslator(resolved, "djinni_array_ref", translator + s"<${cppType}>") } - private def updateImports(meta: Meta): Unit = { + private def resolveMap(keyExpr: MExpr, valueExpr: MExpr): CTypeTranslator = { + val resolvedKey = resolve(keyExpr, true) + val resolvedValue = resolve(valueExpr, true) + val cppTypeKey = cppMarshal.fqTypename(keyExpr) + val cppTypeValue = cppMarshal.fqTypename(valueExpr) + + new CTypeTranslator("djinni_keyval_array_ref", + (p) => { + val innerToCppKey = resolvedKey.toCppTranslatorFn("key") + val innerToCppValue = resolvedValue.toCppTranslatorFn("value") + s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::toCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerToCppKey}, ${innerToCppValue}); })" + }, + (p) => { + val innerFromCppKey = resolvedKey.fromCppTranslatorFn("key") + val innerFromCppValue = resolvedValue.fromCppTranslatorFn("value") + s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto value, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" + }) + + } + + private def resolvePrimitive(cName: String, asBoxed: Boolean): CTypeTranslator = { + if (asBoxed) { + new CTypeTranslator("djinni_number_ref", (p) => { + s"::djinni::c_api::Number::toCpp<${cName}>(${p})" + }, + (p) => { + s"::djinni::c_api::Number::fromCpp<${cName}>(${p})" + }) + } else { + new CTypeTranslator(cName, p => p, p => p) + } + } + + private def updatePrivateImports(meta: Meta): Unit = { for (r <- cppMarshal.hppReferences(meta, ident.name, false)) r match { case ImportRef(arg) => privateImports.add("#include " + arg) case _ => } } + private def addPublicImport(path: String) = { + publicImports.add("#include " + path) + } + + private def addPublicImportFromDef(name: String) = { + addPublicImport(q(spec.cIncludePrefix + name + ".h")) + } + + private def resolveEnum(name: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { + val typename = valueTypeName(name) + if (asBoxed) { + new CTypeTranslator(typename, + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" + ) + } else { + new CTypeTranslator(typename, + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCpp(${p})", + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCpp(${p})" + ) + } + } + def resolve(expr: MExpr): CTypeTranslator = { + resolve(expr, false) + } + + private def resolve(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { expr.base match { case meta.MParam(name) => { throw new AssertionError("Unsupported MParam type") } case meta.MDef(name, numParams, defType, body) => { - updateImports(expr.base) + updatePrivateImports(expr.base) + addPublicImportFromDef(name) val cppTypename = cppMarshal.fqTypename(name, body) body match { - case ast.Enum(options, flags) => new CTypeTranslator(valueTypeName(name), - (p) => s"static_cast<${cppTypename}>(${p})", - (p) => s"static_cast<${valueTypeName(name)}>(${p})" - ) + case ast.Enum(options, flags) => resolveEnum(name, cppTypename, asBoxed) case ast.Record(ext, fields, consts, derivingTypes) => makeTranslator( ptrTypeName(name), s"::djinni::c_api::Record<${cppTypename}>" @@ -101,11 +178,12 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => { - updateImports(expr.base) + updatePrivateImports(expr.base) + addPublicImport(c.publicHeader) makeTranslator(c.typename, c.translator) } case meta.MProtobuf(name, numParams, body) => { - updateImports(expr.base) + updatePrivateImports(expr.base) makeTranslator( "djinni_binary_ref", s"::djinni::c_api::Protobuf<${body.cpp.ns}>" @@ -113,15 +191,15 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } case opaque: meta.MOpaque => { opaque match { - case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => new CTypeTranslator(cName, p => p, p => p) - case meta.MString => makeTranslator("djinni_string", "::djinni::c_api::String") - case meta.MDate => makeTranslator("djinni_date", "::djinni::c_api::Date") + case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => resolvePrimitive(cName, asBoxed) + case meta.MString => makeTranslator("djinni_string_ref", "::djinni::c_api::String") + case meta.MDate => makeTranslator("djinni_date_ref", "::djinni::c_api::Date") case meta.MBinary => makeTranslator("djinni_binary_ref", "::djinni::c_api::Binary") - case meta.MOptional => resolveOptional(expr.args.head) - case meta.MList => makeTranslator("djinni_list", "::djinni::c_api::List") - case meta.MSet => makeTranslator("djinni_set", "::djinni::c_api::Set") - case meta.MMap => makeTranslator("djinni_map", "::djinni::c_api::Map") - case meta.MArray => makeTranslator("djinni_array", "::djinni::c_api::Array") + case meta.MOptional => resolveOptional(expr.args.head, asBoxed) + case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::List") + case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::Set") + case meta.MMap => resolveMap(expr.args.head, expr.args(1)) + case meta.MArray => resolveListLike(expr.args.head, "::djinni::c_api::List") case meta.MVoid => new CTypeTranslator("void", p => p, p => p) } } diff --git a/src/source/Main.scala b/src/source/Main.scala index d96a5fc6..8c813ed2 100644 --- a/src/source/Main.scala +++ b/src/source/Main.scala @@ -114,6 +114,7 @@ object Main { var cOutFolder: Option[File] = None var cNamespace: String = "" var cBaseLibIncludePrefix: String = "" + var cIncludePrefix: String = "" var swiftOutFolder: Option[File] = None var swiftModule: String = "Module" var swiftIdentStyle = IdentStyle.swiftDefault @@ -310,6 +311,8 @@ object Main { .text("The C namespace, used as function prefixes for generated functions") opt[String]("c-base-lib-include-prefix").valueName("...").foreach(x => cBaseLibIncludePrefix = x) .text("The C base library's include path, relative to the C files.") + opt[String]("c-include-prefix").valueName("...").foreach(x => cIncludePrefix = x) + .text("The prefix for #includes of header files from C++ files.") opt[File]("swift-out").valueName("").foreach(x => swiftOutFolder = Some(x)) .text("The output folder for Swift files (Generator disabled if unspecified).") opt[String]("swift-module").valueName("").foreach(swiftModule = _) @@ -532,6 +535,7 @@ object Main { cOutFolder, cNamespace, cBaseLibIncludePrefix, + cIncludePrefix, swiftOutFolder, swiftIdentStyle, swiftModule, diff --git a/src/source/generator.scala b/src/source/generator.scala index ce6d3a54..696a79a8 100644 --- a/src/source/generator.scala +++ b/src/source/generator.scala @@ -116,6 +116,7 @@ package object generatorTools { cOutFolder: Option[File], cNamespace: String, cBaseLibIncludePrefix: String, + cIncludePrefix: String, swiftOutFolder: Option[File], swiftIdentStyle: SwiftIdentStyle, swiftModule: String, diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 3b03054c..28f27262 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -2,7 +2,52 @@ #include -typedef void *djinni_record_ptr; +typedef void *djinni_ref; + +typedef djinni_ref djinni_string_ref; +typedef djinni_ref djinni_binary_ref; +typedef djinni_ref djinni_number_ref; +typedef djinni_ref djinni_array_ref; +typedef djinni_ref djinni_keyval_array_ref; +typedef djinni_ref djinni_date_ref; + +typedef djinni_ref djinni_record_ref; +typedef djinni_ref djinni_interface_ref; + +void djinni_ref_retain(djinni_ref ref); +void djinni_ref_release(djinni_ref ref); + +djinni_string_ref djinni_string_create(const char *str, size_t length); + +const char *djinni_string_get_data(djinni_string_ref str); + +size_t djinni_string_get_length(djinni_string_ref str); + +djinni_binary_ref djinni_binary_create(const uint8_t *data, size_t length); + +djinni_number_ref djinni_number_int64_create(int64_t v); +djinni_number_ref djinni_number_uint64_create(uint64_t v); +djinni_number_ref djinni_number_double_create(double v); + +int64_t djinni_number_get_int64(djinni_number_ref number); +uint64_t djinni_number_get_uint64(djinni_number_ref number); +double djinni_number_get_double(djinni_number_ref number); + +djinni_keyval_array_ref djinni_keyval_array_create(size_t size); + +djinni_keyval_array_ref djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array); +djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, size_t index); +djinni_ref djinni_keyval_array_get_value(djinni_keyval_array_ref keyval_array, size_t index); + +void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, size_t index, djinni_ref key, djinni_ref value); + +djinni_array_ref djinni_array_create(size_t length); +size_t djinni_array_get_length(djinni_array_ref array); +djinni_ref djinni_array_get_value(djinni_array_ref array, size_t index); +void djinni_array_set_value(djinni_array_ref array, size_t index, djinni_ref value); + +djinni_date_ref djinni_date_create(uint64_t epoch_time_ms); +uint64_t djinni_date_get_epoch(djinni_date_ref date); #define DJINNI_OPTIONAL_PRIMITIVE(__type__) typedef struct { \ __type__ value; \ @@ -15,4 +60,4 @@ DJINNI_OPTIONAL_PRIMITIVE(int16_t); DJINNI_OPTIONAL_PRIMITIVE(int32_t); DJINNI_OPTIONAL_PRIMITIVE(int64_t); DJINNI_OPTIONAL_PRIMITIVE(float); -DJINNI_OPTIONAL_PRIMITIVE(double); +DJINNI_OPTIONAL_PRIMITIVE(double); \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp new file mode 100644 index 00000000..8bc7aba4 --- /dev/null +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -0,0 +1,6 @@ +#include "djinni_c_helpers.hpp" + +namespace djinni::c_api { + + +} \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 02b7bc33..c5690879 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -1,23 +1,37 @@ #pragma once #include "djinni_c.h" +#include #include #include +#include +#include +#include +#include namespace djinni::c_api { -template class Record { +class Object { public: - template static djinni_record_ptr make(Args &&...args) { - return reinterpret_cast( - new T(std::forward(args)...)); - } + Object(); + virtual ~Object(); - static T *toCpp(djinni_record_ptr ptr) { return reinterpret_cast(ptr); } +private: + std::atomic_int _ref; +}; - static djinni_record_ptr fromCpp(T &&value) { return make(std::move(value)); } +class String { +public: + static djinni_string_ref fromCpp(std::string &&str); + static djinni_string_ref fromCpp(const std::string &str); + static std::string toCpp(djinni_string_ref str); +}; - static void release(djinni_record_ptr ptr) { delete toCpp(ptr); } +class Date { +public: + static djinni_date_ref + fromCpp(const std::chrono::system_clock::time_point &date); + static std::chrono::system_clock::time_point toCpp(djinni_date_ref date); }; class Optional { @@ -50,6 +64,34 @@ class Optional { return fromCppPrimitive(value); } + template + static djinni_ref fromCpp(const std::optional &value, F &&convert) { + if (!value) { + return nullptr; + } else { + return convert(value.value()); + } + } + + template + static djinni_ref fromCpp(std::optional &&value, F &&convert) { + if (!value) { + return nullptr; + } else { + return convert(std::move(value.value())); + } + } + + template + static auto toCpp(djinni_ref ptr, F &&convert) + -> std::optional> { + if (ptr == nullptr) { + return std::nullopt; + } else { + return std::optional(convert(ptr)); + } + } + private: template static Opt fromCppPrimitive(std::optional value) { @@ -64,6 +106,135 @@ class Optional { } }; +template class Record { +public: + template static djinni_record_ptr make(Args &&...args) { + return reinterpret_cast( + new T(std::forward(args)...)); + } + + static T *toCpp(djinni_record_ptr ptr) { return reinterpret_cast(ptr); } + + static djinni_record_ptr fromCpp(T &&value) { return make(std::move(value)); } + + static void release(djinni_record_ptr ptr) { delete toCpp(ptr); } +}; + +template class Enum { +public: + static Cpp toCpp(C value) { return static_cast(value); } + static C fromCpp(Cpp value) { return static_cast(value); } + + static djinni_number_ref toCppBoxed(C value) { + return Number::toCpp(static_cast(value)); + } + + static C fromCpp(djinni_number_ref value) { + return static_cast(djinni_number_get_int64(value)); + } +}; + +template class List { +public: + template + static std::vector toCpp(djinni_array_ref value, F &&convert) { + std::vector output; + auto length = djinni_array_get_length(value); + output.reserve(length); + + for (size_t i = 0; i < length; i++) { + auto value = djinni_array_get_value(value, i); + output.emplace_back(convert(value)); + djinni_ref_release(value); + } + + return output; + } + + template + static djinni_array_ref fromCpp(const std::vector &values, F &&convert) { + djinni_array_ref output = djinni_array_create(values.size()); + size_t index = 0; + + for (const auto &value : values) { + auto converted = convert(value); + djinni_array_set_value(output, index++, converted); + djinni_ref_release(converted); + } + + return output; + } +}; + +template class Set { +public: + template + static std::unordered_set toCpp(djinni_array_ref value, F &&convert) { + std::unordered_set output; + auto length = djinni_array_get_length(value); + output.reserve(length); + + for (size_t i = 0; i < length; i++) { + auto value = djinni_array_get_value(value, i); + output.emplace(convert(value)); + djinni_ref_release(value); + } + return output; + } + + template + static djinni_array_ref fromCpp(const std::unordered_set &values, + F &&convert) { + djinni_array_ref output = djinni_array_create(values.size()); + size_t index = 0; + + for (const auto &value : values) { + auto converted = convert(value); + djinni_array_set_value(output, index++, converted); + djinni_ref_release(converted); + } + + return output; + } +}; + +template class Map { +public: + template + static std::unordered_map toCpp(djinni_keyval_array_ref key_values, + F &&convert) { + std::unordered_map output; + auto length = djinni_keyval_array_get_length(key_values); + output.reserve(length); + + for (size_t i = 0; i < length; i++) { + auto key = djinni_keyval_array_get_key(key_values, i); + auto value = djinni_keyval_array_get_value(key_values, i); + auto pair = convert(key, value); + output.try_emplace(std::move(pair.first), std::move(pair.second)); + djinni_ref_release(key); + djinni_ref_release(value); + } + + return output; + } + + template + static djinni_keyval_array_ref fromCpp(const std::unordered_map &map, + F &&convert) { + djinni_keyval_array_ref output = djinni_keyval_array_create(map.size()); + size_t index = 0; + for (const auto &it : map) { + auto pair = convert(it.first, it.value); + + djinni_keyval_array_set_entry(output, index++, pair.first, pair.second); + + djinni_ref_release(pair.first); + djinni_ref_release(pair.second); + } + return output; + } +}; } // namespace djinni::c_api \ No newline at end of file From e03ce48dbde8657698deb60cdefe6444262002b4 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 14 Aug 2025 12:03:55 +0200 Subject: [PATCH 06/42] c++ helper library for c support --- src/source/CTypeResolver.scala | 20 ++- support-lib/cpp/djinni_c_helpers.hpp | 19 +-- support-lib/cpp/djinni_c_types.cpp | 192 +++++++++++++++++++++++++++ support-lib/cpp/djinni_c_types.hpp | 98 ++++++++++++++ 4 files changed, 313 insertions(+), 16 deletions(-) create mode 100644 support-lib/cpp/djinni_c_types.cpp create mode 100644 support-lib/cpp/djinni_c_types.hpp diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 3691f149..45c2db26 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -53,6 +53,18 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal null } + private def isEnum(expr: MExpr): Boolean = { + expr.base match { + case meta.MDef(name, numParams, defType, body) => { + body match { + case ast.Enum(options, flags) => true + case _ => false + } + } + case _ => false + } + } + private def makeNestedTranslator(inner: CTypeTranslator, typename: String, translator: String): CTypeTranslator = { new CTypeTranslator(typename, (p) => { @@ -67,8 +79,10 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } private def resolveOptional(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { + if (isEnum(expr)) { + return resolve(expr, true) + } val resolved = resolve(expr, asBoxed) - val primitive = getPrimitiveOrNull(expr) if (primitive != null && !asBoxed) { @@ -103,7 +117,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal (p) => { val innerFromCppKey = resolvedKey.fromCppTranslatorFn("key") val innerFromCppValue = resolvedValue.fromCppTranslatorFn("value") - s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto value, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" + s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" }) } @@ -139,7 +153,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolveEnum(name: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { val typename = valueTypeName(name) if (asBoxed) { - new CTypeTranslator(typename, + new CTypeTranslator("djinni_number_ref", (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" ) diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index c5690879..9fb2dddc 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -11,15 +11,6 @@ namespace djinni::c_api { -class Object { -public: - Object(); - virtual ~Object(); - -private: - std::atomic_int _ref; -}; - class String { public: static djinni_string_ref fromCpp(std::string &&str); @@ -125,12 +116,14 @@ template class Enum { static Cpp toCpp(C value) { return static_cast(value); } static C fromCpp(Cpp value) { return static_cast(value); } - static djinni_number_ref toCppBoxed(C value) { - return Number::toCpp(static_cast(value)); + static std::optional toCppBoxed(djinni_number_ref value) { + return value != nullptr ? static_cast(djinni_number_get_int64(value)) + : std::nullopt; } - static C fromCpp(djinni_number_ref value) { - return static_cast(djinni_number_get_int64(value)); + static djinni_number_ref fromCppBoxed(std::optional value) { + return value ? Number::fromCpp(static_cast(value.value())) + : nullptr; } }; diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp new file mode 100644 index 00000000..cf7785f2 --- /dev/null +++ b/support-lib/cpp/djinni_c_types.cpp @@ -0,0 +1,192 @@ +#include "djinni_c_types.hpp" + +namespace djinni { + +constexpr size_t alignUp(size_t size, size_t alignment) { + return (size + alignment - 1) & ~(alignment - 1); +} + +template struct ArrayAllocator { + template T *allocate(size_t size, Args &&...args) { + std::allocator allocator; + + auto allocSize = + alignUp(sizeof(T), alignof(ValueType)) + (sizeof(ValueType) * size); + + auto *arrayRegion = allocator.allocate(allocSize); + + new (arrayRegion)(T)(std::forward(args)...); + + return reinterpret_cast(arrayRegion); + } + + constexpr inline ValueType *getContainerStartPtr(T *object) { + return reinterpret_cast( + reinterpret_cast(object) + + alignUp(sizeof(T), alignof(ValueType))); + } + + constexpr inline const ValueType *getContainerStartPtr(const T *object) { + return reinterpret_cast( + reinterpret_cast(object) + + alignUp(sizeof(T), alignof(ValueType))); + } +}; + +static Object *swapObject(Object *prevValue, Object *newValue) { + Object::retain(newValue); + Object::release(prevValue); + + return newValue; +} + +Object::Object() : _ref(1) {} + +Object::~Object() = default; + +void Object::onRetain() { _ref++; } + +void Object::onRelease() { + if (--_ref == 0) { + delete this; + } +} + +void Object::retain(Object *obj) { + if (obj != nullptr) { + obj->onRetain(); + } +} + +void Object::release(Object *obj) { + if (obj != nullptr) { + obj->onRelease(); + } +} + +using StringAllocator = ArrayAllocator; + +String::String(size_t length) : _length(length) {} +String::~String() = default; + +const char *String::data() const { + StringAllocator allocator; + return allocator.getContainerStartPtr(this); +} + +size_t String::String::length() const { return _length; } + +String *String::make(const char *str, size_t length) { + StringAllocator allocator; + auto *output = allocator.allocate(length, length); + auto *data = allocator.getContainerStartPtr(output); + for (size_t i = 0; i < length; i++) { + data[i] = str[i]; + } + data[length] = 0; + + return output; +} + +using ObjectArrayAllocator = ArrayAllocator; + +ObjectArray::ObjectArray(size_t length) : _length(length) {} + +ObjectArray::~ObjectArray() { + ObjectArrayAllocator allocator; + auto **data = allocator.getContainerStartPtr(this); + for (size_t i = 0; i < _length; i++) { + Object::release(data[i]); + } +} + +size_t ObjectArray::length() const { return _length; } + +Object *ObjectArray::getObjectAtIndex(size_t index) const { + ObjectArrayAllocator allocator; + Object *const *data = allocator.getContainerStartPtr(this); + auto *object = data[index]; + Object::retain(object); + return object; +} + +void ObjectArray::setObjectAtIndex(Object *object, size_t index) { + ObjectArrayAllocator allocator; + Object **data = allocator.getContainerStartPtr(this); + + Object::retain(object); + Object::release(data[index]); + data[index] = object; +} + +ObjectArray *ObjectArray::make(size_t length) { + ObjectArrayAllocator allocator; + auto *output = allocator.allocate(length, length); + + std::memset(allocator.getContainerStartPtr(output), 0, length); + + return output; +} + +Binary::Binary(uint8_t *data, size_t length, void *opaque, + Binary::Deallocator deallocator) + : _data(data), _length(length), _opaque(opaque), _deallocator(deallocator) { +} + +Binary::~Binary() { + if (_deallocator) { + _deallocator(_data, _length, _opaque); + } +} + +uint8_t *Binary::data() const { return _data; } + +size_t Binary::length() const { return _length; } + +Binary *Binary::make(uint8_t *data, size_t length, void *opaque, + Binary::Deallocator deallocator) { + return new Binary(data, length, opaque, deallocator); +} + +Number::Number(Number::Value value, Number::ValueType type) + : _value(value), _type(type) {} +Number::~Number() = default; + +uint64_t Number::toUnsignedInt() const { + switch (_type) { + case Number::ValueType::UNSIGNED_INT: + return _value.u; + case Number::ValueType::SIGNED_INT: + return static_cast(_value.i); + case Number::ValueType::DOUBLE: + return static_cast(_value.d); + } +} + +int64_t Number::toSignedInt() const { + switch (_type) { + case Number::ValueType::UNSIGNED_INT: + return static_cast(_value.u); + case Number::ValueType::SIGNED_INT: + return _value.i; + case Number::ValueType::DOUBLE: + return static_cast(_value.d); + } +} + +double Number::toDouble() const { + switch (_type) { + case Number::ValueType::UNSIGNED_INT: + return static_cast(_value.u); + case Number::ValueType::SIGNED_INT: + return static_cast(_value.i); + case Number::ValueType::DOUBLE: + return _value.d; + } +} + +Number *Number::make(Number::Value value, Number::ValueType type) { + return new Number(value, type); +} + +} // namespace djinni \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp new file mode 100644 index 00000000..7b0ebbd0 --- /dev/null +++ b/support-lib/cpp/djinni_c_types.hpp @@ -0,0 +1,98 @@ +#pragma once + +#include +#include +#include + +namespace djinni { + +class Object { +public: + Object(); + virtual ~Object(); + + static void retain(Object *object); + static void release(Object *object); + +private: + std::atomic_int _ref; + + void onRetain(); + void onRelease(); +}; + +class String : public Object { +public: + String(size_t length); + ~String() override; + + const char *data() const; + size_t length() const; + + static String *make(const char *str, size_t length); + +private: + size_t _length; +}; + +class ObjectArray : public Object { +public: + ObjectArray(size_t length); + ~ObjectArray() override; + + size_t length() const; + + Object *getObjectAtIndex(size_t index) const; + void setObjectAtIndex(Object *object, size_t index); + + static ObjectArray *make(size_t length); + +private: + size_t _length; +}; + +class Binary : public Object { +public: + using Deallocator = void (*)(uint8_t *, size_t, void *); + Binary(uint8_t *data, size_t length, void *opaque, + Binary::Deallocator deallocator); + ~Binary() override; + + uint8_t *data() const; + size_t length() const; + + static Binary *make(uint8_t *data, size_t length, void *opaque, + Binary::Deallocator deallocator); + +private: + uint8_t *_data; + size_t _length; + void *_opaque; + Binary::Deallocator _deallocator; +}; + +class Number : public Object { +public: + union Value { + uint64_t u; + int64_t i; + double d; + }; + + enum class ValueType { UNSIGNED_INT, SIGNED_INT, DOUBLE }; + + Number(Value value, ValueType type); + ~Number() override; + + uint64_t toUnsignedInt() const; + int64_t toSignedInt() const; + double toDouble() const; + + static Number *make(Value value, ValueType type); + +private: + Value _value; + ValueType _type; +}; + +} // namespace djinni \ No newline at end of file From 5193999ebbd8be43a017bebf8ef8b9c4235da176 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 14 Aug 2025 13:56:19 +0200 Subject: [PATCH 07/42] progress --- support-lib/BUILD | 2 +- support-lib/cpp/djinni_c.cpp | 115 +++++++++++++++++++++++++ support-lib/cpp/djinni_c.h | 7 +- support-lib/cpp/djinni_c_helpers.hpp | 121 ++++++++++++++++++++++++--- support-lib/cpp/djinni_c_types.cpp | 2 +- support-lib/cpp/djinni_c_types.hpp | 2 +- 6 files changed, 232 insertions(+), 17 deletions(-) create mode 100644 support-lib/cpp/djinni_c.cpp diff --git a/support-lib/BUILD b/support-lib/BUILD index e51c3093..6db768d0 100644 --- a/support-lib/BUILD +++ b/support-lib/BUILD @@ -5,7 +5,7 @@ load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") cc_library( name = "djinni-support-common", srcs = glob(["cpp/*.cpp"]), - hdrs = glob(["*.hpp", "cpp/*.hpp"]), + hdrs = glob(["*.hpp", "cpp/*.hpp", "cpp/*.h"]), includes = ["cpp"], visibility = ["//visibility:public"], ) diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp new file mode 100644 index 00000000..728f6130 --- /dev/null +++ b/support-lib/cpp/djinni_c.cpp @@ -0,0 +1,115 @@ +#include "djinni_c.h" +#include "djinni_c_types.hpp" + +using namespace djinni; + +static djinni_ref toC(Object *obj) { return reinterpret_cast(obj); } + +template static T *fromC(djinni_ref ref) { + return static_cast(reinterpret_cast(ref)); +} + +void djinni_ref_retain(djinni_ref ref) { Object::retain(fromC(ref)); } + +void djinni_ref_release(djinni_ref ref) { Object::retain(fromC(ref)); } + +djinni_string_ref djinni_string_create(const char *str, size_t length) { + return toC(String::make(str, length)); +} + +const char *djinni_string_get_data(djinni_string_ref str) { + return fromC(str)->data(); +} + +size_t djinni_string_get_length(djinni_string_ref str) { + return fromC(str)->length(); +} + +djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, + void *opaque, + djinni_binary_deallocator deallocator) { + return toC(Binary::make(data, length, opaque, deallocator)); +} + +djinni_number_ref djinni_number_int64_create(int64_t v) { + Number::Value value; + value.i = v; + return toC(Number::make(value, Number::ValueType::SIGNED_INT)); +} + +djinni_number_ref djinni_number_uint64_create(uint64_t v) { + Number::Value value; + value.u = v; + return toC(Number::make(value, Number::ValueType::UNSIGNED_INT)); +} + +djinni_number_ref djinni_number_double_create(double v) { + Number::Value value; + value.d = v; + return toC(Number::make(value, Number::ValueType::DOUBLE)); +} + +int64_t djinni_number_get_int64(djinni_number_ref number) { + return fromC(number)->toSignedInt(); +} + +uint64_t djinni_number_get_uint64(djinni_number_ref number) { + return fromC(number)->toUnsignedInt(); +} + +double djinni_number_get_double(djinni_number_ref number) { + return fromC(number)->toDouble(); +} + +djinni_keyval_array_ref djinni_keyval_array_create(size_t size) { + auto *array = ObjectArray::make(size << 1); + return toC(array); +} + +size_t djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array) { + return fromC(keyval_array)->length() >> 1; +} + +djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, + size_t index) { + return toC(fromC(keyval_array)->getObjectAtIndex(index << 1)); +} + +djinni_ref djinni_keyval_array_get_value(djinni_keyval_array_ref keyval_array, + size_t index) { + return toC( + fromC(keyval_array)->getObjectAtIndex((index << 1) + 1)); +} + +void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, + size_t index, djinni_ref key, + djinni_ref value) { + auto *array = fromC(keyval_array); + array->setObjectAtIndex(index << 1, fromC(key)); + array->setObjectAtIndex((index << 1) + 1, fromC(value)); +} + +djinni_array_ref djinni_array_create(size_t length) { + return toC(ObjectArray::make(length)); +} + +size_t djinni_array_get_length(djinni_array_ref array) { + return fromC(array)->length(); +} + +djinni_ref djinni_array_get_value(djinni_array_ref array, size_t index) { + return toC(fromC(array)->getObjectAtIndex(index)); +} + +void djinni_array_set_value(djinni_array_ref array, size_t index, + djinni_ref value) { + fromC(array)->setObjectAtIndex(index, fromC(value)); +} + +djinni_date_ref djinni_date_create(uint64_t epoch_time_ms) { + return djinni_number_uint64_create(epoch_time_ms); +} + +uint64_t djinni_date_get_epoch(djinni_date_ref date) { + return djinni_number_get_uint64(date); +} \ No newline at end of file diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 28f27262..570da08b 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -1,6 +1,7 @@ #pragma once #include +#include typedef void *djinni_ref; @@ -14,6 +15,8 @@ typedef djinni_ref djinni_date_ref; typedef djinni_ref djinni_record_ref; typedef djinni_ref djinni_interface_ref; +typedef void(*djinni_binary_deallocator)(uint8_t *, size_t, void *); + void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); @@ -23,7 +26,7 @@ const char *djinni_string_get_data(djinni_string_ref str); size_t djinni_string_get_length(djinni_string_ref str); -djinni_binary_ref djinni_binary_create(const uint8_t *data, size_t length); +djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, void *opaque, djinni_binary_deallocator deallocator); djinni_number_ref djinni_number_int64_create(int64_t v); djinni_number_ref djinni_number_uint64_create(uint64_t v); @@ -35,7 +38,7 @@ double djinni_number_get_double(djinni_number_ref number); djinni_keyval_array_ref djinni_keyval_array_create(size_t size); -djinni_keyval_array_ref djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array); +size_t djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array); djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, size_t index); djinni_ref djinni_keyval_array_get_value(djinni_keyval_array_ref keyval_array, size_t index); diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 9fb2dddc..0c81d8ed 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -25,6 +25,103 @@ class Date { static std::chrono::system_clock::time_point toCpp(djinni_date_ref date); }; +class Number { +public: + template static djinni_number_ref fromCpp(T value) = delete; + template static T toCpp(djinni_number_ref value) = delete; + + template <> djinni_number_ref fromCpp(uint8_t value) { + return fromCppUnsignedInt(value); + } + template <> djinni_number_ref fromCpp(uint16_t value) { + return fromCppUnsignedInt(value); + } + template <> djinni_number_ref fromCpp(uint32_t value) { + return fromCppUnsignedInt(value); + } + template <> djinni_number_ref fromCpp(uint64_t value) { + return fromCppUnsignedInt(value); + } + template <> djinni_number_ref fromCpp(bool value) { + return fromCppUnsignedInt(value); + } + + template <> uint8_t toCpp(djinni_number_ref value) { + return toCppUnsignedInt(value); + } + template <> uint16_t toCpp(djinni_number_ref value) { + return toCppUnsignedInt(value); + } + template <> uint32_t toCpp(djinni_number_ref value) { + return toCppUnsignedInt(value); + } + template <> uint64_t toCpp(djinni_number_ref value) { + return toCppUnsignedInt(value); + } + template <> bool toCpp(djinni_number_ref value) { + return toCppUnsignedInt(value); + } + + template <> djinni_number_ref fromCpp(int8_t value) { + return fromCppSignedInt(value); + } + template <> djinni_number_ref fromCpp(int16_t value) { + return fromCppSignedInt(value); + } + template <> djinni_number_ref fromCpp(int32_t value) { + return fromCppSignedInt(value); + } + template <> djinni_number_ref fromCpp(int64_t value) { + return fromCppSignedInt(value); + } + + template <> int8_t toCpp(djinni_number_ref value) { + return toCppSignedInt(value); + } + template <> int16_t toCpp(djinni_number_ref value) { + return toCppSignedInt(value); + } + template <> int32_t toCpp(djinni_number_ref value) { + return toCppSignedInt(value); + } + template <> int64_t toCpp(djinni_number_ref value) { + return toCppSignedInt(value); + } + + template <> djinni_number_ref fromCpp(float value) { + return djinni_number_double_create(value); + } + + template <> djinni_number_ref fromCpp(double value) { + return djinni_number_double_create(value); + } + + template <> float toCpp(djinni_number_ref value) { + return static_cast(djinni_number_get_double(value)); + } + + template <> double toCpp(djinni_number_ref value) { + return djinni_number_get_double(value); + } + +private: + template static djinni_number_ref fromCppUnsignedInt(T value) { + return djinni_number_uint64_create(static_cast(value)); + } + + template static T toCppUnsignedInt(djinni_number_ref value) { + return static_cast(djinni_number_get_uint64(value)); + } + + template static djinni_number_ref fromCppSignedInt(T value) { + return djinni_number_int64_create(static_cast(value)); + } + + template static T toCppSignedInt(djinni_number_ref value) { + return static_cast(djinni_number_get_int64(value)); + } +}; + class Optional { public: static djinni_optional_bool fromCpp(std::optional value) { @@ -79,7 +176,7 @@ class Optional { if (ptr == nullptr) { return std::nullopt; } else { - return std::optional(convert(ptr)); + return std::make_optional(convert(ptr)); } } @@ -99,16 +196,16 @@ class Optional { template class Record { public: - template static djinni_record_ptr make(Args &&...args) { - return reinterpret_cast( + template static djinni_record_ref make(Args &&...args) { + return reinterpret_cast( new T(std::forward(args)...)); } - static T *toCpp(djinni_record_ptr ptr) { return reinterpret_cast(ptr); } + static T *toCpp(djinni_record_ref ptr) { return reinterpret_cast(ptr); } - static djinni_record_ptr fromCpp(T &&value) { return make(std::move(value)); } + static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } - static void release(djinni_record_ptr ptr) { delete toCpp(ptr); } + static void release(djinni_record_ref ptr) { delete toCpp(ptr); } }; template class Enum { @@ -136,9 +233,9 @@ template class List { output.reserve(length); for (size_t i = 0; i < length; i++) { - auto value = djinni_array_get_value(value, i); - output.emplace_back(convert(value)); - djinni_ref_release(value); + auto item = djinni_array_get_value(value, i); + output.emplace_back(convert(item)); + djinni_ref_release(item); } return output; @@ -168,9 +265,9 @@ template class Set { output.reserve(length); for (size_t i = 0; i < length; i++) { - auto value = djinni_array_get_value(value, i); - output.emplace(convert(value)); - djinni_ref_release(value); + auto item = djinni_array_get_value(value, i); + output.emplace(convert(item)); + djinni_ref_release(item); } return output; diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp index cf7785f2..13ccfa24 100644 --- a/support-lib/cpp/djinni_c_types.cpp +++ b/support-lib/cpp/djinni_c_types.cpp @@ -110,7 +110,7 @@ Object *ObjectArray::getObjectAtIndex(size_t index) const { return object; } -void ObjectArray::setObjectAtIndex(Object *object, size_t index) { +void ObjectArray::setObjectAtIndex(size_t index, Object *object) { ObjectArrayAllocator allocator; Object **data = allocator.getContainerStartPtr(this); diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 7b0ebbd0..7252b445 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -43,7 +43,7 @@ class ObjectArray : public Object { size_t length() const; Object *getObjectAtIndex(size_t index) const; - void setObjectAtIndex(Object *object, size_t index); + void setObjectAtIndex(size_t index, Object *object); static ObjectArray *make(size_t length); From e53781a658f29e6664e6ca2b77a69d58c6732560 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 14 Aug 2025 15:51:37 +0200 Subject: [PATCH 08/42] getting close to compiling them --- src/source/CTypeResolver.scala | 33 +++++-- support-lib/cpp/djinni_c_helpers.hpp | 95 +++++++++---------- support-lib/cpp/djinni_c_types.cpp | 7 -- support-lib/cpp/djinni_c_types.hpp | 13 +++ support-lib/outcome.yaml | 5 + .../djinni/vendor/third-party/date.yaml | 4 + .../djinni/vendor/third-party/duration.yaml | 4 + 7 files changed, 92 insertions(+), 69 deletions(-) diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 45c2db26..b52bb521 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -3,7 +3,7 @@ package djinni import generatorTools.{DeclRef, ImportRef, Spec, q} import djinni.ast.{Ident, TypeDef, TypeRef} -import djinni.meta.{MExpr, MPrimitive, Meta} +import djinni.meta.{MExpr, MOptional, MPrimitive, Meta} import djinni.writer.IndentWriter import scala.collection.mutable @@ -73,25 +73,37 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal }, (p) => { val innerFromCpp = inner.fromCppTranslatorFn("value") - s"$translator::fromCpp(${p}, [](auto value) { return ${innerFromCpp}); })" + s"$translator::fromCpp(${p}, [](auto value) { return ${innerFromCpp}; })" } ) } - private def resolveOptional(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { + private def resolveOptional(expr: MExpr, asBoxed: Boolean, parent: MExpr): CTypeTranslator = { if (isEnum(expr)) { return resolve(expr, true) } val resolved = resolve(expr, asBoxed) val primitive = getPrimitiveOrNull(expr) + val cppOptionalTemplate = cppMarshal.fqTypename(parent) + if (primitive != null && !asBoxed) { - new CTypeTranslator(s"djinni_optional_${resolved.typename}", - (p) => s"djinni::c_api::Optional::toCpp(${resolved.toCppTranslatorFn(p)})", - (p) => s"djinni::c_api::Optional::fromCpp(${resolved.fromCppTranslatorFn(p)})" + val typename = s"djinni_optional_${resolved.typename}" + new CTypeTranslator(typename, + (p) => s"::djinni::c_api::Optional::toCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.toCppTranslatorFn(p)})", + (p) => s"::djinni::c_api::Optional::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" ) } else { - makeNestedTranslator(resolved, resolved.typename, "::djinni::c_api::Optional") + new CTypeTranslator(resolved.typename, + (p) => { + val innerToCpp = resolved.toCppTranslatorFn("value") + s"::djinni::c_api::Optional::toCpp<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerToCpp}; })" + }, + (p) => { + val innerFromCpp = resolved.fromCppTranslatorFn("value") + s"::djinni::c_api::Optional::fromCpp<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerFromCpp}; })" + } + ) } } @@ -153,9 +165,10 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolveEnum(name: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { val typename = valueTypeName(name) if (asBoxed) { + val optionalType = s"${spec.cppOptionalTemplate}<${cppTypename}>" new CTypeTranslator("djinni_number_ref", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed<${optionalType}>(${p})", + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed<${optionalType}>(${p})" ) } else { new CTypeTranslator(typename, @@ -209,7 +222,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal case meta.MString => makeTranslator("djinni_string_ref", "::djinni::c_api::String") case meta.MDate => makeTranslator("djinni_date_ref", "::djinni::c_api::Date") case meta.MBinary => makeTranslator("djinni_binary_ref", "::djinni::c_api::Binary") - case meta.MOptional => resolveOptional(expr.args.head, asBoxed) + case meta.MOptional => resolveOptional(expr.args.head, asBoxed, expr) case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::List") case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::Set") case meta.MMap => resolveMap(expr.args.head, expr.args(1)) diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 0c81d8ed..94a3c307 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -1,9 +1,9 @@ #pragma once #include "djinni_c.h" +#include "djinni_c_types.hpp" #include #include -#include #include #include #include @@ -124,36 +124,27 @@ class Number { class Optional { public: - static djinni_optional_bool fromCpp(std::optional value) { - return fromCppPrimitive(value); - } - - static djinni_optional_int8_t fromCpp(std::optional value) { - return fromCppPrimitive(value); - } - - static djinni_optional_int16_t fromCpp(std::optional value) { - return fromCppPrimitive(value); - } - - static djinni_optional_int32_t fromCpp(std::optional value) { - return fromCppPrimitive(value); - } + template static T fromCppPrimitive(Opt value) { + T out = {0}; - static djinni_optional_int64_t fromCpp(std::optional value) { - return fromCppPrimitive(value); - } + if (value) { + out.has_value = true; + out.value = value.value(); + } - static djinni_optional_float fromCpp(std::optional value) { - return fromCppPrimitive(value); + return out; } - static djinni_optional_double fromCpp(std::optional value) { - return fromCppPrimitive(value); + template static Opt toCppPrimitive(T value) { + if (value.has_value) { + return Opt(value.value); + } else { + return Opt(); + } } - template - static djinni_ref fromCpp(const std::optional &value, F &&convert) { + template + static djinni_ref fromCpp(const Opt &value, F &&convert) { if (!value) { return nullptr; } else { @@ -161,8 +152,8 @@ class Optional { } } - template - static djinni_ref fromCpp(std::optional &&value, F &&convert) { + template + static djinni_ref fromCpp(Opt &&value, F &&convert) { if (!value) { return nullptr; } else { @@ -170,42 +161,42 @@ class Optional { } } - template - static auto toCpp(djinni_ref ptr, F &&convert) - -> std::optional> { + template + static Opt toCpp(djinni_ref ptr, F &&convert) { if (ptr == nullptr) { - return std::nullopt; + return Opt(); } else { - return std::make_optional(convert(ptr)); + return Opt(convert(ptr)); } } private: - template - static Opt fromCppPrimitive(std::optional value) { - Opt out = {0}; - - if (value.has_value()) { - out.has_value = true; - out.value = value.value(); - } - - return out; - } }; template class Record { public: template static djinni_record_ref make(Args &&...args) { - return reinterpret_cast( - new T(std::forward(args)...)); + Object *obj = new RecordHolder(T(std::forward(args)...)); + return reinterpret_cast(obj); } - static T *toCpp(djinni_record_ref ptr) { return reinterpret_cast(ptr); } + static T *toCpp(djinni_record_ref ptr) { + auto *record = + static_cast *>(reinterpret_cast(ptr)); + if (record == nullptr) { + return nullptr; + } + + return &record->data(); + } static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } - static void release(djinni_record_ref ptr) { delete toCpp(ptr); } + static djinni_record_ref fromCpp(const T &value) { return make(value); } + + static void release(djinni_record_ref ptr) { + Object::release(reinterpret_cast(ptr)); + } }; template class Enum { @@ -213,12 +204,12 @@ template class Enum { static Cpp toCpp(C value) { return static_cast(value); } static C fromCpp(Cpp value) { return static_cast(value); } - static std::optional toCppBoxed(djinni_number_ref value) { - return value != nullptr ? static_cast(djinni_number_get_int64(value)) - : std::nullopt; + template static Opt toCppBoxed(djinni_number_ref value) { + return value != nullptr ? Opt(static_cast(djinni_number_get_int64(value))) + : Opt(); } - static djinni_number_ref fromCppBoxed(std::optional value) { + template static djinni_number_ref fromCppBoxed(Opt value) { return value ? Number::fromCpp(static_cast(value.value())) : nullptr; } @@ -316,7 +307,7 @@ template class Map { djinni_keyval_array_ref output = djinni_keyval_array_create(map.size()); size_t index = 0; for (const auto &it : map) { - auto pair = convert(it.first, it.value); + auto pair = convert(it.first, it.second); djinni_keyval_array_set_entry(output, index++, pair.first, pair.second); diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp index 13ccfa24..7dfd6da9 100644 --- a/support-lib/cpp/djinni_c_types.cpp +++ b/support-lib/cpp/djinni_c_types.cpp @@ -33,13 +33,6 @@ template struct ArrayAllocator { } }; -static Object *swapObject(Object *prevValue, Object *newValue) { - Object::retain(newValue); - Object::release(prevValue); - - return newValue; -} - Object::Object() : _ref(1) {} Object::~Object() = default; diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 7252b445..13346896 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -95,4 +95,17 @@ class Number : public Object { ValueType _type; }; +template class RecordHolder : public Object { +public: + RecordHolder(T data) : _data(std::move(data)) {} + ~RecordHolder() override = default; + + const T &data() const { return _data; } + + T &data() { return _data; } + +private: + T _data; +}; + } // namespace djinni \ No newline at end of file diff --git a/support-lib/outcome.yaml b/support-lib/outcome.yaml index a7e57990..3b09a478 100644 --- a/support-lib/outcome.yaml +++ b/support-lib/outcome.yaml @@ -47,3 +47,8 @@ swift: swiftxx: translator: '::djinni::swift::OutcomeAdaptor' header: '"Outcome_swift.hpp"' +c: + typename: 'djinni_outcome_ref' + translator: '::djinni::c_api::Outcome' + public_header: '"djinni_c.h"' + diff --git a/test-suite/djinni/vendor/third-party/date.yaml b/test-suite/djinni/vendor/third-party/date.yaml index 185bb592..95d3d149 100644 --- a/test-suite/djinni/vendor/third-party/date.yaml +++ b/test-suite/djinni/vendor/third-party/date.yaml @@ -44,3 +44,7 @@ swift: swiftxx: translator: '::djinni::swift::Date' header: '"djinni_support.hpp"' +c: + typename: 'djinni_date_ref' + translator: '::djinni::c_api::Date' + public_header: '"djinni_c.h"' diff --git a/test-suite/djinni/vendor/third-party/duration.yaml b/test-suite/djinni/vendor/third-party/duration.yaml index d931bd60..f4a5d522 100644 --- a/test-suite/djinni/vendor/third-party/duration.yaml +++ b/test-suite/djinni/vendor/third-party/duration.yaml @@ -303,3 +303,7 @@ swift: swiftxx: translator: '::djinni::swift::Duration_ns' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Number' + public_header: '"djinni_c.h"' From a64bdf43293c3b4d77844be9de2c1875aa64a9d7 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 14 Aug 2025 18:19:21 +0200 Subject: [PATCH 09/42] compiles --- src/source/CGenerator.scala | 4 ++-- src/source/CTypeResolver.scala | 10 +++------- support-lib/cpp/djinni_c_helpers.hpp | 16 +++++++--------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 3316f11f..a9413299 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -142,14 +142,14 @@ class CGenerator(spec: Spec) extends Generator(spec) { for ((f, t) <- associatedFields) { w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance)""") w.braced { - val param = s"${toCppExpr}->${idCpp.field(f.ident)}" + val param = s"${toCppExpr}.${idCpp.field(f.ident)}" w.wl(s"return ${t.fromCppTranslatorFn(param)};") } w.wl w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value)""") w.braced { val toCppValue = t.toCppTranslatorFn("value") - w.wl(s"${toCppExpr}->${idCpp.field(f.ident)} = ${toCppValue};") + w.wl(s"${toCppExpr}.${idCpp.field(f.ident)} = ${toCppValue};") } w.wl } diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index b52bb521..d4cbc947 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -79,10 +79,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } private def resolveOptional(expr: MExpr, asBoxed: Boolean, parent: MExpr): CTypeTranslator = { - if (isEnum(expr)) { - return resolve(expr, true) - } - val resolved = resolve(expr, asBoxed) + val resolved = resolve(expr, asBoxed || isEnum(expr)) val primitive = getPrimitiveOrNull(expr) val cppOptionalTemplate = cppMarshal.fqTypename(parent) @@ -165,10 +162,9 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolveEnum(name: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { val typename = valueTypeName(name) if (asBoxed) { - val optionalType = s"${spec.cppOptionalTemplate}<${cppTypename}>" new CTypeTranslator("djinni_number_ref", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed<${optionalType}>(${p})", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed<${optionalType}>(${p})" + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", + (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" ) } else { new CTypeTranslator(typename, diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 94a3c307..48a10294 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -180,14 +180,14 @@ template class Record { return reinterpret_cast(obj); } - static T *toCpp(djinni_record_ref ptr) { + static T &toCpp(djinni_record_ref ptr) { auto *record = static_cast *>(reinterpret_cast(ptr)); if (record == nullptr) { - return nullptr; + std::abort(); } - return &record->data(); + return record->data(); } static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } @@ -204,14 +204,12 @@ template class Enum { static Cpp toCpp(C value) { return static_cast(value); } static C fromCpp(Cpp value) { return static_cast(value); } - template static Opt toCppBoxed(djinni_number_ref value) { - return value != nullptr ? Opt(static_cast(djinni_number_get_int64(value))) - : Opt(); + static Cpp toCppBoxed(djinni_number_ref value) { + return static_cast(djinni_number_get_int64(value)); } - template static djinni_number_ref fromCppBoxed(Opt value) { - return value ? Number::fromCpp(static_cast(value.value())) - : nullptr; + static djinni_number_ref fromCppBoxed(Cpp value) { + return Number::fromCpp(static_cast(value)); } }; From bd7697559d56b80512aff83f17c67aa76c1fb8f5 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 10:26:50 -0500 Subject: [PATCH 10/42] more types supported, and starting interface support --- src/source/CGenerator.scala | 138 +++++++++++--- src/source/CTypeResolver.scala | 28 ++- src/source/CppMarshal.scala | 13 ++ support-lib/cpp/djinni_c.h | 3 + support-lib/cpp/djinni_c_helpers.hpp | 169 ++++++++++++++---- support-lib/cpp/djinni_c_types.hpp | 11 ++ support-lib/dataref.yaml | 5 + support-lib/dataview.yaml | 5 + support-lib/future.yaml | 5 + support-lib/outcome.yaml | 1 + .../djinni/vendor/third-party/date.yaml | 1 + .../djinni/vendor/third-party/duration.yaml | 33 +++- 12 files changed, 338 insertions(+), 74 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index a9413299..d7f0734d 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -2,13 +2,17 @@ package djinni import generatorTools.{Spec, q} -import djinni.ast.{Doc, Ident, Interface, ProtobufMessage, TypeParam, TypeRef} +import djinni.ast.{Doc, Field, Ident, Interface, ProtobufMessage, TypeParam, TypeRef} import djinni.writer.IndentWriter class CGenerator(spec: Spec) extends Generator(spec) { private val cppMarshal = new CppMarshal(spec) + private class ResolvedField(val field: Field, val translator: CTypeTranslator) + + private class ResolvedMethod(val method: Interface.Method, val parameters: Seq[ResolvedField], val returnType: Option[CTypeTranslator]) + private def resolveSymbolName(name: String): String = { return spec.cNamespace + name } @@ -39,7 +43,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { }) } - private def writeCFilePair(origin: String, ident: Ident, doc: Doc, publicIncludes: Seq[String], privateIncludes: Seq[String])(header: IndentWriter => Unit, impl: IndentWriter => Unit): Unit = { + private def writeCFilePair(origin: String, ident: Ident, publicIncludes: Seq[String], privateIncludes: Seq[String])(header: IndentWriter => Unit, impl: IndentWriter => Unit): Unit = { writeCFile(origin, ident, "h", (w: IndentWriter) => { w.wl("#pragma once") w.wl @@ -47,8 +51,6 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl("#include " + q(spec.cBaseLibIncludePrefix + "djinni_c.h")) publicIncludes.foreach(w.wl) - writeDoc(w, doc) - writeExternCBegin(w) w.wl @@ -68,9 +70,10 @@ class CGenerator(spec: Spec) extends Generator(spec) { } override def generateEnum(origin: String, ident: Ident, doc: Doc, e: ast.Enum): Unit = { - writeCFilePair(origin, ident, doc, List.empty[String], List.empty[String])((w: IndentWriter) => { + writeCFilePair(origin, ident, List.empty[String], List.empty[String])((w: IndentWriter) => { val symbolName = resolveSymbolName(ident.name) val enumCasePrefix = symbolName + "_" + writeDoc(w, doc) w.w("enum " + symbolName) w.bracedSemi { writeEnumOptionNone(w, e, idCpp.enum, "=", enumCasePrefix) @@ -92,13 +95,17 @@ class CGenerator(spec: Spec) extends Generator(spec) { } } - private def writeParamList(w: IndentWriter, params: Seq[(Ident, CTypeTranslator)]): Unit = { + private def writeParamList(w: IndentWriter, params: Seq[(String, String)]): Unit = { writeDelimited(w, params, ", ")(t => { - w.w(t._2.typename) - w.w(" " + t._1.name) + w.w(t._1) + w.w(" " + t._2) }) } + private def writeParamListWithResolvedFields(w: IndentWriter, params: Seq[ResolvedField]): Unit = { + writeParamList(w, params.map(p => (p.translator.typename, p.field.ident.name))) + } + override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: ast.Record): Unit = { val selfCpp = cppMarshal.fqTypename(ident, r) @@ -106,31 +113,35 @@ class CGenerator(spec: Spec) extends Generator(spec) { val prefix = resolveSymbolName(ident.name) val typeName = resolveSymbolTypeName(ident) - val associatedFields = r.fields.map(f => (f, typeResolver.resolve(f.ty.resolved))) + val resolvedFields = r.fields.map(f => (new ResolvedField(f, typeResolver.resolve(f.ty.resolved)))) - writeCFilePair(origin, ident, doc, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { + writeCFilePair(origin, ident, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { + writeDoc(w, doc) w.wl(s"""typedef djinni_record_ref ${typeName};""") w.wl w.w(s"""${typeName} ${prefix}_create(""") - writeParamList(w, associatedFields.map(f => (f._1.ident, f._2))) + writeParamListWithResolvedFields(w, resolvedFields) w.wl(");") - for ((f, t) <- associatedFields) { - w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance);""") - w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value);""") + for (resolvedField <- resolvedFields) { + val fieldName = resolvedField.field.ident.name + val fieldTypename = resolvedField.translator.typename + writeDoc(w, resolvedField.field.doc) + w.wl(s"""${fieldTypename} ${prefix}_get_${fieldName}(${typeName} instance);""") + w.wl(s"""void ${prefix}_set_${fieldName}(${typeName} instance, ${fieldTypename} value);""") w.wl } }, (w: IndentWriter) => { w.w(s"""${typeName} ${prefix}_create(""") - writeParamList(w, associatedFields.map(f => (f._1.ident, f._2))) + writeParamListWithResolvedFields(w, resolvedFields) w.wl(") ") w.braced { w.w(s"""return ::djinni::c_api::Record<${selfCpp}>::make(""") - writeDelimited(w, associatedFields, ", ")(t => { - w.w(t._2.toCppTranslatorFn(t._1.ident.name)) + writeDelimited(w, resolvedFields, ", ")(t => { + w.w(t.translator.toCppTranslatorFn(t.field.ident.name)) }) w.wl(");") @@ -139,17 +150,19 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl val toCppExpr = s"::djinni::c_api::Record<${selfCpp}>::toCpp(instance)" - for ((f, t) <- associatedFields) { - w.wl(s"""${t.typename} ${prefix}_get_${f.ident.name}(${typeName} instance)""") + for (resolvedField <- resolvedFields) { + val fieldName = resolvedField.field.ident.name + val fieldTypename = resolvedField.translator.typename + w.wl(s"""${fieldTypename} ${prefix}_get_${fieldName}(${typeName} instance)""") w.braced { - val param = s"${toCppExpr}.${idCpp.field(f.ident)}" - w.wl(s"return ${t.fromCppTranslatorFn(param)};") + val param = s"${toCppExpr}.${idCpp.field(resolvedField.field.ident)}" + w.wl(s"return ${resolvedField.translator.fromCppTranslatorFn(param)};") } w.wl - w.wl(s"""void ${prefix}_set_${f.ident.name}(${typeName} instance, ${t.typename} value)""") + w.wl(s"""void ${prefix}_set_${fieldName}(${typeName} instance, ${fieldTypename} value)""") w.braced { - val toCppValue = t.toCppTranslatorFn("value") - w.wl(s"${toCppExpr}.${idCpp.field(f.ident)} = ${toCppValue};") + val toCppValue = resolvedField.translator.toCppTranslatorFn("value") + w.wl(s"${toCppExpr}.${idCpp.field(resolvedField.field.ident)} = ${toCppValue};") } w.wl } @@ -158,12 +171,83 @@ class CGenerator(spec: Spec) extends Generator(spec) { } override def generateInterface(origin: String, ident: Ident, doc: Doc, typeParams: Seq[TypeParam], i: Interface): Unit = { + val selfCpp = cppMarshal.fqTypename(ident, i) val typeResolver = new CTypeResolver(ident, spec, cppMarshal) - writeCFilePair(origin, ident, doc, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { - w.wl("// This is a test interface") + val resolvedMethods = i.methods.map(m => + new ResolvedMethod( + m, + m.params.map(p => + new ResolvedField( + p, + typeResolver.resolve(p.ty.resolved)) + ), + m.ret.map(r => typeResolver.resolve(r.resolved)) + )) + + val prefix = resolveSymbolName(ident.name) + val typeName = resolveSymbolTypeName(ident) + + writeCFilePair(origin, ident, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { + writeDoc(w, doc) + w.wl(s"""typedef djinni_interface_ref ${typeName};""") + w.wl + + for (resolvedMethod <- resolvedMethods) { + writeDoc(w, resolvedMethod.method.doc) + val retTypeName = if (resolvedMethod.returnType.isDefined) resolvedMethod.returnType.get.typename else "void" + w.w(s"${retTypeName} ${prefix}_${resolvedMethod.method.ident.name}(") + + if (resolvedMethod.method.static) { + writeParamList(w, resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } else { + writeParamList(w, (typeName, "instance") +: resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } + + w.wl(");") + + w.wl + } }, (w: IndentWriter) => { - w.wl("// Impl goes here") + for (resolvedMethod <- resolvedMethods) { + writeDoc(w, resolvedMethod.method.doc) + val retTypeName = if (resolvedMethod.returnType.isDefined) resolvedMethod.returnType.get.typename else "void" + w.w(s"${retTypeName} ${prefix}_${resolvedMethod.method.ident.name}(") + + if (resolvedMethod.method.static) { + writeParamList(w, resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } else { + writeParamList(w, (typeName, "instance") +: resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } + + w.wl(")") + w.braced { + val needsReturnValue = (resolvedMethod.returnType.isDefined && resolvedMethod.returnType.get.typename != "void") + + if (needsReturnValue) { + w.w(s"auto retValue = ") + } + + if (resolvedMethod.method.static) { + w.w(s"""${selfCpp}::${resolvedMethod.method.ident.name}(""") + } else { + w.w(s"""::djinni::c_api::Interface<${selfCpp}>::toCpp(instance)->${resolvedMethod.method.ident.name}(""") + } + + writeDelimited(w, resolvedMethod.parameters, ", ")(p => { + w.w(p.translator.toCppTranslatorFn(p.field.ident.name)) + }) + + w.w(")") + + w.wl(";") + if (needsReturnValue) { + w.wl(s"""return ${resolvedMethod.returnType.get.fromCppTranslatorFn("std::move(retValue)")};""") + } + } + + w.wl + } }) } } diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index d4cbc947..3c3c6046 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -91,14 +91,17 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal (p) => s"::djinni::c_api::Optional::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" ) } else { + val sharedPtr = cppMarshal.bySharedPtr(expr) + val toCppMethodName = if (sharedPtr) "toSharedPtrCpp" else "toCpp" + val fromCppMethodName = if (sharedPtr) "fromSharedPtrCpp" else "fromCpp" new CTypeTranslator(resolved.typename, (p) => { val innerToCpp = resolved.toCppTranslatorFn("value") - s"::djinni::c_api::Optional::toCpp<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerToCpp}; })" + s"::djinni::c_api::Optional::${toCppMethodName}<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerToCpp}; })" }, (p) => { val innerFromCpp = resolved.fromCppTranslatorFn("value") - s"::djinni::c_api::Optional::fromCpp<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerFromCpp}; })" + s"::djinni::c_api::Optional::${fromCppMethodName}<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerFromCpp}; })" } ) } @@ -174,6 +177,21 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } + private def resolveExtern(expr: MExpr, c: meta.MExtern.C): CTypeTranslator = { + updatePrivateImports(expr.base) + addPublicImport(c.publicHeader) + privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) + + val resolvedTranslator: String = if (expr.args.isEmpty) { + c.translator + } else { + val templateArgs = expr.args.map(a => cppMarshal.fqTypename(a)).mkString(", ") + s"${c.translator}<${templateArgs}>" + } + + makeTranslator(c.typename, resolvedTranslator) + } + def resolve(expr: MExpr): CTypeTranslator = { resolve(expr, false) } @@ -200,11 +218,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal case ast.ProtobufMessage(cpp, java, objc, ts, swift) => throw new AssertionError("Unsupported") } } - case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => { - updatePrivateImports(expr.base) - addPublicImport(c.publicHeader) - makeTranslator(c.typename, c.translator) - } + case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, c) case meta.MProtobuf(name, numParams, body) => { updatePrivateImports(expr.base) makeTranslator( diff --git a/src/source/CppMarshal.scala b/src/source/CppMarshal.scala index d3a60f08..69febe47 100644 --- a/src/source/CppMarshal.scala +++ b/src/source/CppMarshal.scala @@ -271,6 +271,19 @@ class CppMarshal(spec: Spec) extends Marshal(spec) { case p: ProtobufMessage => false } + def bySharedPtr(tm: MExpr): Boolean = tm.base match { + case d: MDef => d.defType match { + case DInterface => true + case _ => false + } + case e: MExtern => e.defType match { + case DInterface => true + case _ => false + } + case MOptional => bySharedPtr(tm.args.head) + case _ => false + } + // this can be used in c++ generation to know whether a const& should be applied to the parameter or not private def toCppParamType(tm: MExpr, namespace: Option[String] = None, scopeSymbols: Seq[String] = Seq()): String = { val cppType = toCppType(tm, namespace, scopeSymbols) diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 570da08b..ae6583a2 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -12,6 +12,9 @@ typedef djinni_ref djinni_array_ref; typedef djinni_ref djinni_keyval_array_ref; typedef djinni_ref djinni_date_ref; +typedef djinni_ref djinni_outcome_ref; +typedef djinni_ref djinni_future_ref; + typedef djinni_ref djinni_record_ref; typedef djinni_ref djinni_interface_ref; diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 48a10294..bfb6c747 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -2,12 +2,17 @@ #include "djinni_c.h" #include "djinni_c_types.hpp" +#include "DataRef.hpp" +#include "DataView.hpp" +#include "Future.hpp" +#include "expected.hpp" #include #include #include #include #include #include +#include namespace djinni::c_api { @@ -143,6 +148,24 @@ class Optional { } } + template + static djinni_ref fromSharedPtrCpp(const T &value, F &&convert) { + if (value == nullptr) { + return nullptr; + } else { + return convert(value); + } + } + + template + static djinni_ref fromSharedPtrCpp(T &&value, F &&convert) { + if (value == nullptr) { + return nullptr; + } else { + return convert(std::move(value)); + } + } + template static djinni_ref fromCpp(const Opt &value, F &&convert) { if (!value) { @@ -170,47 +193,15 @@ class Optional { } } -private: -}; - -template class Record { -public: - template static djinni_record_ref make(Args &&...args) { - Object *obj = new RecordHolder(T(std::forward(args)...)); - return reinterpret_cast(obj); - } - - static T &toCpp(djinni_record_ref ptr) { - auto *record = - static_cast *>(reinterpret_cast(ptr)); - if (record == nullptr) { - std::abort(); + template + static T toSharedPtrCpp(djinni_ref ptr, F &&convert) { + if (ptr == nullptr) { + return T(); + } else { + return convert(ptr); } - - return record->data(); - } - - static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } - - static djinni_record_ref fromCpp(const T &value) { return make(value); } - - static void release(djinni_record_ref ptr) { - Object::release(reinterpret_cast(ptr)); - } -}; - -template class Enum { -public: - static Cpp toCpp(C value) { return static_cast(value); } - static C fromCpp(Cpp value) { return static_cast(value); } - - static Cpp toCppBoxed(djinni_number_ref value) { - return static_cast(djinni_number_get_int64(value)); - } - - static djinni_number_ref fromCppBoxed(Cpp value) { - return Number::fromCpp(static_cast(value)); } +private: }; template class List { @@ -316,4 +307,104 @@ template class Map { } }; +template class Record { +public: + template static djinni_record_ref make(Args &&...args) { + Object *obj = new RecordHolder(T(std::forward(args)...)); + return reinterpret_cast(obj); + } + + static T &toCpp(djinni_record_ref ref) { + auto *record = + static_cast *>(reinterpret_cast(ref)); + if (record == nullptr) { + std::abort(); + } + + return record->data(); + } + + static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } + + static djinni_record_ref fromCpp(const T &value) { return make(value); } + + static void release(djinni_record_ref ptr) { + Object::release(reinterpret_cast(ptr)); + } +}; + +template class Interface { +public: + static const std::shared_ptr &toCpp(djinni_interface_ref ref) { + auto *i = + static_cast *>(reinterpret_cast(ref)); + if (i == nullptr) { + std::abort(); + } + + return i->data(); + } + + static djinni_interface_ref fromCpp(std::shared_ptr value) { + Object *obj = new InterfaceHolder(std::move(value)); + return reinterpret_cast(obj); + } +}; + +template class Enum { +public: + static Cpp toCpp(C value) { return static_cast(value); } + static C fromCpp(Cpp value) { return static_cast(value); } + + static Cpp toCppBoxed(djinni_number_ref value) { + return static_cast(djinni_number_get_int64(value)); + } + + static djinni_number_ref fromCppBoxed(Cpp value) { + return Number::fromCpp(static_cast(value)); + } +}; + + +class DataRef { +public: + static ::djinni::DataRef toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(const ::djinni::DataRef &dataRef); +}; + +class DataView { +public: + static ::djinni::DataView toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(const ::djinni::DataView &dataRef); +}; + +class Binary { +public: + static std::vector toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(std::vector &&binary); + static djinni_binary_ref fromCpp(const std::vector &binary); +}; + +template +class Future { +public: + static ::djinni::Future toCpp(djinni_future_ref future); + static djinni_future_ref fromCpp(::djinni::Future &&future); +}; + +template +class Outcome { +public: + static ::djinni::expected toCpp(djinni_outcome_ref future); + static djinni_outcome_ref fromCpp(::djinni::expected &&outcome); +}; + +template +class Duration { +public: + static std::chrono::duration toCpp(djinni_number_ref value); + static djinni_number_ref fromCpp(const std::chrono::duration &value); +}; + + } // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 13346896..5cdab0a3 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -108,4 +108,15 @@ template class RecordHolder : public Object { T _data; }; +template class InterfaceHolder : public Object { +public: + InterfaceHolder(std::shared_ptr data) : _data(std::move(data)) {} + ~InterfaceHolder() override = default; + + const std::shared_ptr &data() const { return _data; } + +private: + std::shared_ptr _data; +}; + } // namespace djinni \ No newline at end of file diff --git a/support-lib/dataref.yaml b/support-lib/dataref.yaml index c062a75e..94ffb167 100644 --- a/support-lib/dataref.yaml +++ b/support-lib/dataref.yaml @@ -45,3 +45,8 @@ swift: swiftxx: translator: '::djinni::swift::DataRefAdaptor' header: '"Data_swift.hpp"' +c: + typename: 'djinni_binary_ref' + translator: '::djinni::c_api::DataRef' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/dataview.yaml b/support-lib/dataview.yaml index 8dc0a2b6..d1de3602 100644 --- a/support-lib/dataview.yaml +++ b/support-lib/dataview.yaml @@ -45,3 +45,8 @@ swift: swiftxx: translator: '::djinni::swift::DataViewAdaptor' header: '"Data_swift.hpp"' +c: + typename: 'djinni_binary_ref' + translator: '::djinni::c_api::DataView' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/future.yaml b/support-lib/future.yaml index 67643711..1bc3e1e9 100644 --- a/support-lib/future.yaml +++ b/support-lib/future.yaml @@ -48,3 +48,8 @@ swift: swiftxx: translator: '::djinni::swift::FutureAdaptor' header: '"$Future_swift.hpp"' +c: + typename: 'djinni_future_ref' + translator: '::djinni::c_api::Future' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/outcome.yaml b/support-lib/outcome.yaml index 3b09a478..93558ddb 100644 --- a/support-lib/outcome.yaml +++ b/support-lib/outcome.yaml @@ -51,4 +51,5 @@ c: typename: 'djinni_outcome_ref' translator: '::djinni::c_api::Outcome' public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' diff --git a/test-suite/djinni/vendor/third-party/date.yaml b/test-suite/djinni/vendor/third-party/date.yaml index 95d3d149..cf911c6f 100644 --- a/test-suite/djinni/vendor/third-party/date.yaml +++ b/test-suite/djinni/vendor/third-party/date.yaml @@ -48,3 +48,4 @@ c: typename: 'djinni_date_ref' translator: '::djinni::c_api::Date' public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' diff --git a/test-suite/djinni/vendor/third-party/duration.yaml b/test-suite/djinni/vendor/third-party/duration.yaml index f4a5d522..07d02224 100644 --- a/test-suite/djinni/vendor/third-party/duration.yaml +++ b/test-suite/djinni/vendor/third-party/duration.yaml @@ -45,6 +45,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: h typedef: 'record' @@ -88,6 +93,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_h' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration_h' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: min typedef: 'record' @@ -131,6 +141,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_min' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration_min' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: s typedef: 'record' @@ -174,6 +189,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_s' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration_s' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: ms typedef: 'record' @@ -217,6 +237,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_ms' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration_ms' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: us typedef: 'record' @@ -260,6 +285,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_us' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::Duration_us' + public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' --- name: ns typedef: 'record' @@ -305,5 +335,6 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Number' + translator: '::djinni::c_api::Duration_ns' public_header: '"djinni_c.h"' + private_header: '"$djinni_c_helpers.hpp"' From 4dae0903fd1e428d0dc40bc3a961b63899f7cde2 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 10:37:13 -0500 Subject: [PATCH 11/42] all c files compile --- support-lib/cpp/djinni_c_helpers.hpp | 8 + test-suite/BUILD | 176 ++++++++++++------ .../c/tests/DjinniCAPI_tests.cpp | 0 3 files changed, 126 insertions(+), 58 deletions(-) create mode 100644 test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index bfb6c747..19840597 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -397,6 +397,7 @@ class Outcome { public: static ::djinni::expected toCpp(djinni_outcome_ref future); static djinni_outcome_ref fromCpp(::djinni::expected &&outcome); + static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome); }; template @@ -406,5 +407,12 @@ class Duration { static djinni_number_ref fromCpp(const std::chrono::duration &value); }; +template +class Protobuf { +public: + static T toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(const T &proto); +}; + } // namespace djinni::c_api \ No newline at end of file diff --git a/test-suite/BUILD b/test-suite/BUILD index 1ca43ba2..9aecb98b 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -1,37 +1,75 @@ -load("@rules_cc//cc:defs.bzl", "cc_library", "cc_binary", "objc_library") -load("@rules_java//java:defs.bzl", "java_test") -load("@build_bazel_rules_apple//apple:macos.bzl", "macos_unit_test") +# load("@build_bazel_rules_apple//apple:macos.bzl", "macos_unit_test") load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library", "swift_test") load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "objc_library") +load("@rules_java//java:defs.bzl", "java_test") cc_library( name = "djinni-tests-common", - srcs = glob([ - "generated-src/cpp/*.cpp", - "handwritten-src/cpp/*.cpp", - "djinni/vendor/third-party/proto/cpp/*.cc", - ]), + srcs = glob( + [ + "generated-src/cpp/*.cpp", + "handwritten-src/cpp/*.cpp", + "djinni/vendor/third-party/proto/cpp/*.cc", + ], + ), hdrs = glob([ "generated-src/cpp/*.hpp", "handwritten-src/cpp/*.hpp", "djinni/vendor/third-party/proto/cpp/*.h", ]), + copts = [ + "-fexceptions", + ], includes = [ + "djinni/vendor/third-party", "generated-src/cpp", "handwritten-src/cpp", - "djinni/vendor/third-party", - ], - copts = [ - "-fexceptions", ], + linkstatic = True, deps = [ "//support-lib:djinni-support-common", - "@com_google_protobuf//:protobuf" + "@com_google_protobuf//:protobuf", ], - linkstatic = True, alwayslink = 1, ) +cc_library( + name = "djinni-tests-c-lib", + srcs = glob( + [ + "generated-src/c/*.cpp", + "handwritten-src/c/**/*.cpp", + ], + exclude = [ + # "generated-src/c/RecordWithEmbeddedCppProto.cpp", + # "generated-src/c/RecordWithEmbeddedProto.cpp", + # "generated-src/c/record_with_duration_and_derivings.cpp", + # "generated-src/c/nested_outcome.cpp", + # "generated-src/c/proto_tests.cpp", + ], + ), + hdrs = glob([ + "generated-src/c/*.h", + ]), + includes = [ + "generated-src/c", + ], + deps = [ + ":djinni-tests-common", + ], +) + +cc_test( + name = "djinni-tests-c", + linkstatic = 1, + visibility = ["//visibility:public"], + deps = [ + ":djinni-tests-c-lib", + # "@gtest//:gtest_main", + ], +) + cc_library( name = "djinni-tests-jni-static", srcs = glob(["generated-src/jni/*.cpp"]), @@ -53,11 +91,6 @@ cc_binary( objc_library( name = "djinni-tests-objcxx", - copts = [ - "-ObjC++", - "-std=c++17", - "-fcoroutines-ts" - ], srcs = glob([ "generated-src/objc/**/*.mm", "handwritten-src/objc/**/*.mm", @@ -67,6 +100,11 @@ objc_library( "handwritten-src/objc/**/*.h", "djinni/vendor/third-party/proto/objc/*.h", ]), + copts = [ + "-ObjC++", + "-std=c++17", + "-fcoroutines-ts", + ], includes = [ "generated-src/objc", "handwritten-src/objc/impl", @@ -102,15 +140,15 @@ objc_library( objc_library( name = "djinni-tests-objc-proto", - copts = [ - "-fno-objc-arc", - ], srcs = glob([ "djinni/vendor/third-party/proto/objc/*.m", ]), hdrs = glob([ "djinni/vendor/third-party/proto/objc/*.h", ]), + copts = [ + "-fno-objc-arc", + ], deps = [ "@com_google_protobuf//:protobuf_objc", ], @@ -123,35 +161,38 @@ java_test( "handwritten-src/java/**/*.java", "djinni/vendor/third-party/proto/java/**/*.java", ]), + jvm_flags = [ + "-Ddjinni.native_libs_dirs=./test-suite/libdjinni-tests-jni.so", + "-Xcheck:jni", + ], main_class = "com.dropbox.djinni.test.AllTests", use_testrunner = False, runtime_deps = [":libdjinni-tests-jni.so"], deps = [ ":djinni-tests-jni-static", "//support-lib:djinni-support-java", + "@com_google_protobuf//java/core", "@maven_djinni//:com_google_code_findbugs_jsr305", - "@maven_djinni//:junit_junit", "@maven_djinni//:io_reactivex_rxjava2_rxjava", - "@com_google_protobuf//java/core:core", + "@maven_djinni//:junit_junit", ], - jvm_flags = ["-Ddjinni.native_libs_dirs=./test-suite/libdjinni-tests-jni.so", "-Xcheck:jni"], ) -macos_unit_test( - name = "djinni-objc-tests", - minimum_os_version = "10.10", - deps = [ - "djinni-tests-objc", - "djinni-tests-objcxx", - "djinni-tests-objc-proto", - ], -) +# macos_unit_test( +# name = "djinni-objc-tests", +# minimum_os_version = "10.10", +# deps = [ +# "djinni-tests-objc", +# "djinni-tests-objcxx", +# "djinni-tests-objc-proto", +# ], +# ) EMSCRIPTEN_LINKOPTS = [ "--bind", # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript "-s MALLOC=emmalloc", # Switch to using the much smaller implementation "-s MODULARIZE=1", # Allows us to manually invoke the initialization of wasm - "-s WASM_BIGINT=1", # We need to pass int64_t + "-s WASM_BIGINT=1", # We need to pass int64_t ] cc_binary( @@ -178,59 +219,78 @@ wasm_cc_binary( sh_binary( name = "server-ts", srcs = ["handwritten-src/ts/run.sh"], + data = glob([ + "handwritten-src/ts/*.html", + "handwritten-src/ts/*.ts", + "handwritten-src/ts/*.json", + "djinni/vendor/third-party/proto/ts/*.ts", + "node_modules/**", + "generated-src/ts/*.ts", + ]) + [":wasm"], deps = ["//support-lib:djinni-support-ts"], - data = glob(["handwritten-src/ts/*.html", - "handwritten-src/ts/*.ts", - "handwritten-src/ts/*.json", - "djinni/vendor/third-party/proto/ts/*.ts", - "node_modules/**", - "generated-src/ts/*.ts"]) + [":wasm"] ) sh_binary( name = "server-js", srcs = ["handwritten-src/js/run.sh"], - data = glob(["handwritten-src/js/*.html", - "handwritten-src/js/*.js"]) + [":wasm"] + data = glob([ + "handwritten-src/js/*.html", + "handwritten-src/js/*.js", + ]) + [":wasm"], ) swift_helper_files = "handwritten-src/swift/*+Helper.swift" + swift_error_files = "handwritten-src/swift/*+Error.swift" swift_test( name = "djinni-swift-tests", - srcs = glob(['handwritten-src/swift/*.swift'], exclude = [swift_helper_files, swift_error_files]), - deps = [':test-swift-bridge'], - copts = ["-cxx-interoperability-mode=default", "-Xcc", "-std=c++17"], + srcs = glob( + ["handwritten-src/swift/*.swift"], + exclude = [ + swift_helper_files, + swift_error_files, + ], + ), + copts = [ + "-cxx-interoperability-mode=default", + "-Xcc", + "-std=c++17", + ], + deps = [":test-swift-bridge"], ) swift_library( name = "test-swift-bridge", - module_name = "TestSuite", srcs = glob([ "generated-src/swift/*.swift", swift_error_files, - swift_helper_files + swift_helper_files, ]), - copts = ["-cxx-interoperability-mode=default", "-Xcc", "-std=c++17",], + copts = [ + "-cxx-interoperability-mode=default", + "-Xcc", + "-std=c++17", + ], + module_name = "TestSuite", + visibility = ["//visibility:public"], deps = [ ":djinni-tests-common", + ":protobuf-test-swift", ":test-swiftxx", "//support-lib:djinni-support-swift", "//support-lib:djinni-support-swiftxx", - ":protobuf-test-swift" ], - visibility = ["//visibility:public"], ) swift_library( name = "protobuf-test-swift", - module_name = "ProtobufTest", srcs = glob(["djinni/vendor/third-party/proto/swift/*.swift"]), + module_name = "ProtobufTest", + visibility = ["//visibility:public"], deps = [ - "@apple_swift_protobuf//:swift-protobuf" + "@apple_swift_protobuf//:swift-protobuf", ], - visibility = ["//visibility:public"], ) cc_library( @@ -241,16 +301,16 @@ cc_library( hdrs = glob([ "generated-src/swiftxx/*.hpp", ]), + copts = ["-std=c++17"], includes = [ - "generated-src/swiftxx", ".", + "generated-src/swiftxx", ], + tags = ["swift_module=TestSuiteCxx"], + visibility = ["//visibility:public"], deps = [ ":djinni-tests-common", "//support-lib:djinni-support-common", "//support-lib:djinni-support-swiftxx", ], - copts = ["-std=c++17",], - tags = ["swift_module=TestSuiteCxx"], - visibility = ["//visibility:public"], ) diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp new file mode 100644 index 00000000..e69de29b From a4e2c2c624e73af43a01e34d706a2d124ea22cf0 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 11:24:20 -0500 Subject: [PATCH 12/42] starting to write some tests --- support-lib/cpp/djinni_c.h | 38 ++- test-suite/BUILD | 21 +- .../c/tests/DjinniCAPI_tests.cpp | 222 ++++++++++++++++++ 3 files changed, 260 insertions(+), 21 deletions(-) diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index ae6583a2..00ee6d9e 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include typedef void *djinni_ref; @@ -18,7 +18,7 @@ typedef djinni_ref djinni_future_ref; typedef djinni_ref djinni_record_ref; typedef djinni_ref djinni_interface_ref; -typedef void(*djinni_binary_deallocator)(uint8_t *, size_t, void *); +typedef void (*djinni_binary_deallocator)(uint8_t *, size_t, void *); void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); @@ -29,7 +29,9 @@ const char *djinni_string_get_data(djinni_string_ref str); size_t djinni_string_get_length(djinni_string_ref str); -djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, void *opaque, djinni_binary_deallocator deallocator); +djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, + void *opaque, + djinni_binary_deallocator deallocator); djinni_number_ref djinni_number_int64_create(int64_t v); djinni_number_ref djinni_number_uint64_create(uint64_t v); @@ -42,23 +44,37 @@ double djinni_number_get_double(djinni_number_ref number); djinni_keyval_array_ref djinni_keyval_array_create(size_t size); size_t djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array); -djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, size_t index); -djinni_ref djinni_keyval_array_get_value(djinni_keyval_array_ref keyval_array, size_t index); +djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, + size_t index); +djinni_ref djinni_keyval_array_get_value(djinni_keyval_array_ref keyval_array, + size_t index); -void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, size_t index, djinni_ref key, djinni_ref value); +void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, + size_t index, djinni_ref key, + djinni_ref value); djinni_array_ref djinni_array_create(size_t length); size_t djinni_array_get_length(djinni_array_ref array); djinni_ref djinni_array_get_value(djinni_array_ref array, size_t index); -void djinni_array_set_value(djinni_array_ref array, size_t index, djinni_ref value); +void djinni_array_set_value(djinni_array_ref array, size_t index, + djinni_ref value); djinni_date_ref djinni_date_create(uint64_t epoch_time_ms); uint64_t djinni_date_get_epoch(djinni_date_ref date); -#define DJINNI_OPTIONAL_PRIMITIVE(__type__) typedef struct { \ - __type__ value; \ - bool has_value; \ -} djinni_optional_ ## __type__ +#define DJINNI_OPTIONAL_PRIMITIVE(__type__) \ + typedef struct { \ + __type__ value; \ + bool has_value; \ + } djinni_optional_##__type__; \ + \ + inline djinni_optional_##__type__ djinni_optional_##__type__##_make( \ + __type__ value) { \ + return (djinni_optional_##__type__){.value = value, .has_value = true}; \ + } \ + inline djinni_optional_##__type__ djinni_optional_##__type__##_empty() { \ + return (djinni_optional_##__type__){.value = 0, .has_value = false}; \ + } DJINNI_OPTIONAL_PRIMITIVE(bool); DJINNI_OPTIONAL_PRIMITIVE(int8_t); diff --git a/test-suite/BUILD b/test-suite/BUILD index 9aecb98b..c0db0576 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -39,14 +39,6 @@ cc_library( srcs = glob( [ "generated-src/c/*.cpp", - "handwritten-src/c/**/*.cpp", - ], - exclude = [ - # "generated-src/c/RecordWithEmbeddedCppProto.cpp", - # "generated-src/c/RecordWithEmbeddedProto.cpp", - # "generated-src/c/record_with_duration_and_derivings.cpp", - # "generated-src/c/nested_outcome.cpp", - # "generated-src/c/proto_tests.cpp", ], ), hdrs = glob([ @@ -57,16 +49,25 @@ cc_library( ], deps = [ ":djinni-tests-common", - ], + "@gtest", + ] + select({ + "@platforms//os:macos": ["//support-lib:djinni-support-objc"], + }), + linkstatic = 1, ) cc_test( name = "djinni-tests-c", linkstatic = 1, visibility = ["//visibility:public"], + srcs = glob( + [ + "handwritten-src/c/tests/*.cpp", + ], + ), deps = [ ":djinni-tests-c-lib", - # "@gtest//:gtest_main", + "@gtest//:gtest_main", ], ) diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index e69de29b..9f2ab503 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -0,0 +1,222 @@ +#include "assorted_primitives.h" +#include "gtest/gtest.h" + +namespace djinni { + +template struct CRef { + T value; + CRef(T value) : value(value) {} + + ~CRef() { djinni_ref_release(value); } +}; + +TEST(DjinniCAPI, supportsPrimitiveValues) { + auto primitives = CRef(testsuite_assorted_primitives_create( + true, 8, 4242, 3000000, 99999999999, 32.5f, 6482000.5, + djinni_optional_bool_empty(), djinni_optional_int8_t_empty(), + djinni_optional_int16_t_empty(), djinni_optional_int32_t_empty(), + djinni_optional_int64_t_empty(), djinni_optional_float_empty(), + djinni_optional_double_empty())); + + ASSERT_TRUE(testsuite_assorted_primitives_get_b(primitives.value)); + testsuite_assorted_primitives_set_b(primitives.value, false); + ASSERT_FALSE(testsuite_assorted_primitives_get_b(primitives.value)); + + ASSERT_EQ(8, testsuite_assorted_primitives_get_eight(primitives.value)); + testsuite_assorted_primitives_set_eight(primitives.value, 16); + ASSERT_EQ(16, testsuite_assorted_primitives_get_eight(primitives.value)); + + ASSERT_EQ(4242, testsuite_assorted_primitives_get_sixteen(primitives.value)); + testsuite_assorted_primitives_set_sixteen(primitives.value, 4343); + ASSERT_EQ(4343, testsuite_assorted_primitives_get_sixteen(primitives.value)); + + ASSERT_EQ(3000000, + testsuite_assorted_primitives_get_thirtytwo(primitives.value)); + testsuite_assorted_primitives_set_thirtytwo(primitives.value, 6000000); + ASSERT_EQ(6000000, + testsuite_assorted_primitives_get_thirtytwo(primitives.value)); + + ASSERT_EQ(99999999999, + testsuite_assorted_primitives_get_sixtyfour(primitives.value)); + testsuite_assorted_primitives_set_sixtyfour(primitives.value, 999999999990); + ASSERT_EQ(999999999990, + testsuite_assorted_primitives_get_sixtyfour(primitives.value)); + + ASSERT_EQ(32.5f, + testsuite_assorted_primitives_get_fthirtytwo(primitives.value)); + testsuite_assorted_primitives_set_fthirtytwo(primitives.value, 64.5f); + ASSERT_EQ(64.5f, + testsuite_assorted_primitives_get_fthirtytwo(primitives.value)); + + ASSERT_EQ(6482000.5, + testsuite_assorted_primitives_get_fsixtyfour(primitives.value)); + testsuite_assorted_primitives_set_fsixtyfour(primitives.value, 0.00001); + ASSERT_EQ(0.00001, + testsuite_assorted_primitives_get_fsixtyfour(primitives.value)); +} + +TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { + auto primitives = CRef(testsuite_assorted_primitives_create( + false, 0, 0, 0, 0, 0.0f, 0.0, djinni_optional_bool_make(true), + djinni_optional_int8_t_make(8), djinni_optional_int16_t_make(16), + djinni_optional_int32_t_make(4242), djinni_optional_int64_t_make(3000000), + djinni_optional_float_make(32.5f), + djinni_optional_double_make(6482000.5))); + + // Test optional bool + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_b(primitives.value).has_value); + ASSERT_TRUE(testsuite_assorted_primitives_get_o_b(primitives.value).value); + + testsuite_assorted_primitives_set_o_b(primitives.value, + djinni_optional_bool_make(false)); + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_b(primitives.value).has_value); + ASSERT_FALSE(testsuite_assorted_primitives_get_o_b(primitives.value).value); + + testsuite_assorted_primitives_set_o_b(primitives.value, + djinni_optional_bool_empty()); + ASSERT_FALSE( + testsuite_assorted_primitives_get_o_b(primitives.value).has_value); + + // Test optional int8_t + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_eight(primitives.value).has_value); + ASSERT_EQ(8, + testsuite_assorted_primitives_get_o_eight(primitives.value).value); + + testsuite_assorted_primitives_set_o_eight(primitives.value, + djinni_optional_int8_t_make(16)); + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_eight(primitives.value).has_value); + ASSERT_EQ(16, + testsuite_assorted_primitives_get_o_eight(primitives.value).value); + + testsuite_assorted_primitives_set_o_eight(primitives.value, + djinni_optional_int8_t_empty()); + ASSERT_FALSE( + testsuite_assorted_primitives_get_o_eight(primitives.value).has_value); + ASSERT_EQ(0, + testsuite_assorted_primitives_get_o_eight(primitives.value).value); + + // Test optional int16_t + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_sixteen(primitives.value).has_value); + ASSERT_EQ( + 16, testsuite_assorted_primitives_get_o_sixteen(primitives.value).value); + + testsuite_assorted_primitives_set_o_sixteen( + primitives.value, djinni_optional_int16_t_make(4343)); + ASSERT_TRUE( + testsuite_assorted_primitives_get_o_sixteen(primitives.value).has_value); + ASSERT_EQ( + 4343, + testsuite_assorted_primitives_get_o_sixteen(primitives.value).value); + + testsuite_assorted_primitives_set_o_sixteen(primitives.value, + djinni_optional_int16_t_empty()); + ASSERT_FALSE( + testsuite_assorted_primitives_get_o_sixteen(primitives.value).has_value); + + // Test optional int32_t + ASSERT_TRUE(testsuite_assorted_primitives_get_o_thirtytwo(primitives.value) + .has_value); + ASSERT_EQ( + 4242, + testsuite_assorted_primitives_get_o_thirtytwo(primitives.value).value); + + testsuite_assorted_primitives_set_o_thirtytwo( + primitives.value, djinni_optional_int32_t_make(6000000)); + ASSERT_TRUE(testsuite_assorted_primitives_get_o_thirtytwo(primitives.value) + .has_value); + ASSERT_EQ( + 6000000, + testsuite_assorted_primitives_get_o_thirtytwo(primitives.value).value); + + testsuite_assorted_primitives_set_o_thirtytwo( + primitives.value, djinni_optional_int32_t_empty()); + ASSERT_FALSE(testsuite_assorted_primitives_get_o_thirtytwo(primitives.value) + .has_value); + + // Test optional int64_t + ASSERT_TRUE(testsuite_assorted_primitives_get_o_sixtyfour(primitives.value) + .has_value); + ASSERT_EQ( + 3000000, + testsuite_assorted_primitives_get_o_sixtyfour(primitives.value).value); + + testsuite_assorted_primitives_set_o_sixtyfour( + primitives.value, djinni_optional_int64_t_make(999999999990)); + ASSERT_TRUE(testsuite_assorted_primitives_get_o_sixtyfour(primitives.value) + .has_value); + ASSERT_EQ( + 999999999990, + testsuite_assorted_primitives_get_o_sixtyfour(primitives.value).value); + + testsuite_assorted_primitives_set_o_sixtyfour( + primitives.value, djinni_optional_int64_t_empty()); + ASSERT_FALSE(testsuite_assorted_primitives_get_o_sixtyfour(primitives.value) + .has_value); + + // Test optional float + ASSERT_TRUE(testsuite_assorted_primitives_get_o_fthirtytwo(primitives.value) + .has_value); + ASSERT_EQ( + 32.5f, + testsuite_assorted_primitives_get_o_fthirtytwo(primitives.value).value); + + testsuite_assorted_primitives_set_o_fthirtytwo( + primitives.value, djinni_optional_float_make(64.5f)); + ASSERT_TRUE(testsuite_assorted_primitives_get_o_fthirtytwo(primitives.value) + .has_value); + ASSERT_EQ( + 64.5f, + testsuite_assorted_primitives_get_o_fthirtytwo(primitives.value).value); + + testsuite_assorted_primitives_set_o_fthirtytwo(primitives.value, + djinni_optional_float_empty()); + ASSERT_FALSE(testsuite_assorted_primitives_get_o_fthirtytwo(primitives.value) + .has_value); + + // Test optional double + ASSERT_TRUE(testsuite_assorted_primitives_get_o_fsixtyfour(primitives.value) + .has_value); + ASSERT_EQ( + 6482000.5, + testsuite_assorted_primitives_get_o_fsixtyfour(primitives.value).value); + + testsuite_assorted_primitives_set_o_fsixtyfour( + primitives.value, djinni_optional_double_make(0.00001)); + ASSERT_TRUE(testsuite_assorted_primitives_get_o_fsixtyfour(primitives.value) + .has_value); + ASSERT_EQ( + 0.00001, + testsuite_assorted_primitives_get_o_fsixtyfour(primitives.value).value); + + testsuite_assorted_primitives_set_o_fsixtyfour( + primitives.value, djinni_optional_double_empty()); + ASSERT_FALSE(testsuite_assorted_primitives_get_o_fsixtyfour(primitives.value) + .has_value); +} + +TEST(DjinniCAPI, supportsRefCountedValues) {} + +TEST(DjinniCAPI, supportsOptionalRefCountedvalues) {} + +TEST(DjinniCAPI, supportsListOfPrimitiveValues) {} + +TEST(DjinniCAPI, supportsListOfOptionalPrimitiveValues) {} + +TEST(DjinniCAPI, supportsListOfRefCountedValues) {} + +TEST(DjinniCAPI, supportsMap) {} + +TEST(DjinniCAPI, supportsEnum) {} + +TEST(DjinniCAPI, supportsBinaryRef) {} + +TEST(DjinniCAPI, supportsInterface) {} + +TEST(DjinniCAPI, supportsCallingStaticMethodsOnInterface) {} + +} // namespace djinni \ No newline at end of file From 2b3092b6d29aab7f2bf931b8edd80146cc964f4a Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 11:58:17 -0500 Subject: [PATCH 13/42] progress with tests --- src/source/CMarshal.scala | 40 ----- support-lib/cpp/djinni_c.cpp | 8 +- support-lib/cpp/djinni_c_helpers.cpp | 16 +- test-suite/djinni/primitive_list.djinni | 1 + .../c/tests/DjinniCAPI_tests.cpp | 150 +++++++++++++++++- .../handwritten-src/cpp/test_helpers.cpp | 8 +- 6 files changed, 171 insertions(+), 52 deletions(-) delete mode 100644 src/source/CMarshal.scala diff --git a/src/source/CMarshal.scala b/src/source/CMarshal.scala deleted file mode 100644 index 9ffe2abc..00000000 --- a/src/source/CMarshal.scala +++ /dev/null @@ -1,40 +0,0 @@ -package djinni - -import generatorTools.Spec - -import djinni.ast.TypeRef - -class CMarshal(spec: Spec) extends Marshal(spec) { - - override def typename(tm: meta.MExpr): String = { - return fqTypename(tm) - } - - override def fqTypename(tm: meta.MExpr): String = { - throw new RuntimeException("Not implemented") - } - - override def paramType(tm: meta.MExpr): String = { - return fqParamType(tm) - } - - override def fqParamType(tm: meta.MExpr): String = { - throw new RuntimeException("Not implemented") - } - - override def returnType(ret: Option[TypeRef]): String = { - return fqReturnType(ret) - } - - override def fqReturnType(ret: Option[TypeRef]): String = { - throw new RuntimeException("Not implemented") - } - - override def fieldType(tm: meta.MExpr): String = { - throw new RuntimeException("Unapplicable") - } - - override def fqFieldType(tm: meta.MExpr): String = { - throw new RuntimeException("Unapplicable") - } -} diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index 728f6130..b18e2116 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -90,7 +90,13 @@ void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, } djinni_array_ref djinni_array_create(size_t length) { - return toC(ObjectArray::make(length)); + if (length == 0) { + static auto *kEmptyArray = ObjectArray::make(length); + Object::retain(kEmptyArray); + return toC(kEmptyArray); + } else { + return toC(ObjectArray::make(length)); + } } size_t djinni_array_get_length(djinni_array_ref array) { diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp index 8bc7aba4..414718ef 100644 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -2,5 +2,19 @@ namespace djinni::c_api { +djinni_string_ref String::fromCpp(std::string &&str) { + return djinni_string_create(str.c_str(), str.length()); +} -} \ No newline at end of file +djinni_string_ref String::fromCpp(const std::string &str) { + return djinni_string_create(str.c_str(), str.length()); +} + +std::string String::toCpp(djinni_string_ref str) { + const auto *data = djinni_string_get_data(str); + auto length = djinni_string_get_length(str); + + return std::string(data, length); +} + +} // namespace djinni::c_api \ No newline at end of file diff --git a/test-suite/djinni/primitive_list.djinni b/test-suite/djinni/primitive_list.djinni index 60eb384b..327613ea 100644 --- a/test-suite/djinni/primitive_list.djinni +++ b/test-suite/djinni/primitive_list.djinni @@ -1,3 +1,4 @@ primitive_list = record { list: list; + optional_list: optional>>; } diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 9f2ab503..ec5d3835 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -1,4 +1,7 @@ #include "assorted_primitives.h" +#include "client_returned_record.h" +#include "map_record.h" +#include "primitive_list.h" #include "gtest/gtest.h" namespace djinni { @@ -199,17 +202,152 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { .has_value); } -TEST(DjinniCAPI, supportsRefCountedValues) {} +TEST(DjinniCAPI, supportsRefCountedValues) { + auto content = CRef(djinni_string_create("Hello World", 11)); + auto record = + CRef(testsuite_client_returned_record_create(0, content.value, nullptr)); + auto returnedContent = + CRef(testsuite_client_returned_record_get_content(record.value)); + ASSERT_EQ(std::string("Hello World"), + std::string(djinni_string_get_data(returnedContent.value))); +} + +TEST(DjinniCAPI, supportsOptionalRefCountedValues) { + auto content = CRef(djinni_string_create("Hello World", 11)); + auto record = + CRef(testsuite_client_returned_record_create(0, content.value, nullptr)); + auto returnedMisc = + CRef(testsuite_client_returned_record_get_misc(record.value)); + + ASSERT_TRUE(returnedMisc.value == nullptr); + testsuite_client_returned_record_set_misc(record.value, content.value); + + auto returnedMisc2 = + CRef(testsuite_client_returned_record_get_misc(record.value)); + ASSERT_EQ(std::string("Hello World"), + std::string(djinni_string_get_data(returnedMisc2.value))); +} + +TEST(DjinniCAPI, supportsListOfPrimitiveValues) { + auto list = CRef(djinni_array_create(2)); + auto entry1 = CRef(djinni_number_int64_create(42)); + auto entry2 = CRef(djinni_number_int64_create(10000)); + djinni_array_set_value(list.value, 0, entry1.value); + djinni_array_set_value(list.value, 1, entry2.value); + + auto primitiveList = + CRef(testsuite_primitive_list_create(list.value, nullptr)); + + auto returnedList = + CRef(testsuite_primitive_list_get_list(primitiveList.value)); + + auto returnedLength = djinni_array_get_length(returnedList.value); -TEST(DjinniCAPI, supportsOptionalRefCountedvalues) {} + ASSERT_EQ(2, returnedLength); -TEST(DjinniCAPI, supportsListOfPrimitiveValues) {} + auto returnedEntry1 = CRef(djinni_array_get_value(returnedList.value, 0)); + auto returnedEntry2 = CRef(djinni_array_get_value(returnedList.value, 1)); -TEST(DjinniCAPI, supportsListOfOptionalPrimitiveValues) {} + ASSERT_EQ(42, djinni_number_get_int64(returnedEntry1.value)); + ASSERT_EQ(10000, djinni_number_get_int64(returnedEntry2.value)); +} + +TEST(DjinniCAPI, supportsListOfOptionalPrimitiveValues) { + auto emptyList = CRef(djinni_array_create(0)); + auto optionalList = CRef(djinni_array_create(2)); + auto entry2 = CRef(djinni_number_int64_create(10000)); + djinni_array_set_value(optionalList.value, 0, nullptr); + djinni_array_set_value(optionalList.value, 1, entry2.value); + + auto primitiveList = CRef( + testsuite_primitive_list_create(emptyList.value, optionalList.value)); + + auto returnedList = + CRef(testsuite_primitive_list_get_optional_list(primitiveList.value)); + + auto returnedLength = djinni_array_get_length(returnedList.value); -TEST(DjinniCAPI, supportsListOfRefCountedValues) {} + ASSERT_EQ(2, returnedLength); -TEST(DjinniCAPI, supportsMap) {} + auto returnedEntry1 = CRef(djinni_array_get_value(returnedList.value, 0)); + auto returnedEntry2 = CRef(djinni_array_get_value(returnedList.value, 1)); + + ASSERT_TRUE(returnedEntry1.value == nullptr); + ASSERT_EQ(10000, djinni_number_get_int64(returnedEntry2.value)); +} + +TEST(DjinniCAPI, supportsMap) { + auto map = CRef(djinni_keyval_array_create(2)); + auto imap = CRef(djinni_keyval_array_create(1)); + + auto entry1Key = CRef(djinni_string_create("key1", 4)); + auto entry1Value = CRef(djinni_number_int64_create(42)); + auto entry2Key = CRef(djinni_string_create("key2", 4)); + auto entry2Value = CRef(djinni_number_int64_create(1)); + + djinni_keyval_array_set_entry(map.value, 0, entry1Key.value, + entry1Value.value); + djinni_keyval_array_set_entry(map.value, 1, entry2Key.value, + entry2Value.value); + + auto imapEntry1Key = CRef(djinni_number_int64_create(10)); + auto imapEntry1Value = CRef(djinni_number_int64_create(20)); + djinni_keyval_array_set_entry(imap.value, 0, imapEntry1Key.value, + imapEntry1Value.value); + + auto mapRecord = CRef(testsuite_map_record_create(map.value, imap.value)); + + auto collectedMap = CRef(testsuite_map_record_get_map(mapRecord.value)); + auto collectedImap = CRef(testsuite_map_record_get_imap(mapRecord.value)); + + ASSERT_EQ(2, djinni_keyval_array_get_length(collectedMap.value)); + ASSERT_EQ(1, djinni_keyval_array_get_length(collectedImap.value)); + + auto collectedEntry1Key = + CRef(djinni_keyval_array_get_key(collectedMap.value, 0)); + auto collectedEntry1Value = + CRef(djinni_keyval_array_get_value(collectedMap.value, 0)); + auto collectedEntry2Key = + CRef(djinni_keyval_array_get_key(collectedMap.value, 1)); + auto collectedEntry2Value = + CRef(djinni_keyval_array_get_value(collectedMap.value, 1)); + + // Ordering is not guaranteed because the backing store used an + // std::unordered_map. This handles the case where the returned result is in + // the reverse order + if (djinni_number_get_int64(collectedEntry1Value.value) == 1) { + ASSERT_EQ(std::string("key2"), + std::string(djinni_string_get_data(collectedEntry1Key.value), + djinni_string_get_length(collectedEntry1Key.value))); + ASSERT_EQ(1, djinni_number_get_int64(collectedEntry1Value.value)); + + ASSERT_EQ(std::string("key1"), + std::string(djinni_string_get_data(collectedEntry2Key.value), + djinni_string_get_length(collectedEntry2Key.value))); + ASSERT_EQ(42, djinni_number_get_int64(collectedEntry2Value.value)); + } else { + + ASSERT_EQ(std::string("key1"), + std::string(djinni_string_get_data(collectedEntry1Key.value), + djinni_string_get_length(collectedEntry1Key.value))); + + ASSERT_EQ(42, djinni_number_get_int64(collectedEntry1Value.value)); + + ASSERT_EQ(std::string("key2"), + std::string(djinni_string_get_data(collectedEntry2Key.value), + djinni_string_get_length(collectedEntry2Key.value))); + + ASSERT_EQ(1, djinni_number_get_int64(collectedEntry2Value.value)); + } + + auto collectedImapKey = + CRef(djinni_keyval_array_get_key(collectedImap.value, 0)); + auto collectedImapValue = + CRef(djinni_keyval_array_get_value(collectedImap.value, 0)); + + ASSERT_EQ(10, djinni_number_get_int64(collectedImapKey.value)); + ASSERT_EQ(20, djinni_number_get_int64(collectedImapValue.value)); +} TEST(DjinniCAPI, supportsEnum) {} diff --git a/test-suite/handwritten-src/cpp/test_helpers.cpp b/test-suite/handwritten-src/cpp/test_helpers.cpp index a6932efa..b2100ac8 100644 --- a/test-suite/handwritten-src/cpp/test_helpers.cpp +++ b/test-suite/handwritten-src/cpp/test_helpers.cpp @@ -36,7 +36,7 @@ bool TestHelpers::check_set_record(const SetRecord & rec) { return rec.set == std::unordered_set{ "StringA", "StringB", "StringC" }; } -static const PrimitiveList cPrimitiveList { { 1, 2, 3 } }; +static const PrimitiveList cPrimitiveList { { 1, 2, 3 }, {} }; PrimitiveList TestHelpers::get_primitive_list() { return cPrimitiveList; @@ -240,17 +240,17 @@ djinni::Future TestHelpers::check_async_composition(const std::shar auto str2num = [] (djinni::Future s) { return std::stoi(s.get()); }; - + auto f3 = f1.then(str2num); auto f4 = f2.then(str2num); - + std::vector> futures; futures.push_back(i->future_roundtrip(std::move(f3))); futures.push_back(i->future_roundtrip(std::move(f4))); p1.setValue("36"); p2.setValue("36"); - + #ifdef DJINNI_FUTURE_HAS_COROUTINE_SUPPORT co_await djinni::whenAll(futures); co_return std::string("42"); From 18fe78af197fb61295d47e555f22689b32a49793 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 12:35:56 -0500 Subject: [PATCH 14/42] tests passing --- src/source/CTypeResolver.scala | 2 +- support-lib/cpp/djinni_c.cpp | 31 ++++++-- support-lib/cpp/djinni_c.h | 5 ++ support-lib/cpp/djinni_c_helpers.cpp | 75 +++++++++++++++++++ support-lib/cpp/djinni_c_types.cpp | 29 ++++--- support-lib/cpp/djinni_c_types.hpp | 23 ++++-- .../generated-src/cpp/primitive_list.hpp | 11 ++- .../c/tests/DjinniCAPI_tests.cpp | 48 ++++++++++-- 8 files changed, 193 insertions(+), 31 deletions(-) diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 3c3c6046..8f9563e6 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -223,7 +223,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal updatePrivateImports(expr.base) makeTranslator( "djinni_binary_ref", - s"::djinni::c_api::Protobuf<${body.cpp.ns}>" + s"::djinni::c_api::Protobuf<${cppMarshal.fqTypename(expr)}>" ) } case opaque: meta.MOpaque => { diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index b18e2116..0b61ca77 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -28,7 +28,28 @@ size_t djinni_string_get_length(djinni_string_ref str) { djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, void *opaque, djinni_binary_deallocator deallocator) { - return toC(Binary::make(data, length, opaque, deallocator)); + return toC(BinaryWithDeallocator::make(data, length, opaque, deallocator)); +} + +static void djinni_binary_malloc_release(uint8_t *data, size_t length, + void *opaque) { + free(opaque); +} + +djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, + size_t length) { + auto *mutableData = (uint8_t *)malloc(length); + memcpy(mutableData, data, length); + return djinni_binary_create(mutableData, length, mutableData, + &djinni_binary_malloc_release); +} + +uint8_t *djinni_binary_get_data(djinni_binary_ref binary) { + return fromC(binary)->data(); +} + +size_t djinni_binary_get_length(djinni_binary_ref binary) { + return fromC(binary)->length(); } djinni_number_ref djinni_number_int64_create(int64_t v) { @@ -91,11 +112,11 @@ void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, djinni_array_ref djinni_array_create(size_t length) { if (length == 0) { - static auto *kEmptyArray = ObjectArray::make(length); - Object::retain(kEmptyArray); - return toC(kEmptyArray); + static auto *kEmptyArray = ObjectArray::make(length); + Object::retain(kEmptyArray); + return toC(kEmptyArray); } else { - return toC(ObjectArray::make(length)); + return toC(ObjectArray::make(length)); } } diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 00ee6d9e..22c7d986 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -33,6 +33,11 @@ djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, void *opaque, djinni_binary_deallocator deallocator); +djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, size_t length); + +uint8_t *djinni_binary_get_data(djinni_binary_ref binary); +size_t djinni_binary_get_length(djinni_binary_ref binary); + djinni_number_ref djinni_number_int64_create(int64_t v); djinni_number_ref djinni_number_uint64_create(uint64_t v); djinni_number_ref djinni_number_double_create(double v); diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp index 414718ef..99e441b6 100644 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -2,6 +2,49 @@ namespace djinni::c_api { +class BinaryWithDataRef : public ::djinni::Binary { +public: + BinaryWithDataRef(const ::djinni::DataRef &dataRef) + : ::djinni::Binary(dataRef.mutableBuf(), dataRef.len()), + _dataRef(dataRef) {} + + ~BinaryWithDataRef() override = default; + +private: + djinni::DataRef _dataRef; +}; + +class BinaryWithVector : public ::djinni::Binary { +public: + BinaryWithVector(std::vector &&vec) + : ::djinni::Binary(vec.data(), vec.size()), _vec(std::move(vec)) {} + + ~BinaryWithVector() override = default; + +private: + std::vector _vec; +}; + +class DataRefImpl : public ::djinni::DataRef::Impl { +public: + DataRefImpl(djinni_binary_ref binary) : _binary(binary) { + djinni_ref_retain(binary); + } + + ~DataRefImpl() override { djinni_ref_release(_binary); } + + const uint8_t *buf() const override { + return djinni_binary_get_data(_binary); + } + + size_t len() const override { return djinni_binary_get_length(_binary); } + + uint8_t *mutableBuf() override { return djinni_binary_get_data(_binary); } + +private: + djinni_binary_ref _binary; +}; + djinni_string_ref String::fromCpp(std::string &&str) { return djinni_string_create(str.c_str(), str.length()); } @@ -17,4 +60,36 @@ std::string String::toCpp(djinni_string_ref str) { return std::string(data, length); } +::djinni::DataRef DataRef::toCpp(djinni_binary_ref binary) { + return ::djinni::DataRef(std::make_shared(binary)); +} + +djinni_binary_ref DataRef::fromCpp(const ::djinni::DataRef &dataRef) { + Object *obj = new BinaryWithDataRef(dataRef); + return reinterpret_cast(obj); +} + +::djinni::DataView DataView::toCpp(djinni_binary_ref binary) { + return djinni::DataView(djinni_binary_get_data(binary), + djinni_binary_get_length(binary)); +} + +djinni_binary_ref DataView::fromCpp(const ::djinni::DataView &dataRef) { + return djinni_binary_create(dataRef.buf(), dataRef.len(), nullptr, nullptr); +} + +std::vector Binary::toCpp(djinni_binary_ref binary) { + const auto *data = djinni_binary_get_data(binary); + return std::vector(data, data + djinni_binary_get_length(binary)); +} + +djinni_binary_ref Binary::fromCpp(std::vector &&binary) { + Object *obj = new BinaryWithVector(std::move(binary)); + return reinterpret_cast(obj); +} + +djinni_binary_ref Binary::fromCpp(const std::vector &binary) { + return djinni_binary_create_with_bytes_copy(binary.data(), binary.size()); +} + } // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp index 7dfd6da9..25a41571 100644 --- a/support-lib/cpp/djinni_c_types.cpp +++ b/support-lib/cpp/djinni_c_types.cpp @@ -121,24 +121,29 @@ ObjectArray *ObjectArray::make(size_t length) { return output; } -Binary::Binary(uint8_t *data, size_t length, void *opaque, - Binary::Deallocator deallocator) - : _data(data), _length(length), _opaque(opaque), _deallocator(deallocator) { -} +Binary::Binary(uint8_t *data, size_t length) : _data(data), _length(length) {} -Binary::~Binary() { - if (_deallocator) { - _deallocator(_data, _length, _opaque); - } -} +Binary::~Binary() = default; uint8_t *Binary::data() const { return _data; } size_t Binary::length() const { return _length; } -Binary *Binary::make(uint8_t *data, size_t length, void *opaque, - Binary::Deallocator deallocator) { - return new Binary(data, length, opaque, deallocator); +BinaryWithDeallocator::BinaryWithDeallocator( + uint8_t *data, size_t length, void *opaque, + BinaryWithDeallocator::Deallocator deallocator) + : Binary(data, length), _opaque(opaque), _deallocator(deallocator) {} + +BinaryWithDeallocator::~BinaryWithDeallocator() { + if (_deallocator) { + _deallocator(data(), length(), _opaque); + } +} + +BinaryWithDeallocator * +BinaryWithDeallocator::make(uint8_t *data, size_t length, void *opaque, + BinaryWithDeallocator::Deallocator deallocator) { + return new BinaryWithDeallocator(data, length, opaque, deallocator); } Number::Number(Number::Value value, Number::ValueType type) diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 5cdab0a3..c0b59ba5 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -53,22 +53,31 @@ class ObjectArray : public Object { class Binary : public Object { public: - using Deallocator = void (*)(uint8_t *, size_t, void *); - Binary(uint8_t *data, size_t length, void *opaque, - Binary::Deallocator deallocator); + Binary(uint8_t *data, size_t length); ~Binary() override; uint8_t *data() const; size_t length() const; - static Binary *make(uint8_t *data, size_t length, void *opaque, - Binary::Deallocator deallocator); - private: uint8_t *_data; size_t _length; +}; + +class BinaryWithDeallocator : public Binary { +public: + using Deallocator = void (*)(uint8_t *, size_t, void *); + BinaryWithDeallocator(uint8_t *data, size_t length, void *opaque, + BinaryWithDeallocator::Deallocator deallocator); + ~BinaryWithDeallocator() override; + + static BinaryWithDeallocator * + make(uint8_t *data, size_t length, void *opaque, + BinaryWithDeallocator::Deallocator deallocator); + +private: void *_opaque; - Binary::Deallocator _deallocator; + BinaryWithDeallocator::Deallocator _deallocator; }; class Number : public Object { diff --git a/test-suite/generated-src/cpp/primitive_list.hpp b/test-suite/generated-src/cpp/primitive_list.hpp index 0d0248c2..da490ba1 100644 --- a/test-suite/generated-src/cpp/primitive_list.hpp +++ b/test-suite/generated-src/cpp/primitive_list.hpp @@ -3,6 +3,7 @@ #pragma once +#include "../../handwritten-src/cpp/optional.hpp" #include #include #include @@ -11,10 +12,18 @@ namespace testsuite { struct PrimitiveList final { std::vector list; + std::experimental::optional>> optional_list; + + PrimitiveList(std::vector list_, + std::experimental::optional>> optional_list_) + : list(std::move(list_)) + , optional_list(std::move(optional_list_)) + {} //NOLINTNEXTLINE(google-explicit-constructor) PrimitiveList(std::vector list_) - : list(std::move(list_)) + : PrimitiveList(std::move(list_), + std::experimental::nullopt) {} }; diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index ec5d3835..5e2f9803 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -1,5 +1,7 @@ +#include "DataRefTest.h" #include "assorted_primitives.h" #include "client_returned_record.h" +#include "enum_usage_record.h" #include "map_record.h" #include "primitive_list.h" #include "gtest/gtest.h" @@ -326,7 +328,6 @@ TEST(DjinniCAPI, supportsMap) { djinni_string_get_length(collectedEntry2Key.value))); ASSERT_EQ(42, djinni_number_get_int64(collectedEntry2Value.value)); } else { - ASSERT_EQ(std::string("key1"), std::string(djinni_string_get_data(collectedEntry1Key.value), djinni_string_get_length(collectedEntry1Key.value))); @@ -349,12 +350,49 @@ TEST(DjinniCAPI, supportsMap) { ASSERT_EQ(20, djinni_number_get_int64(collectedImapValue.value)); } -TEST(DjinniCAPI, supportsEnum) {} +TEST(DjinniCAPI, supportsEnum) { + auto optionalEnum = CRef(djinni_number_uint64_create(testsuite_color_VIOLET)); + auto list = CRef(djinni_array_create(1)); + auto listEntry = CRef(djinni_number_uint64_create(testsuite_color_ORANGE)); + djinni_array_set_value(list.value, 0, listEntry.value); -TEST(DjinniCAPI, supportsBinaryRef) {} + auto map = CRef(djinni_keyval_array_create(0)); -TEST(DjinniCAPI, supportsInterface) {} + auto record = CRef(testsuite_enum_usage_record_create( + testsuite_color_BLUE, optionalEnum.value, list.value, list.value, + map.value)); + + ASSERT_EQ(testsuite_color_BLUE, + testsuite_enum_usage_record_get_e(record.value)); + + auto returnedOptional = CRef(testsuite_enum_usage_record_get_o(record.value)); + + ASSERT_EQ(testsuite_color_VIOLET, + djinni_number_get_uint64(returnedOptional.value)); + + auto returnedList = CRef(testsuite_enum_usage_record_get_l(record.value)); + + ASSERT_EQ(1, djinni_array_get_length(returnedList.value)); + + auto entry = CRef(djinni_array_get_value(returnedList.value, 0)); -TEST(DjinniCAPI, supportsCallingStaticMethodsOnInterface) {} + ASSERT_EQ(testsuite_color_ORANGE, djinni_number_get_uint64(entry.value)); +} + +TEST(DjinniCAPI, supportsBinaryRef) { + auto ref = CRef(testsuite_DataRefTest_create()); + + auto receivedData = CRef(testsuite_DataRefTest_generateData(ref.value)); + + auto length = djinni_binary_get_length(receivedData.value); + ASSERT_EQ(4, length); + + ASSERT_EQ(0, djinni_binary_get_data(receivedData.value)[0]); + ASSERT_EQ(1, djinni_binary_get_data(receivedData.value)[1]); + ASSERT_EQ(2, djinni_binary_get_data(receivedData.value)[2]); + ASSERT_EQ(3, djinni_binary_get_data(receivedData.value)[3]); +} + +TEST(DjinniCAPI, supportsInterface) {} } // namespace djinni \ No newline at end of file From 106b50753dc1282d5dd03188f924c2d805e271f0 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 12:53:25 -0500 Subject: [PATCH 15/42] nit --- WORKSPACE | 58 ++++++++++++++++++++++++++++++++++-------------- test-suite/BUILD | 1 + 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb090799..71e1d1b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,77 +1,101 @@ -workspace(name="snap_djinni") +workspace(name = "snap_djinni") load("//bzl:deps.bzl", "djinni_deps") + djinni_deps() + load("//bzl:scala_config.bzl", "djinni_scala_config") + djinni_scala_config() + load("//bzl:setup_deps.bzl", "djinni_setup_deps") + djinni_setup_deps() # --- Everything below is only used for examples and tests load("//bzl:android_configure.bzl", "android_configure") + android_configure(name = "local_config_android") + load("@local_config_android//:android_configure.bzl", "android_workspace") + android_workspace() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") build_bazel_rules_apple_version = "1.1.3" + http_archive( name = "build_bazel_rules_apple", sha256 = "f94e6dddf74739ef5cb30f000e13a2a613f6ebfa5e63588305a71fce8a8a9911", - url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz" .format(build_bazel_rules_apple_version), + url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz".format(build_bazel_rules_apple_version), ) build_bazel_rules_swift_version = "1.14.0" + http_archive( name = "build_bazel_rules_swift", sha256 = "9b0064197e3b6c123cf7cbd377ad5071ac020cbd208fcc23dbc9f3928baf4fa2", - url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz" .format(build_bazel_rules_swift_version), + url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz".format(build_bazel_rules_swift_version), ) build_bazel_apple_support_version = "1.15.1" + http_archive( name = "build_bazel_apple_support", sha256 = "c4bb2b7367c484382300aee75be598b92f847896fb31bbd22f3a2346adf66a80", - url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz" .format(build_bazel_apple_support_version), + url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz".format(build_bazel_apple_support_version), ) rules_kotlin_version = "legacy-1.3.0" -http_archive( - name = "io_bazel_rules_kotlin", - url = "https://github.com/bazelbuild/rules_kotlin/archive/{}.zip".format(rules_kotlin_version), - type = "zip", - strip_prefix = "rules_kotlin-{}".format(rules_kotlin_version), - sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde", -) +# http_archive( +# name = "io_bazel_rules_kotlin", +# url = "https://github.com/bazelbuild/rules_kotlin/archive/{}.zip".format(rules_kotlin_version), +# type = "zip", +# strip_prefix = "rules_kotlin-{}".format(rules_kotlin_version), +# sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde", +# ) -load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") +load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") +load("@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies") +# load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") + load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies") -load("@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies",) -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") apple_rules_dependencies() + apple_support_dependencies() + swift_rules_dependencies() + swift_rules_extra_dependencies() -kotlin_repositories() -kt_register_toolchains() +# kotlin_repositories() +# kt_register_toolchains() emsdk_version = "3.1.8" http_archive( name = "emsdk", + sha256 = "7795202a50ab09958d8943f79110de4386ff0f38bf4c97ec1a896885f28fe1cf", strip_prefix = "emsdk-%s/bazel" % emsdk_version, type = "zip", url = "https://github.com/emscripten-core/emsdk/archive/%s.zip" % emsdk_version, - sha256 = "7795202a50ab09958d8943f79110de4386ff0f38bf4c97ec1a896885f28fe1cf", ) load("@emsdk//:deps.bzl", emsdk_deps = "deps") + emsdk_deps() load("@emsdk//:emscripten_deps.bzl", emsdk_emscripten_deps = "emscripten_deps") + emsdk_emscripten_deps() + +http_archive( + name = "gtest", + strip_prefix = "googletest-1.13.0", + url = "https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz", + integrity = "sha256-rX/boR6gEcHZJbMonPSvLGajUuGNTHJkOS/q116Rk2M=", +) diff --git a/test-suite/BUILD b/test-suite/BUILD index c0db0576..1c09aa36 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -179,6 +179,7 @@ java_test( ], ) +# Uncomment before merging. This rule causes issues for me. # macos_unit_test( # name = "djinni-objc-tests", # minimum_os_version = "10.10", From ac9055fcc8f265df8407f36bc1a08394c538eae1 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 15 Aug 2025 14:24:35 -0500 Subject: [PATCH 16/42] more compressive binary ref test --- support-lib/cpp/djinni_c.cpp | 2 +- support-lib/cpp/djinni_c_helpers.cpp | 4 +- .../c/tests/DjinniCAPI_tests.cpp | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index 0b61ca77..2f21b634 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -11,7 +11,7 @@ template static T *fromC(djinni_ref ref) { void djinni_ref_retain(djinni_ref ref) { Object::retain(fromC(ref)); } -void djinni_ref_release(djinni_ref ref) { Object::retain(fromC(ref)); } +void djinni_ref_release(djinni_ref ref) { Object::release(fromC(ref)); } djinni_string_ref djinni_string_create(const char *str, size_t length) { return toC(String::make(str, length)); diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp index 99e441b6..f11ec358 100644 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -31,7 +31,9 @@ class DataRefImpl : public ::djinni::DataRef::Impl { djinni_ref_retain(binary); } - ~DataRefImpl() override { djinni_ref_release(_binary); } + ~DataRefImpl() override { + djinni_ref_release(_binary); + } const uint8_t *buf() const override { return djinni_binary_get_data(_binary); diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 5e2f9803..5c677f93 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -5,6 +5,7 @@ #include "map_record.h" #include "primitive_list.h" #include "gtest/gtest.h" +#include namespace djinni { @@ -379,6 +380,16 @@ TEST(DjinniCAPI, supportsEnum) { ASSERT_EQ(testsuite_color_ORANGE, djinni_number_get_uint64(entry.value)); } +struct DataHolder { + std::vector data; + bool deallocCalled = false; +}; + +static void data_holder_free_callback(uint8_t *data, size_t length, + void *opaque) { + reinterpret_cast(opaque)->deallocCalled = true; +} + TEST(DjinniCAPI, supportsBinaryRef) { auto ref = CRef(testsuite_DataRefTest_create()); @@ -391,6 +402,35 @@ TEST(DjinniCAPI, supportsBinaryRef) { ASSERT_EQ(1, djinni_binary_get_data(receivedData.value)[1]); ASSERT_EQ(2, djinni_binary_get_data(receivedData.value)[2]); ASSERT_EQ(3, djinni_binary_get_data(receivedData.value)[3]); + + auto dataHolder = std::make_unique(); + dataHolder->data.resize(3); + dataHolder->data[0] = 1; + dataHolder->data[1] = 10; + dataHolder->data[2] = 100; + + { + auto input = CRef( + djinni_binary_create(dataHolder->data.data(), dataHolder->data.size(), + dataHolder.get(), &data_holder_free_callback)); + auto received = + CRef(testsuite_DataRefTest_sendDataView(ref.value, input.value)); + + ASSERT_EQ(3, djinni_binary_get_length(received.value)); + ASSERT_EQ(1, djinni_binary_get_data(received.value)[0]); + ASSERT_EQ(10, djinni_binary_get_data(received.value)[1]); + ASSERT_EQ(100, djinni_binary_get_data(received.value)[2]); + + testsuite_DataRefTest_sendData(ref.value, input.value); + } + + ASSERT_FALSE(dataHolder->deallocCalled); + // Create another one and send it.Because it's received as an actual DataRef, + // the C++ will have retained the data ref and then release it to set the new + // one + auto newInput = CRef(djinni_binary_create_with_bytes_copy(nullptr, 0)); + testsuite_DataRefTest_sendData(ref.value, newInput.value); + ASSERT_TRUE(dataHolder->deallocCalled); } TEST(DjinniCAPI, supportsInterface) {} From e11905cd0ce2aa0ef4b7ad23666ad9361a140609 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 18 Aug 2025 13:36:21 -0500 Subject: [PATCH 17/42] progress with proxy support --- src/source/CGenerator.scala | 44 ++++++++-- support-lib/cpp/djinni_c.cpp | 27 +++--- support-lib/cpp/djinni_c.h | 23 ++--- support-lib/cpp/djinni_c_helpers.cpp | 6 +- support-lib/cpp/djinni_c_helpers.hpp | 84 ++++++++++++++----- support-lib/cpp/djinni_c_types.hpp | 12 +++ .../c/tests/DjinniCAPI_tests.cpp | 69 ++++++++------- 7 files changed, 173 insertions(+), 92 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index d7f0734d..0bec7e16 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -11,7 +11,9 @@ class CGenerator(spec: Spec) extends Generator(spec) { private class ResolvedField(val field: Field, val translator: CTypeTranslator) - private class ResolvedMethod(val method: Interface.Method, val parameters: Seq[ResolvedField], val returnType: Option[CTypeTranslator]) + private class ResolvedMethod(val resolvedName: String, val method: Interface.Method, val parameters: Seq[ResolvedField], val returnType: Option[CTypeTranslator]) { + def retTypename: String = if (returnType.isDefined) returnType.get.typename else "void" + } private def resolveSymbolName(name: String): String = { return spec.cNamespace + name @@ -120,7 +122,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(s"""typedef djinni_record_ref ${typeName};""") w.wl - w.w(s"""${typeName} ${prefix}_create(""") + w.w(s"""${typeName} ${prefix}_new(""") writeParamListWithResolvedFields(w, resolvedFields) w.wl(");") @@ -133,7 +135,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl } }, (w: IndentWriter) => { - w.w(s"""${typeName} ${prefix}_create(""") + w.w(s"""${typeName} ${prefix}_new(""") writeParamListWithResolvedFields(w, resolvedFields) w.wl(") ") @@ -170,11 +172,16 @@ class CGenerator(spec: Spec) extends Generator(spec) { }) } + private def isReservedIdentifier(ident: Ident): Boolean = { + return ident.name == "new" || ident.name == "proxy_class_new" + } + override def generateInterface(origin: String, ident: Ident, doc: Doc, typeParams: Seq[TypeParam], i: Interface): Unit = { val selfCpp = cppMarshal.fqTypename(ident, i) val typeResolver = new CTypeResolver(ident, spec, cppMarshal) val resolvedMethods = i.methods.map(m => new ResolvedMethod( + if (isReservedIdentifier(m.ident)) m.ident.name + "_2" else m.ident.name, m, m.params.map(p => new ResolvedField( @@ -188,14 +195,36 @@ class CGenerator(spec: Spec) extends Generator(spec) { val typeName = resolveSymbolTypeName(ident) writeCFilePair(origin, ident, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { + val methodDefsStructName = s"${resolveSymbolTypeName(ident)}_method_defs" + val proxyClassName = s"${typeName}_proxy_class" writeDoc(w, doc) w.wl(s"""typedef djinni_interface_ref ${typeName};""") + w.wl(s"""typedef djinni_proxy_class_ref ${proxyClassName};""") + w.wl + + w.wl(s"""typedef struct """) + w.bracedEnd(s" ${methodDefsStructName};") { + + if (resolvedMethods.isEmpty) { + w.wl("void *reserved[1];") + } else { + for (resolvedMethod <- resolvedMethods) { + w.w(s"""${resolvedMethod.retTypename} (*${resolvedMethod.method.ident.name})(""") + writeDelimited(w, "void *" +: resolvedMethod.parameters.map(p => p.translator.typename), ", ")(s => w.w(s)) + w.wl(");") + } + } + } + w.wl + + w.wl(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs);") w.wl + w.wl(s"${typeName} ${prefix}_new(${proxyClassName} *proxy_class, void *opaque);") + w.wl("") for (resolvedMethod <- resolvedMethods) { writeDoc(w, resolvedMethod.method.doc) - val retTypeName = if (resolvedMethod.returnType.isDefined) resolvedMethod.returnType.get.typename else "void" - w.w(s"${retTypeName} ${prefix}_${resolvedMethod.method.ident.name}(") + w.w(s"${resolvedMethod.retTypename} ${prefix}_${resolvedMethod.resolvedName}(") if (resolvedMethod.method.static) { writeParamList(w, resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) @@ -211,8 +240,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { }, (w: IndentWriter) => { for (resolvedMethod <- resolvedMethods) { writeDoc(w, resolvedMethod.method.doc) - val retTypeName = if (resolvedMethod.returnType.isDefined) resolvedMethod.returnType.get.typename else "void" - w.w(s"${retTypeName} ${prefix}_${resolvedMethod.method.ident.name}(") + w.w(s"${resolvedMethod.retTypename} ${prefix}_${resolvedMethod.resolvedName}(") if (resolvedMethod.method.static) { writeParamList(w, resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) @@ -222,7 +250,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(")") w.braced { - val needsReturnValue = (resolvedMethod.returnType.isDefined && resolvedMethod.returnType.get.typename != "void") + val needsReturnValue = resolvedMethod.retTypename != "void" if (needsReturnValue) { w.w(s"auto retValue = ") diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index 2f21b634..3fed26c3 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -13,7 +13,7 @@ void djinni_ref_retain(djinni_ref ref) { Object::retain(fromC(ref)); } void djinni_ref_release(djinni_ref ref) { Object::release(fromC(ref)); } -djinni_string_ref djinni_string_create(const char *str, size_t length) { +djinni_string_ref djinni_string_new(const char *str, size_t length) { return toC(String::make(str, length)); } @@ -25,9 +25,8 @@ size_t djinni_string_get_length(djinni_string_ref str) { return fromC(str)->length(); } -djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, - void *opaque, - djinni_binary_deallocator deallocator) { +djinni_binary_ref djinni_binary_new(uint8_t *data, size_t length, void *opaque, + djinni_binary_deallocator deallocator) { return toC(BinaryWithDeallocator::make(data, length, opaque, deallocator)); } @@ -40,8 +39,8 @@ djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, size_t length) { auto *mutableData = (uint8_t *)malloc(length); memcpy(mutableData, data, length); - return djinni_binary_create(mutableData, length, mutableData, - &djinni_binary_malloc_release); + return djinni_binary_new(mutableData, length, mutableData, + &djinni_binary_malloc_release); } uint8_t *djinni_binary_get_data(djinni_binary_ref binary) { @@ -49,22 +48,22 @@ uint8_t *djinni_binary_get_data(djinni_binary_ref binary) { } size_t djinni_binary_get_length(djinni_binary_ref binary) { - return fromC(binary)->length(); + return fromC(binary)->length(); } -djinni_number_ref djinni_number_int64_create(int64_t v) { +djinni_number_ref djinni_number_int64_new(int64_t v) { Number::Value value; value.i = v; return toC(Number::make(value, Number::ValueType::SIGNED_INT)); } -djinni_number_ref djinni_number_uint64_create(uint64_t v) { +djinni_number_ref djinni_number_uint64_new(uint64_t v) { Number::Value value; value.u = v; return toC(Number::make(value, Number::ValueType::UNSIGNED_INT)); } -djinni_number_ref djinni_number_double_create(double v) { +djinni_number_ref djinni_number_double_new(double v) { Number::Value value; value.d = v; return toC(Number::make(value, Number::ValueType::DOUBLE)); @@ -82,7 +81,7 @@ double djinni_number_get_double(djinni_number_ref number) { return fromC(number)->toDouble(); } -djinni_keyval_array_ref djinni_keyval_array_create(size_t size) { +djinni_keyval_array_ref djinni_keyval_array_new(size_t size) { auto *array = ObjectArray::make(size << 1); return toC(array); } @@ -110,7 +109,7 @@ void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, array->setObjectAtIndex((index << 1) + 1, fromC(value)); } -djinni_array_ref djinni_array_create(size_t length) { +djinni_array_ref djinni_array_new(size_t length) { if (length == 0) { static auto *kEmptyArray = ObjectArray::make(length); Object::retain(kEmptyArray); @@ -133,8 +132,8 @@ void djinni_array_set_value(djinni_array_ref array, size_t index, fromC(array)->setObjectAtIndex(index, fromC(value)); } -djinni_date_ref djinni_date_create(uint64_t epoch_time_ms) { - return djinni_number_uint64_create(epoch_time_ms); +djinni_date_ref djinni_date_new(uint64_t epoch_time_ms) { + return djinni_number_uint64_new(epoch_time_ms); } uint64_t djinni_date_get_epoch(djinni_date_ref date) { diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 22c7d986..443e83a4 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -17,36 +17,37 @@ typedef djinni_ref djinni_future_ref; typedef djinni_ref djinni_record_ref; typedef djinni_ref djinni_interface_ref; +typedef djinni_ref djinni_proxy_class_ref; typedef void (*djinni_binary_deallocator)(uint8_t *, size_t, void *); void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); -djinni_string_ref djinni_string_create(const char *str, size_t length); +djinni_string_ref djinni_string_new(const char *str, size_t length); const char *djinni_string_get_data(djinni_string_ref str); size_t djinni_string_get_length(djinni_string_ref str); -djinni_binary_ref djinni_binary_create(uint8_t *data, size_t length, - void *opaque, - djinni_binary_deallocator deallocator); +djinni_binary_ref djinni_binary_new(uint8_t *data, size_t length, void *opaque, + djinni_binary_deallocator deallocator); -djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, size_t length); +djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, + size_t length); uint8_t *djinni_binary_get_data(djinni_binary_ref binary); size_t djinni_binary_get_length(djinni_binary_ref binary); -djinni_number_ref djinni_number_int64_create(int64_t v); -djinni_number_ref djinni_number_uint64_create(uint64_t v); -djinni_number_ref djinni_number_double_create(double v); +djinni_number_ref djinni_number_int64_new(int64_t v); +djinni_number_ref djinni_number_uint64_new(uint64_t v); +djinni_number_ref djinni_number_double_new(double v); int64_t djinni_number_get_int64(djinni_number_ref number); uint64_t djinni_number_get_uint64(djinni_number_ref number); double djinni_number_get_double(djinni_number_ref number); -djinni_keyval_array_ref djinni_keyval_array_create(size_t size); +djinni_keyval_array_ref djinni_keyval_array_new(size_t size); size_t djinni_keyval_array_get_length(djinni_keyval_array_ref keyval_array); djinni_ref djinni_keyval_array_get_key(djinni_keyval_array_ref keyval_array, @@ -58,13 +59,13 @@ void djinni_keyval_array_set_entry(djinni_keyval_array_ref keyval_array, size_t index, djinni_ref key, djinni_ref value); -djinni_array_ref djinni_array_create(size_t length); +djinni_array_ref djinni_array_new(size_t length); size_t djinni_array_get_length(djinni_array_ref array); djinni_ref djinni_array_get_value(djinni_array_ref array, size_t index); void djinni_array_set_value(djinni_array_ref array, size_t index, djinni_ref value); -djinni_date_ref djinni_date_create(uint64_t epoch_time_ms); +djinni_date_ref djinni_date_new(uint64_t epoch_time_ms); uint64_t djinni_date_get_epoch(djinni_date_ref date); #define DJINNI_OPTIONAL_PRIMITIVE(__type__) \ diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp index f11ec358..9fafe20c 100644 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -48,11 +48,11 @@ class DataRefImpl : public ::djinni::DataRef::Impl { }; djinni_string_ref String::fromCpp(std::string &&str) { - return djinni_string_create(str.c_str(), str.length()); + return djinni_string_new(str.c_str(), str.length()); } djinni_string_ref String::fromCpp(const std::string &str) { - return djinni_string_create(str.c_str(), str.length()); + return djinni_string_new(str.c_str(), str.length()); } std::string String::toCpp(djinni_string_ref str) { @@ -77,7 +77,7 @@ ::djinni::DataView DataView::toCpp(djinni_binary_ref binary) { } djinni_binary_ref DataView::fromCpp(const ::djinni::DataView &dataRef) { - return djinni_binary_create(dataRef.buf(), dataRef.len(), nullptr, nullptr); + return djinni_binary_new(dataRef.buf(), dataRef.len(), nullptr, nullptr); } std::vector Binary::toCpp(djinni_binary_ref binary) { diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 19840597..7fec8685 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -1,21 +1,59 @@ #pragma once -#include "djinni_c.h" -#include "djinni_c_types.hpp" #include "DataRef.hpp" #include "DataView.hpp" #include "Future.hpp" +#include "djinni_c.h" +#include "djinni_c_types.hpp" #include "expected.hpp" #include +#include #include #include #include #include #include -#include namespace djinni::c_api { +template class Ref { +public: + struct AdoptRef { + }; + + Ref(T ref, AdoptRef adoptRef) + : _ref(ref) { + } + + Ref(T ref) : _ref(ref) { djinni_ref_retain(_ref); } + + ~Ref() { djinni_ref_release(_ref); } + + Ref &operator=(const Ref &other) { + if (other != &this) { + auto old = _ref; + _ref = other._ref; + + djinni_ref_retain(_ref); + djinni_ref_release(old); + } + return *this; + } + + Ref &operator=(Ref &&other) { + if (other != &this) { + auto old = _ref; + _ref = other._ref; + other._ref = nullptr; + + djinni_ref_release(old); + } + return *this; + } +private: + T _ref; +}; + class String { public: static djinni_string_ref fromCpp(std::string &&str); @@ -94,11 +132,11 @@ class Number { } template <> djinni_number_ref fromCpp(float value) { - return djinni_number_double_create(value); + return djinni_number_double_new(value); } template <> djinni_number_ref fromCpp(double value) { - return djinni_number_double_create(value); + return djinni_number_double_new(value); } template <> float toCpp(djinni_number_ref value) { @@ -111,7 +149,7 @@ class Number { private: template static djinni_number_ref fromCppUnsignedInt(T value) { - return djinni_number_uint64_create(static_cast(value)); + return djinni_number_uint64_new(static_cast(value)); } template static T toCppUnsignedInt(djinni_number_ref value) { @@ -119,7 +157,7 @@ class Number { } template static djinni_number_ref fromCppSignedInt(T value) { - return djinni_number_int64_create(static_cast(value)); + return djinni_number_int64_new(static_cast(value)); } template static T toCppSignedInt(djinni_number_ref value) { @@ -201,6 +239,7 @@ class Optional { return convert(ptr); } } + private: }; @@ -223,7 +262,7 @@ template class List { template static djinni_array_ref fromCpp(const std::vector &values, F &&convert) { - djinni_array_ref output = djinni_array_create(values.size()); + djinni_array_ref output = djinni_array_new(values.size()); size_t index = 0; for (const auto &value : values) { @@ -256,7 +295,7 @@ template class Set { template static djinni_array_ref fromCpp(const std::unordered_set &values, F &&convert) { - djinni_array_ref output = djinni_array_create(values.size()); + djinni_array_ref output = djinni_array_new(values.size()); size_t index = 0; for (const auto &value : values) { @@ -293,7 +332,7 @@ template class Map { template static djinni_keyval_array_ref fromCpp(const std::unordered_map &map, F &&convert) { - djinni_keyval_array_ref output = djinni_keyval_array_create(map.size()); + djinni_keyval_array_ref output = djinni_keyval_array_new(map.size()); size_t index = 0; for (const auto &it : map) { auto pair = convert(it.first, it.second); @@ -351,6 +390,14 @@ template class Interface { } }; +template class ProxyClass { +public: + static djinni_interface_ref fromCpp(const T *methodDefs) { + Object *obj = new ProxyClass(*methodDefs); + return reinterpret_cast(obj); + } +}; + template class Enum { public: static Cpp toCpp(C value) { return static_cast(value); } @@ -365,7 +412,6 @@ template class Enum { } }; - class DataRef { public: static ::djinni::DataRef toCpp(djinni_binary_ref binary); @@ -385,34 +431,30 @@ class Binary { static djinni_binary_ref fromCpp(const std::vector &binary); }; -template -class Future { +template class Future { public: static ::djinni::Future toCpp(djinni_future_ref future); static djinni_future_ref fromCpp(::djinni::Future &&future); }; -template -class Outcome { +template class Outcome { public: static ::djinni::expected toCpp(djinni_outcome_ref future); static djinni_outcome_ref fromCpp(::djinni::expected &&outcome); static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome); }; -template -class Duration { +template class Duration { public: static std::chrono::duration toCpp(djinni_number_ref value); - static djinni_number_ref fromCpp(const std::chrono::duration &value); + static djinni_number_ref + fromCpp(const std::chrono::duration &value); }; -template -class Protobuf { +template class Protobuf { public: static T toCpp(djinni_binary_ref binary); static djinni_binary_ref fromCpp(const T &proto); }; - } // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index c0b59ba5..9057a964 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -128,4 +128,16 @@ template class InterfaceHolder : public Object { std::shared_ptr _data; }; +template class ProxyClass : public Object { +public: + ProxyClass(const T &methodDefs) : _methodDefs(methodDefs) {} + ~ProxyClass() override = default; + + const T &methodDefs() const { + return _methodDefs; + } +private: + T _methodDefs; +}; + } // namespace djinni \ No newline at end of file diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 5c677f93..90116d2e 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -17,7 +17,7 @@ template struct CRef { }; TEST(DjinniCAPI, supportsPrimitiveValues) { - auto primitives = CRef(testsuite_assorted_primitives_create( + auto primitives = CRef(testsuite_assorted_primitives_new( true, 8, 4242, 3000000, 99999999999, 32.5f, 6482000.5, djinni_optional_bool_empty(), djinni_optional_int8_t_empty(), djinni_optional_int16_t_empty(), djinni_optional_int32_t_empty(), @@ -62,7 +62,7 @@ TEST(DjinniCAPI, supportsPrimitiveValues) { } TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { - auto primitives = CRef(testsuite_assorted_primitives_create( + auto primitives = CRef(testsuite_assorted_primitives_new( false, 0, 0, 0, 0, 0.0f, 0.0, djinni_optional_bool_make(true), djinni_optional_int8_t_make(8), djinni_optional_int16_t_make(16), djinni_optional_int32_t_make(4242), djinni_optional_int64_t_make(3000000), @@ -206,9 +206,9 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { } TEST(DjinniCAPI, supportsRefCountedValues) { - auto content = CRef(djinni_string_create("Hello World", 11)); + auto content = CRef(djinni_string_new("Hello World", 11)); auto record = - CRef(testsuite_client_returned_record_create(0, content.value, nullptr)); + CRef(testsuite_client_returned_record_new(0, content.value, nullptr)); auto returnedContent = CRef(testsuite_client_returned_record_get_content(record.value)); ASSERT_EQ(std::string("Hello World"), @@ -216,9 +216,9 @@ TEST(DjinniCAPI, supportsRefCountedValues) { } TEST(DjinniCAPI, supportsOptionalRefCountedValues) { - auto content = CRef(djinni_string_create("Hello World", 11)); + auto content = CRef(djinni_string_new("Hello World", 11)); auto record = - CRef(testsuite_client_returned_record_create(0, content.value, nullptr)); + CRef(testsuite_client_returned_record_new(0, content.value, nullptr)); auto returnedMisc = CRef(testsuite_client_returned_record_get_misc(record.value)); @@ -232,14 +232,13 @@ TEST(DjinniCAPI, supportsOptionalRefCountedValues) { } TEST(DjinniCAPI, supportsListOfPrimitiveValues) { - auto list = CRef(djinni_array_create(2)); - auto entry1 = CRef(djinni_number_int64_create(42)); - auto entry2 = CRef(djinni_number_int64_create(10000)); + auto list = CRef(djinni_array_new(2)); + auto entry1 = CRef(djinni_number_int64_new(42)); + auto entry2 = CRef(djinni_number_int64_new(10000)); djinni_array_set_value(list.value, 0, entry1.value); djinni_array_set_value(list.value, 1, entry2.value); - auto primitiveList = - CRef(testsuite_primitive_list_create(list.value, nullptr)); + auto primitiveList = CRef(testsuite_primitive_list_new(list.value, nullptr)); auto returnedList = CRef(testsuite_primitive_list_get_list(primitiveList.value)); @@ -256,14 +255,14 @@ TEST(DjinniCAPI, supportsListOfPrimitiveValues) { } TEST(DjinniCAPI, supportsListOfOptionalPrimitiveValues) { - auto emptyList = CRef(djinni_array_create(0)); - auto optionalList = CRef(djinni_array_create(2)); - auto entry2 = CRef(djinni_number_int64_create(10000)); + auto emptyList = CRef(djinni_array_new(0)); + auto optionalList = CRef(djinni_array_new(2)); + auto entry2 = CRef(djinni_number_int64_new(10000)); djinni_array_set_value(optionalList.value, 0, nullptr); djinni_array_set_value(optionalList.value, 1, entry2.value); - auto primitiveList = CRef( - testsuite_primitive_list_create(emptyList.value, optionalList.value)); + auto primitiveList = + CRef(testsuite_primitive_list_new(emptyList.value, optionalList.value)); auto returnedList = CRef(testsuite_primitive_list_get_optional_list(primitiveList.value)); @@ -280,25 +279,25 @@ TEST(DjinniCAPI, supportsListOfOptionalPrimitiveValues) { } TEST(DjinniCAPI, supportsMap) { - auto map = CRef(djinni_keyval_array_create(2)); - auto imap = CRef(djinni_keyval_array_create(1)); + auto map = CRef(djinni_keyval_array_new(2)); + auto imap = CRef(djinni_keyval_array_new(1)); - auto entry1Key = CRef(djinni_string_create("key1", 4)); - auto entry1Value = CRef(djinni_number_int64_create(42)); - auto entry2Key = CRef(djinni_string_create("key2", 4)); - auto entry2Value = CRef(djinni_number_int64_create(1)); + auto entry1Key = CRef(djinni_string_new("key1", 4)); + auto entry1Value = CRef(djinni_number_int64_new(42)); + auto entry2Key = CRef(djinni_string_new("key2", 4)); + auto entry2Value = CRef(djinni_number_int64_new(1)); djinni_keyval_array_set_entry(map.value, 0, entry1Key.value, entry1Value.value); djinni_keyval_array_set_entry(map.value, 1, entry2Key.value, entry2Value.value); - auto imapEntry1Key = CRef(djinni_number_int64_create(10)); - auto imapEntry1Value = CRef(djinni_number_int64_create(20)); + auto imapEntry1Key = CRef(djinni_number_int64_new(10)); + auto imapEntry1Value = CRef(djinni_number_int64_new(20)); djinni_keyval_array_set_entry(imap.value, 0, imapEntry1Key.value, imapEntry1Value.value); - auto mapRecord = CRef(testsuite_map_record_create(map.value, imap.value)); + auto mapRecord = CRef(testsuite_map_record_new(map.value, imap.value)); auto collectedMap = CRef(testsuite_map_record_get_map(mapRecord.value)); auto collectedImap = CRef(testsuite_map_record_get_imap(mapRecord.value)); @@ -352,16 +351,16 @@ TEST(DjinniCAPI, supportsMap) { } TEST(DjinniCAPI, supportsEnum) { - auto optionalEnum = CRef(djinni_number_uint64_create(testsuite_color_VIOLET)); - auto list = CRef(djinni_array_create(1)); - auto listEntry = CRef(djinni_number_uint64_create(testsuite_color_ORANGE)); + auto optionalEnum = CRef(djinni_number_uint64_new(testsuite_color_VIOLET)); + auto list = CRef(djinni_array_new(1)); + auto listEntry = CRef(djinni_number_uint64_new(testsuite_color_ORANGE)); djinni_array_set_value(list.value, 0, listEntry.value); - auto map = CRef(djinni_keyval_array_create(0)); + auto map = CRef(djinni_keyval_array_new(0)); - auto record = CRef(testsuite_enum_usage_record_create( - testsuite_color_BLUE, optionalEnum.value, list.value, list.value, - map.value)); + auto record = CRef( + testsuite_enum_usage_record_new(testsuite_color_BLUE, optionalEnum.value, + list.value, list.value, map.value)); ASSERT_EQ(testsuite_color_BLUE, testsuite_enum_usage_record_get_e(record.value)); @@ -410,9 +409,9 @@ TEST(DjinniCAPI, supportsBinaryRef) { dataHolder->data[2] = 100; { - auto input = CRef( - djinni_binary_create(dataHolder->data.data(), dataHolder->data.size(), - dataHolder.get(), &data_holder_free_callback)); + auto input = + CRef(djinni_binary_new(dataHolder->data.data(), dataHolder->data.size(), + dataHolder.get(), &data_holder_free_callback)); auto received = CRef(testsuite_DataRefTest_sendDataView(ref.value, input.value)); From db1df866a870c4f06c0ed370cc43f36c5c08d470 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 18 Aug 2025 16:02:50 -0500 Subject: [PATCH 18/42] full proxy impl --- src/source/CGenerator.scala | 100 +++++++++++++++++- src/source/CTypeResolver.scala | 72 +++++++------ support-lib/cpp/djinni_c.h | 1 + support-lib/cpp/djinni_c_helpers.hpp | 53 +++------- support-lib/cpp/djinni_c_types.hpp | 71 ++++++++++++- .../c/tests/DjinniCAPI_tests.cpp | 60 ++++++++++- 6 files changed, 278 insertions(+), 79 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 0bec7e16..2d582d50 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -173,7 +173,81 @@ class CGenerator(spec: Spec) extends Generator(spec) { } private def isReservedIdentifier(ident: Ident): Boolean = { - return ident.name == "new" || ident.name == "proxy_class_new" + ident.name == "new" || ident.name == "proxy_class_new" + } + + private def getConvertedParamName(resolvedField: ResolvedField): String = { + return resolvedField.field.ident.name + "_c" + } + + private def getReturnNameCpp(name: String): String = { + return name + "_cpp" + } + + private def writeProxyClass(w: IndentWriter, ident: Ident, methodDefsStructName: String, resolvedMethods: Seq[ResolvedMethod]): String = { + val baseProxyClassName = "Proxy_Parent" + w.wl(s"using ${baseProxyClassName} = ::djinni::Proxy<${methodDefsStructName}>;") + val cppClassName = spec.cppIdentStyle.ty(ident.name) + val proxyClassName = s"${cppClassName}_Proxy" + val baseClassName = withCppNs(cppClassName) + w.w(s"struct ${proxyClassName}: public ${baseProxyClassName}, public ${baseClassName} ") + w.bracedSemi { + w.wl(s"${proxyClassName}(::djinni::ProxyClass<${methodDefsStructName}> *proxyClass, void *opaque): ${baseProxyClassName}(proxyClass, opaque) {}") + w.wl + w.wl(s"~${proxyClassName}() override = default;") + w.wl + + for (resolvedMethod <- resolvedMethods.filter(m => !m.method.static)) { + val returnType = if (resolvedMethod.retTypename != "void") cppMarshal.fqReturnType(resolvedMethod.method.ret) else "void" + w.w(s"${returnType} ${resolvedMethod.method.ident.name}(") + writeParamList(w, resolvedMethod.method.params.map(p => (cppMarshal.fqParamType(p.ty), p.ident.name))) + w.w(") ") + if (resolvedMethod.method.const) { + w.w("const ") + } + w.w("override") + w.braced { + for (param <- resolvedMethod.parameters) { + val resolvedExpr = cppMarshal.maybeMove(param.field.ident.name, param.field.ty) + w.wl(s"auto ${getConvertedParamName(param)} = ${param.translator.fromCppTranslatorFn(resolvedExpr)};") + } + + val retValueName = "returnValue" + val needsReturnValue = resolvedMethod.retTypename != "void" + if (needsReturnValue) { + w.w(s"auto ${retValueName} = ") + } + + w.w(s"${baseProxyClassName}::getProxyClass().methodDefs().${resolvedMethod.method.ident.name}(${baseProxyClassName}::getOpaque()") + if (resolvedMethod.parameters.nonEmpty) { + w.w(", ") + w.w(resolvedMethod.parameters.map(p => getConvertedParamName(p)).mkString(", ")) + } + w.wl(");") + + for (param <- resolvedMethod.parameters) { + if (param.translator.isRefType) { + w.wl(s"djinni_ref_release(${getConvertedParamName(param)});") + } + } + + if (needsReturnValue) { + w.wl + w.wl(s"auto ${getReturnNameCpp(retValueName)} = ${resolvedMethod.returnType.get.toCppTranslatorFn(retValueName)};") + if (resolvedMethod.returnType.get.isRefType) { + w.wl(s"djinni_ref_release(${retValueName});") + } + w.wl(s"return ${getReturnNameCpp(retValueName)};") + } + + } + + w.wl + } + } + w.wl + + return proxyClassName } override def generateInterface(origin: String, ident: Ident, doc: Doc, typeParams: Seq[TypeParam], i: Interface): Unit = { @@ -194,9 +268,9 @@ class CGenerator(spec: Spec) extends Generator(spec) { val prefix = resolveSymbolName(ident.name) val typeName = resolveSymbolTypeName(ident) + val proxyClassName = s"${resolveSymbolName(ident)}_proxy_class_ref" + val methodDefsStructName = s"${resolveSymbolName(ident)}_method_defs" writeCFilePair(origin, ident, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { - val methodDefsStructName = s"${resolveSymbolTypeName(ident)}_method_defs" - val proxyClassName = s"${typeName}_proxy_class" writeDoc(w, doc) w.wl(s"""typedef djinni_interface_ref ${typeName};""") w.wl(s"""typedef djinni_proxy_class_ref ${proxyClassName};""") @@ -217,9 +291,9 @@ class CGenerator(spec: Spec) extends Generator(spec) { } w.wl - w.wl(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs);") + w.wl(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator);") w.wl - w.wl(s"${typeName} ${prefix}_new(${proxyClassName} *proxy_class, void *opaque);") + w.wl(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque);") w.wl("") for (resolvedMethod <- resolvedMethods) { @@ -238,6 +312,22 @@ class CGenerator(spec: Spec) extends Generator(spec) { } }, (w: IndentWriter) => { + val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) + w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") + w.braced { + w.wl(s"return ::djinni::c_api::ProxyClass<${methodDefsStructName}>::make(method_defs, opaque_deallocator);") + } + w.wl + + w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") + w.braced { + w.wl(s"return ::djinni::c_api::Proxy<${proxyClassNameCpp}, ${methodDefsStructName}>::make(proxy_class, opaque);") + } + w.wl + + + + for (resolvedMethod <- resolvedMethods) { writeDoc(w, resolvedMethod.method.doc) w.w(s"${resolvedMethod.retTypename} ${prefix}_${resolvedMethod.resolvedName}(") diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 8f9563e6..35a6e817 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -1,14 +1,13 @@ package djinni -import generatorTools.{DeclRef, ImportRef, Spec, q} - -import djinni.ast.{Ident, TypeDef, TypeRef} -import djinni.meta.{MExpr, MOptional, MPrimitive, Meta} -import djinni.writer.IndentWriter +import ast.Ident +import generatorTools.{ImportRef, Spec, q} +import meta.{DEnum, MExpr, MPrimitive, Meta} import scala.collection.mutable class CTypeTranslator(val typename: String, + val isRefType: Boolean, val toCppTranslatorFn: (String) => String, val fromCppTranslatorFn: (String) => String) { @@ -34,8 +33,9 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal spec.cNamespace + str + "_ref" } - private def makeTranslator(typename: String, translator: String): CTypeTranslator = { + private def makeTranslator(typename: String, isRefType: Boolean, translator: String): CTypeTranslator = { new CTypeTranslator(typename, + isRefType, (p) => s"${translator}::toCpp(${p})", (p) => s"${translator}::fromCpp(${p})" ) @@ -55,9 +55,9 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def isEnum(expr: MExpr): Boolean = { expr.base match { - case meta.MDef(name, numParams, defType, body) => { + case meta.MDef(_, _, _, body) => { body match { - case ast.Enum(options, flags) => true + case ast.Enum(_, _) => true case _ => false } } @@ -67,6 +67,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def makeNestedTranslator(inner: CTypeTranslator, typename: String, translator: String): CTypeTranslator = { new CTypeTranslator(typename, + true, (p) => { val innerToCpp = inner.toCppTranslatorFn("value") s"${translator}::toCpp(${p}, [](auto value) { return ${innerToCpp}; })" @@ -87,6 +88,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal if (primitive != null && !asBoxed) { val typename = s"djinni_optional_${resolved.typename}" new CTypeTranslator(typename, + false, (p) => s"::djinni::c_api::Optional::toCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.toCppTranslatorFn(p)})", (p) => s"::djinni::c_api::Optional::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" ) @@ -95,6 +97,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val toCppMethodName = if (sharedPtr) "toSharedPtrCpp" else "toCpp" val fromCppMethodName = if (sharedPtr) "fromSharedPtrCpp" else "fromCpp" new CTypeTranslator(resolved.typename, + true, (p) => { val innerToCpp = resolved.toCppTranslatorFn("value") s"::djinni::c_api::Optional::${toCppMethodName}<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerToCpp}; })" @@ -121,6 +124,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val cppTypeValue = cppMarshal.fqTypename(valueExpr) new CTypeTranslator("djinni_keyval_array_ref", + true, (p) => { val innerToCppKey = resolvedKey.toCppTranslatorFn("key") val innerToCppValue = resolvedValue.toCppTranslatorFn("value") @@ -136,19 +140,19 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolvePrimitive(cName: String, asBoxed: Boolean): CTypeTranslator = { if (asBoxed) { - new CTypeTranslator("djinni_number_ref", (p) => { + new CTypeTranslator("djinni_number_ref", true, (p) => { s"::djinni::c_api::Number::toCpp<${cName}>(${p})" }, (p) => { s"::djinni::c_api::Number::fromCpp<${cName}>(${p})" }) } else { - new CTypeTranslator(cName, p => p, p => p) + new CTypeTranslator(cName, false, p => p, p => p) } } private def updatePrivateImports(meta: Meta): Unit = { - for (r <- cppMarshal.hppReferences(meta, ident.name, false)) r match { + for (r <- cppMarshal.hppReferences(meta, ident.name, forwardDeclareOnly = false)) r match { case ImportRef(arg) => privateImports.add("#include " + arg) case _ => } @@ -166,18 +170,20 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val typename = valueTypeName(name) if (asBoxed) { new CTypeTranslator("djinni_number_ref", + true, (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" ) } else { new CTypeTranslator(typename, + false, (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCpp(${p})", (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCpp(${p})" ) } } - private def resolveExtern(expr: MExpr, c: meta.MExtern.C): CTypeTranslator = { + private def resolveExtern(expr: MExpr, defType: meta.DefType, c: meta.MExtern.C): CTypeTranslator = { updatePrivateImports(expr.base) addPublicImport(c.publicHeader) privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) @@ -189,57 +195,63 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal s"${c.translator}<${templateArgs}>" } - makeTranslator(c.typename, resolvedTranslator) + val isRefType = defType match { + case DEnum => false + case _ => true + } + + makeTranslator(c.typename, isRefType, resolvedTranslator) } def resolve(expr: MExpr): CTypeTranslator = { - resolve(expr, false) + resolve(expr, asBoxed = false) } private def resolve(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { expr.base match { - case meta.MParam(name) => { + case meta.MParam(_) => { throw new AssertionError("Unsupported MParam type") } - case meta.MDef(name, numParams, defType, body) => { + case meta.MDef(name, _, _, body) => { updatePrivateImports(expr.base) addPublicImportFromDef(name) val cppTypename = cppMarshal.fqTypename(name, body) body match { - case ast.Enum(options, flags) => resolveEnum(name, cppTypename, asBoxed) - case ast.Record(ext, fields, consts, derivingTypes) => makeTranslator( + case ast.Enum(_, _) => resolveEnum(name, cppTypename, asBoxed) + case ast.Record(_, _, _, _) => makeTranslator( ptrTypeName(name), + isRefType = true, s"::djinni::c_api::Record<${cppTypename}>" ) - case ast.Interface(ext, methods, consts) => makeTranslator( + case ast.Interface(_, _, _) => makeTranslator( ptrTypeName(name), + isRefType = true, s"::djinni::c_api::Interface<${cppTypename}>" ) - case ast.ProtobufMessage(cpp, java, objc, ts, swift) => throw new AssertionError("Unsupported") + case ast.ProtobufMessage(_, _, _, _, _) => throw new AssertionError("Unsupported") } } - case meta.MExtern(name, numParams, defType, body, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, c) - case meta.MProtobuf(name, numParams, body) => { + case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, defType, c) + case meta.MProtobuf(_, _, _) => updatePrivateImports(expr.base) makeTranslator( "djinni_binary_ref", + isRefType = true, s"::djinni::c_api::Protobuf<${cppMarshal.fqTypename(expr)}>" ) - } - case opaque: meta.MOpaque => { + case opaque: meta.MOpaque => opaque match { - case meta.MPrimitive(_idlName, jName, jniName, cName, jBoxed, jSig, objcName, objcBoxed) => resolvePrimitive(cName, asBoxed) - case meta.MString => makeTranslator("djinni_string_ref", "::djinni::c_api::String") - case meta.MDate => makeTranslator("djinni_date_ref", "::djinni::c_api::Date") - case meta.MBinary => makeTranslator("djinni_binary_ref", "::djinni::c_api::Binary") + case meta.MPrimitive(_, _, _, cName, _, _, _, _) => resolvePrimitive(cName, asBoxed) + case meta.MString => makeTranslator("djinni_string_ref", isRefType = true, "::djinni::c_api::String") + case meta.MDate => makeTranslator("djinni_date_ref", isRefType = true, "::djinni::c_api::Date") + case meta.MBinary => makeTranslator("djinni_binary_ref", isRefType = true, "::djinni::c_api::Binary") case meta.MOptional => resolveOptional(expr.args.head, asBoxed, expr) case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::List") case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::Set") case meta.MMap => resolveMap(expr.args.head, expr.args(1)) case meta.MArray => resolveListLike(expr.args.head, "::djinni::c_api::List") - case meta.MVoid => new CTypeTranslator("void", p => p, p => p) + case meta.MVoid => new CTypeTranslator("void", false, p => p, p => p) } - } } } diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 443e83a4..fef8ddb1 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -20,6 +20,7 @@ typedef djinni_ref djinni_interface_ref; typedef djinni_ref djinni_proxy_class_ref; typedef void (*djinni_binary_deallocator)(uint8_t *, size_t, void *); +typedef void (*djinni_opaque_deallocator)(void *); void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 7fec8685..46cb6009 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -16,44 +16,6 @@ namespace djinni::c_api { -template class Ref { -public: - struct AdoptRef { - }; - - Ref(T ref, AdoptRef adoptRef) - : _ref(ref) { - } - - Ref(T ref) : _ref(ref) { djinni_ref_retain(_ref); } - - ~Ref() { djinni_ref_release(_ref); } - - Ref &operator=(const Ref &other) { - if (other != &this) { - auto old = _ref; - _ref = other._ref; - - djinni_ref_retain(_ref); - djinni_ref_release(old); - } - return *this; - } - - Ref &operator=(Ref &&other) { - if (other != &this) { - auto old = _ref; - _ref = other._ref; - other._ref = nullptr; - - djinni_ref_release(old); - } - return *this; - } -private: - T _ref; -}; - class String { public: static djinni_string_ref fromCpp(std::string &&str); @@ -392,12 +354,23 @@ template class Interface { template class ProxyClass { public: - static djinni_interface_ref fromCpp(const T *methodDefs) { - Object *obj = new ProxyClass(*methodDefs); + static djinni_proxy_class_ref + make(const T *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { + Object *obj = new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); return reinterpret_cast(obj); } }; +template class Proxy { +public: +static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, void *opaque) { + auto *proxyClass = static_cast<::djinni::ProxyClass *>(reinterpret_cast(proxyClassRef)); + + return ::djinni::c_api::Interface::fromCpp(std::make_shared(proxyClass, opaque)); +} + +}; + template class Enum { public: static Cpp toCpp(C value) { return static_cast(value); } diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 9057a964..1d1fb954 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -130,14 +130,79 @@ template class InterfaceHolder : public Object { template class ProxyClass : public Object { public: - ProxyClass(const T &methodDefs) : _methodDefs(methodDefs) {} + using OpaqueDeallocator = void (*)(void *); + ProxyClass(const T &methodDefs, OpaqueDeallocator opaqueDeallocator) + : _methodDefs(methodDefs), _opaqueDeallocator(opaqueDeallocator) {} ~ProxyClass() override = default; - const T &methodDefs() const { - return _methodDefs; + const T &methodDefs() const { return _methodDefs; } + const OpaqueDeallocator &getOpaqueDeallocator() const { + return _opaqueDeallocator; } + private: T _methodDefs; + OpaqueDeallocator _opaqueDeallocator; +}; + +template class Proxy { +public: + Proxy(ProxyClass *proxyClass, void *opaque) + : _proxyClass(proxyClass), _opaque(opaque) { + Object::retain(_proxyClass); + } + + ~Proxy() { + if (_proxyClass->getOpaqueDeallocator() != nullptr) { + _proxyClass->getOpaqueDeallocator()(_opaque); + } + + Object::release(_proxyClass); + } + + const ProxyClass &getProxyClass() const { return *_proxyClass; } + + void *getOpaque() const { return _opaque; } + +private: + ProxyClass *_proxyClass; + void *_opaque; +}; + +template class Ref { +public: + struct AdoptRef {}; + + Ref(T ref, AdoptRef adoptRef) : _ref(ref) {} + + Ref(T ref) : _ref(ref) { Object::retain(_ref); } + + ~Ref() { Object::release(_ref); } + + Ref &operator=(const Ref &other) { + if (other != &this) { + auto old = _ref; + _ref = other._ref; + + Object::retain(_ref); + Object::release(old); + } + return *this; + } + + Ref &operator=(Ref &&other) { + if (other != &this) { + auto old = _ref; + _ref = other._ref; + other._ref = nullptr; + + Object::release(old); + } + return *this; + } + +private: + T _ref; }; } // namespace djinni \ No newline at end of file diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 90116d2e..bc2b62b2 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -1,9 +1,11 @@ #include "DataRefTest.h" #include "assorted_primitives.h" +#include "client_interface.h" #include "client_returned_record.h" #include "enum_usage_record.h" #include "map_record.h" #include "primitive_list.h" +#include "test_helpers.h" #include "gtest/gtest.h" #include @@ -432,6 +434,62 @@ TEST(DjinniCAPI, supportsBinaryRef) { ASSERT_TRUE(dataHolder->deallocCalled); } -TEST(DjinniCAPI, supportsInterface) {} +static testsuite_client_returned_record_ref getRecord(void *opaque, + int64_t recordId, + djinni_string_ref content, + djinni_string_ref misc) { + return testsuite_client_returned_record_new(recordId, content, misc); +} + +TEST(DjinniCAPI, supportsInterface) { + testsuite_client_interface_method_defs methodDefs = {0}; + methodDefs.get_record = &getRecord; + + auto proxyClass = + CRef(testsuite_client_interface_proxy_class_new(&methodDefs, nullptr)); + auto proxy = CRef(testsuite_client_interface_new(proxyClass.value, nullptr)); + + auto content = CRef(djinni_string_new("Hello World", 11)); + + auto record = CRef(testsuite_client_interface_get_record( + proxy.value, 42, content.value, nullptr)); + + ASSERT_EQ(42, testsuite_client_returned_record_get_record_id(record.value)); + auto recordContent = + CRef(testsuite_client_returned_record_get_content(record.value)); + ASSERT_EQ(std::string("Hello World"), + std::string(djinni_string_get_data(recordContent.value), + djinni_string_get_length(recordContent.value))); + + // // Should also work when passed to an interface taking C++ + // testsuite_test_helpers_check_client_interface_ascii(proxy.value); + // testsuite_test_helpers_check_client_interface_nonascii(proxy.value); +} + +static void opaqueDeallocator(void *opaque) { + ++(*reinterpret_cast(opaque)); +} + +TEST(DjinniCAPI, interfaceDeallocatesOpaque) { + int deallocateCount = 0; + testsuite_client_interface_method_defs methodDefs = {0}; + + auto proxyClass = testsuite_client_interface_proxy_class_new( + &methodDefs, &opaqueDeallocator); + auto proxy1 = testsuite_client_interface_new(proxyClass, &deallocateCount); + auto proxy2 = testsuite_client_interface_new(proxyClass, &deallocateCount); + + djinni_ref_release(proxyClass); + + ASSERT_EQ(0, deallocateCount); + + djinni_ref_release(proxy1); + + ASSERT_EQ(1, deallocateCount); + + djinni_ref_release(proxy2); + + ASSERT_EQ(2, deallocateCount); +} } // namespace djinni \ No newline at end of file From a7ec00ac5331a37e0c9bc44cff59f6a140e9878e Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 18 Aug 2025 16:28:44 -0500 Subject: [PATCH 19/42] mostly dummy impl for future --- support-lib/cpp/djinni_c_helpers.hpp | 44 +++++++++++++++---- .../c/tests/DjinniCAPI_tests.cpp | 6 +-- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 46cb6009..59af1cff 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -14,6 +14,19 @@ #include #include +namespace djinni { +template class FutureHolder : public Object { +public: + FutureHolder(Future future) : _future(std::move(future)) {} + ~FutureHolder() override = default; + + Future &getFuture() { return _future; } + +private: + Future _future; +}; +} // namespace djinni + namespace djinni::c_api { class String { @@ -361,14 +374,16 @@ template class ProxyClass { } }; -template class Proxy { +template class Proxy { public: -static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, void *opaque) { - auto *proxyClass = static_cast<::djinni::ProxyClass *>(reinterpret_cast(proxyClassRef)); - - return ::djinni::c_api::Interface::fromCpp(std::make_shared(proxyClass, opaque)); -} + static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, + void *opaque) { + auto *proxyClass = static_cast<::djinni::ProxyClass *>( + reinterpret_cast(proxyClassRef)); + return ::djinni::c_api::Interface::fromCpp( + std::make_shared(proxyClass, opaque)); + } }; template class Enum { @@ -406,8 +421,21 @@ class Binary { template class Future { public: - static ::djinni::Future toCpp(djinni_future_ref future); - static djinni_future_ref fromCpp(::djinni::Future &&future); + static ::djinni::Future toCpp(djinni_future_ref future) { + auto *futureHolder = static_cast<::djinni::FutureHolder *>( + reinterpret_cast(future)); + + // Any way to make this better? + + return futureHolder->getFuture().then( + [](::djinni::Future value) { return value.get(); }); + } + + static djinni_future_ref fromCpp(::djinni::Future &&future) { + Object *futureHolder = new ::djinni::FutureHolder(std::move(future)); + + return reinterpret_cast(futureHolder); + } }; template class Outcome { diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index bc2b62b2..763fb167 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -461,9 +461,9 @@ TEST(DjinniCAPI, supportsInterface) { std::string(djinni_string_get_data(recordContent.value), djinni_string_get_length(recordContent.value))); - // // Should also work when passed to an interface taking C++ - // testsuite_test_helpers_check_client_interface_ascii(proxy.value); - // testsuite_test_helpers_check_client_interface_nonascii(proxy.value); + // Should also work when passed to an interface taking C++ + testsuite_test_helpers_check_client_interface_ascii(proxy.value); + testsuite_test_helpers_check_client_interface_nonascii(proxy.value); } static void opaqueDeallocator(void *opaque) { From 0c0c0e2e3a918a269b256e6c036eb1f3136535e2 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 18 Aug 2025 16:49:22 -0500 Subject: [PATCH 20/42] protobuf support --- support-lib/cpp/djinni_c.cpp | 19 ++++++--- support-lib/cpp/djinni_c.h | 11 +++-- support-lib/cpp/djinni_c_helpers.cpp | 4 +- support-lib/cpp/djinni_c_helpers.hpp | 31 +++++++++++--- .../c/tests/DjinniCAPI_tests.cpp | 41 ++++++++++++++++--- 5 files changed, 84 insertions(+), 22 deletions(-) diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index 3fed26c3..28d5e3ae 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -25,8 +25,9 @@ size_t djinni_string_get_length(djinni_string_ref str) { return fromC(str)->length(); } -djinni_binary_ref djinni_binary_new(uint8_t *data, size_t length, void *opaque, - djinni_binary_deallocator deallocator) { +djinni_binary_ref +djinni_binary_new_with_bytes(uint8_t *data, size_t length, void *opaque, + djinni_binary_deallocator deallocator) { return toC(BinaryWithDeallocator::make(data, length, opaque, deallocator)); } @@ -35,12 +36,18 @@ static void djinni_binary_malloc_release(uint8_t *data, size_t length, free(opaque); } -djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, - size_t length) { +djinni_binary_ref djinni_binary_new_with_bytes_copy(const uint8_t *data, + size_t length) { auto *mutableData = (uint8_t *)malloc(length); memcpy(mutableData, data, length); - return djinni_binary_new(mutableData, length, mutableData, - &djinni_binary_malloc_release); + return djinni_binary_new_with_bytes(mutableData, length, mutableData, + &djinni_binary_malloc_release); +} + +djinni_binary_ref djinni_binary_new(size_t length) { + auto *mutableData = (uint8_t *)malloc(length); + return djinni_binary_new_with_bytes(mutableData, length, mutableData, + &djinni_binary_malloc_release); } uint8_t *djinni_binary_get_data(djinni_binary_ref binary) { diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index fef8ddb1..32071c61 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -31,11 +31,14 @@ const char *djinni_string_get_data(djinni_string_ref str); size_t djinni_string_get_length(djinni_string_ref str); -djinni_binary_ref djinni_binary_new(uint8_t *data, size_t length, void *opaque, - djinni_binary_deallocator deallocator); +djinni_binary_ref djinni_binary_new(size_t length); -djinni_binary_ref djinni_binary_create_with_bytes_copy(const uint8_t *data, - size_t length); +djinni_binary_ref +djinni_binary_new_with_bytes(uint8_t *data, size_t length, void *opaque, + djinni_binary_deallocator deallocator); + +djinni_binary_ref djinni_binary_new_with_bytes_copy(const uint8_t *data, + size_t length); uint8_t *djinni_binary_get_data(djinni_binary_ref binary); size_t djinni_binary_get_length(djinni_binary_ref binary); diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp index 9fafe20c..a06d7520 100644 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ b/support-lib/cpp/djinni_c_helpers.cpp @@ -77,7 +77,7 @@ ::djinni::DataView DataView::toCpp(djinni_binary_ref binary) { } djinni_binary_ref DataView::fromCpp(const ::djinni::DataView &dataRef) { - return djinni_binary_new(dataRef.buf(), dataRef.len(), nullptr, nullptr); + return djinni_binary_new_with_bytes(dataRef.buf(), dataRef.len(), nullptr, nullptr); } std::vector Binary::toCpp(djinni_binary_ref binary) { @@ -91,7 +91,7 @@ djinni_binary_ref Binary::fromCpp(std::vector &&binary) { } djinni_binary_ref Binary::fromCpp(const std::vector &binary) { - return djinni_binary_create_with_bytes_copy(binary.data(), binary.size()); + return djinni_binary_new_with_bytes_copy(binary.data(), binary.size()); } } // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 59af1cff..64973444 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -440,9 +440,17 @@ template class Future { template class Outcome { public: - static ::djinni::expected toCpp(djinni_outcome_ref future); - static djinni_outcome_ref fromCpp(::djinni::expected &&outcome); - static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome); + static ::djinni::expected toCpp(djinni_outcome_ref future) { + std::abort(); + } + + static djinni_outcome_ref fromCpp(::djinni::expected &&outcome) { + std::abort(); + } + + static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome) { + std::abort(); + } }; template class Duration { @@ -454,8 +462,21 @@ template class Duration { template class Protobuf { public: - static T toCpp(djinni_binary_ref binary); - static djinni_binary_ref fromCpp(const T &proto); + static T toCpp(djinni_binary_ref binary) { + T output; + output.ParseFromArray(djinni_binary_get_data(binary), + djinni_binary_get_length(binary)); + return output; + } + + static djinni_binary_ref fromCpp(const T &proto) { + auto length = proto.ByteSizeLong(); + auto output = djinni_binary_new(static_cast(length)); + + proto.SerializeToArray(djinni_binary_get_data(output), length); + + return output; + } }; } // namespace djinni::c_api \ No newline at end of file diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 763fb167..c480b51b 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -5,6 +5,8 @@ #include "enum_usage_record.h" #include "map_record.h" #include "primitive_list.h" +#include "proto/cpp/test.pb.h" +#include "proto_tests.h" #include "test_helpers.h" #include "gtest/gtest.h" #include @@ -412,7 +414,7 @@ TEST(DjinniCAPI, supportsBinaryRef) { { auto input = - CRef(djinni_binary_new(dataHolder->data.data(), dataHolder->data.size(), + CRef(djinni_binary_new_with_bytes(dataHolder->data.data(), dataHolder->data.size(), dataHolder.get(), &data_holder_free_callback)); auto received = CRef(testsuite_DataRefTest_sendDataView(ref.value, input.value)); @@ -429,7 +431,7 @@ TEST(DjinniCAPI, supportsBinaryRef) { // Create another one and send it.Because it's received as an actual DataRef, // the C++ will have retained the data ref and then release it to set the new // one - auto newInput = CRef(djinni_binary_create_with_bytes_copy(nullptr, 0)); + auto newInput = CRef(djinni_binary_new_with_bytes_copy(nullptr, 0)); testsuite_DataRefTest_sendData(ref.value, newInput.value); ASSERT_TRUE(dataHolder->deallocCalled); } @@ -461,9 +463,9 @@ TEST(DjinniCAPI, supportsInterface) { std::string(djinni_string_get_data(recordContent.value), djinni_string_get_length(recordContent.value))); - // Should also work when passed to an interface taking C++ - testsuite_test_helpers_check_client_interface_ascii(proxy.value); - testsuite_test_helpers_check_client_interface_nonascii(proxy.value); + // Should also work when passed to an interface taking C++ + testsuite_test_helpers_check_client_interface_ascii(proxy.value); + testsuite_test_helpers_check_client_interface_nonascii(proxy.value); } static void opaqueDeallocator(void *opaque) { @@ -492,4 +494,33 @@ TEST(DjinniCAPI, interfaceDeallocatesOpaque) { ASSERT_EQ(2, deallocateCount); } +TEST(DjinniCAPI, supportsProto) { + ::djinni::test::AddressBook x; + auto *p1 = x.add_people(); + p1->set_id(1); + p1->set_name("Hello"); + auto *p2 = x.add_people(); + p2->set_id(2); + p2->set_name("World"); + + std::string pb; + x.SerializeToString(&pb); + + auto pbBytes = CRef(djinni_binary_new_with_bytes_copy( + reinterpret_cast(pb.data()), pb.size())); + + auto vec = CRef(testsuite_proto_tests_protoToStrings(pbBytes.value)); + + ASSERT_EQ(2, djinni_array_get_length(vec.value)); + + auto retrievedName1 = CRef(djinni_array_get_value(vec.value, 0)); + auto retrievedName2 = CRef(djinni_array_get_value(vec.value, 1)); + + ASSERT_EQ(std::string("Hello"), + std::string(djinni_string_get_data(retrievedName1.value))); + + ASSERT_EQ(std::string("World"), + std::string(djinni_string_get_data(retrievedName2.value))); +} + } // namespace djinni \ No newline at end of file From 5254cbd9933d8a6e6c951f2f49c23869ca169146 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Tue, 19 Aug 2025 14:13:28 -0500 Subject: [PATCH 21/42] clean up --- .bazelrc | 2 +- .bazelversion | 2 +- WORKSPACE | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.bazelrc b/.bazelrc index 8b9d0d7d..3ee13222 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1 @@ -build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder --nouse_workers_with_dexbuilder +build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder diff --git a/.bazelversion b/.bazelversion index ade65226..468c41f9 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -5.4.1 +7.2.1 \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE index 71e1d1b9..acbf834f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -49,18 +49,18 @@ http_archive( ) rules_kotlin_version = "legacy-1.3.0" -# http_archive( -# name = "io_bazel_rules_kotlin", -# url = "https://github.com/bazelbuild/rules_kotlin/archive/{}.zip".format(rules_kotlin_version), -# type = "zip", -# strip_prefix = "rules_kotlin-{}".format(rules_kotlin_version), -# sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde", -# ) +http_archive( + name = "io_bazel_rules_kotlin", + url = "https://github.com/bazelbuild/rules_kotlin/archive/{}.zip".format(rules_kotlin_version), + type = "zip", + strip_prefix = "rules_kotlin-{}".format(rules_kotlin_version), + sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde", +) load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") load("@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies") -# load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies") @@ -72,8 +72,8 @@ swift_rules_dependencies() swift_rules_extra_dependencies() -# kotlin_repositories() -# kt_register_toolchains() +kotlin_repositories() +kt_register_toolchains() emsdk_version = "3.1.8" From 2ffaf59e21f0426c148555f547eab52b98c01d49 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Tue, 19 Aug 2025 17:03:38 -0500 Subject: [PATCH 22/42] many fixes --- src/source/CGenerator.scala | 35 ++++++++++++++++++---- src/source/CTypeResolver.scala | 43 ++++++++++++++++------------ src/source/Main.scala | 7 ++++- src/source/YamlGenerator.scala | 13 +++++++++ src/source/generator.scala | 2 ++ support-lib/cpp/djinni_c.h | 10 +++++-- support-lib/cpp/djinni_c_helpers.hpp | 5 +++- support-lib/dataref.yaml | 2 +- support-lib/dataview.yaml | 2 +- support-lib/future.yaml | 2 +- support-lib/outcome.yaml | 2 +- 11 files changed, 91 insertions(+), 32 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 2d582d50..f958ea7a 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -2,7 +2,7 @@ package djinni import generatorTools.{Spec, q} -import djinni.ast.{Doc, Field, Ident, Interface, ProtobufMessage, TypeParam, TypeRef} +import djinni.ast.{Doc, Field, Ident, Interface, ProtobufMessage, Record, TypeDecl, TypeParam, TypeRef} import djinni.writer.IndentWriter class CGenerator(spec: Spec) extends Generator(spec) { @@ -19,10 +19,30 @@ class CGenerator(spec: Spec) extends Generator(spec) { return spec.cNamespace + name } - private def resolveSymbolTypeName(ident: Ident): String = { + private def resolveRefSymbolTypeName(ident: Ident): String = { resolveSymbolName(ident.name) + "_ref" } + def typename(t: TypeDecl): String = { + t.body match { + case ast.Enum(_, _) => resolveSymbolName(t.ident.name) + case Record(_, _, _, _) => resolveRefSymbolTypeName(t.ident) + case Interface(_, _, _) => resolveRefSymbolTypeName(t.ident) + case ProtobufMessage(_, _, _, _, _) => "djinni_binary_ref" + } + } + + def helperName(t: TypeDecl): String = { + val typeResolver = new CTypeResolver(t.ident, spec, cppMarshal) + typeResolver.getTranslatorNameForType(t.ident.name, t.body) + } + + def publicHeader(t: TypeDecl): String = publicHeader(t.ident) + + def publicHeader(ident: Ident): String = q(spec.cIncludePrefix + ident.name + ".h") + + def privateHeader(t: TypeDecl): String = q(spec.cppIncludePrefix + spec.cppFileIdentStyle(t.ident.name) + "." + spec.cppHeaderExt) + private def writeExternCBegin(w: IndentWriter): Unit = { w.wl("#ifdef __cplusplus") w.wl("extern \"C\" {") @@ -36,7 +56,8 @@ class CGenerator(spec: Spec) extends Generator(spec) { } private def writeCFile(origin: String, ident: Ident, ext: String, f: IndentWriter => Unit): Unit = { - createFile(spec.cOutFolder.get, ident.name + "." + ext, (w: IndentWriter) => { + val targetDir = if (ext == "h") spec.cHeaderOutFolder else spec.cOutFolder + createFile(targetDir.get, ident.name + "." + ext, (w: IndentWriter) => { w.wl("// AUTOGENERATED FILE - DO NOT MODIFY!") w.wl("// This file was generated by Djinni from " + origin) w.wl @@ -53,6 +74,8 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl("#include " + q(spec.cBaseLibIncludePrefix + "djinni_c.h")) publicIncludes.foreach(w.wl) + w.wl + writeExternCBegin(w) w.wl @@ -62,7 +85,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { }) writeCFile(origin, ident, "cpp", (w: IndentWriter) => { - w.wl(s"""#include "${ident.name}.h"""") + w.wl(s"""#include ${publicHeader(ident)}""") w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_helpers.hpp")) privateIncludes.foreach(w.wl) @@ -113,7 +136,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { val typeResolver = new CTypeResolver(ident, spec, cppMarshal) val prefix = resolveSymbolName(ident.name) - val typeName = resolveSymbolTypeName(ident) + val typeName = resolveRefSymbolTypeName(ident) val resolvedFields = r.fields.map(f => (new ResolvedField(f, typeResolver.resolve(f.ty.resolved)))) @@ -266,7 +289,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { )) val prefix = resolveSymbolName(ident.name) - val typeName = resolveSymbolTypeName(ident) + val typeName = resolveRefSymbolTypeName(ident) val proxyClassName = s"${resolveSymbolName(ident)}_proxy_class_ref" val methodDefsStructName = s"${resolveSymbolName(ident)}_method_defs" diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 35a6e817..16b2fb91 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -166,26 +166,27 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal addPublicImport(q(spec.cIncludePrefix + name + ".h")) } - private def resolveEnum(name: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { - val typename = valueTypeName(name) + private def resolveEnum(name: String, body: ast.TypeDef, asBoxed: Boolean): CTypeTranslator = { + val translator = getTranslatorNameForType(name, body) if (asBoxed) { new CTypeTranslator("djinni_number_ref", true, - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCppBoxed(${p})", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCppBoxed(${p})" + (p) => s"${translator}::toCppBoxed(${p})", + (p) => s"${translator}::fromCppBoxed(${p})" ) } else { + val typename = valueTypeName(name) new CTypeTranslator(typename, false, - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::toCpp(${p})", - (p) => s"::djinni::c_api::Enum<${cppTypename}, ${typename}>::fromCpp(${p})" + (p) => s"${translator}::toCpp(${p})", + (p) => s"${translator}::fromCpp(${p})" ) } } private def resolveExtern(expr: MExpr, defType: meta.DefType, c: meta.MExtern.C): CTypeTranslator = { updatePrivateImports(expr.base) - addPublicImport(c.publicHeader) + addPublicImport(cppMarshal.resolveExtCppHdr(c.publicHeader)) privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) val resolvedTranslator: String = if (expr.args.isEmpty) { @@ -203,6 +204,19 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal makeTranslator(c.typename, isRefType, resolvedTranslator) } + def getTranslatorNameForType(name: String, td: ast.TypeDef): String = { + val cppTypename = cppMarshal.fqTypename(name, td) + td match { + case ast.Enum(_, _) => { + val typename = valueTypeName(name) + s"::djinni::c_api::Enum<${cppTypename}, ${typename}>" + } + case ast.Record(_, _, _, _) => s"::djinni::c_api::Record<${cppTypename}>" + case ast.Interface(_, _, _) => s"::djinni::c_api::Interface<${cppTypename}>" + case ast.ProtobufMessage(_, _, _, _, _) => throw new AssertionError("Unsupported") + } + } + def resolve(expr: MExpr): CTypeTranslator = { resolve(expr, asBoxed = false) } @@ -215,20 +229,13 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal case meta.MDef(name, _, _, body) => { updatePrivateImports(expr.base) addPublicImportFromDef(name) - val cppTypename = cppMarshal.fqTypename(name, body) body match { - case ast.Enum(_, _) => resolveEnum(name, cppTypename, asBoxed) - case ast.Record(_, _, _, _) => makeTranslator( + case ast.Enum(_, _) => resolveEnum(name, body, asBoxed) + case _ => makeTranslator( ptrTypeName(name), isRefType = true, - s"::djinni::c_api::Record<${cppTypename}>" + getTranslatorNameForType(name, body) ) - case ast.Interface(_, _, _) => makeTranslator( - ptrTypeName(name), - isRefType = true, - s"::djinni::c_api::Interface<${cppTypename}>" - ) - case ast.ProtobufMessage(_, _, _, _, _) => throw new AssertionError("Unsupported") } } case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, defType, c) @@ -255,4 +262,4 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } -} +} \ No newline at end of file diff --git a/src/source/Main.scala b/src/source/Main.scala index 8c813ed2..3a646e56 100644 --- a/src/source/Main.scala +++ b/src/source/Main.scala @@ -12,7 +12,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * This file has been modified by Snap, Inc. */ @@ -112,6 +112,7 @@ object Main { var composerIncludeCppPrefix: String = "" var composerBaseLibIncludePrefix: String = "" var cOutFolder: Option[File] = None + var cHeaderOutFolderOptional: Option[File] = None var cNamespace: String = "" var cBaseLibIncludePrefix: String = "" var cIncludePrefix: String = "" @@ -309,6 +310,8 @@ object Main { .text("The output for the C files (Generated disabled if unspecified).") opt[String]("c-namespace").valueName(" cNamespace = x) .text("The C namespace, used as function prefixes for generated functions") + opt[File]("c-header-out").valueName("").foreach(x => cHeaderOutFolderOptional = Some(x)) + .text("The output folder for C header files (default: the same as --c-out).") opt[String]("c-base-lib-include-prefix").valueName("...").foreach(x => cBaseLibIncludePrefix = x) .text("The C base library's include path, relative to the C files.") opt[String]("c-include-prefix").valueName("...").foreach(x => cIncludePrefix = x) @@ -373,6 +376,7 @@ object Main { } val cppHeaderOutFolder = if (cppHeaderOutFolderOptional.isDefined) cppHeaderOutFolderOptional else cppOutFolder + val cHeaderOutFolder = if (cHeaderOutFolderOptional.isDefined) cHeaderOutFolderOptional else cOutFolder val jniHeaderOutFolder = if (jniHeaderOutFolderOptional.isDefined) jniHeaderOutFolderOptional else jniOutFolder val jniClassIdentStyle = jniClassIdentStyleOptional.getOrElse(cppIdentStyle.ty) val jniBaseLibClassIdentStyle = jniBaseLibClassIdentStyleOptional.getOrElse(jniClassIdentStyle) @@ -533,6 +537,7 @@ object Main { composerFileIdentStyle, composerTsOutFolder, cOutFolder, + cHeaderOutFolder, cNamespace, cBaseLibIncludePrefix, cIncludePrefix, diff --git a/src/source/YamlGenerator.scala b/src/source/YamlGenerator.scala index acc9c9e7..c2515e6b 100644 --- a/src/source/YamlGenerator.scala +++ b/src/source/YamlGenerator.scala @@ -39,6 +39,7 @@ class YamlGenerator(spec: Spec) extends Generator(spec) { val tsMarshal = new TsGenerator(spec, false) val swiftMarshal = new SwiftMarshal(spec) val swiftxxMarshal = new SwiftxxMarshal(spec) + val cMarshal = new CGenerator(spec) case class QuotedString(str: String) // For anything that migt require escaping @@ -89,6 +90,11 @@ class YamlGenerator(spec: Spec) extends Generator(spec) { if (spec.swiftxxOutFolder.isDefined) { w.wl("swiftxx:").nested {write(w, swiftxx(td))} } + if (spec.cOutFolder.isDefined) { + w.wl("c:").nested { + write(w, c(td)) + } + } } private def write(w: IndentWriter, m: Map[String, Any]) { @@ -228,6 +234,13 @@ class YamlGenerator(spec: Spec) extends Generator(spec) { "header" -> QuotedString(swiftxxMarshal.include(td.ident)) ) + private def c(td: TypeDecl) = Map[String, Any]( + "typename" -> QuotedString(cMarshal.typename(td)), + "translator" -> QuotedString(cMarshal.helperName(td)), + "public_header" -> QuotedString(cMarshal.publicHeader(td)), + "private_header" -> QuotedString(cMarshal.privateHeader(td)) + ) + // TODO: there has to be a way to do all this without the MExpr/Meta conversions? private def mexpr(td: TypeDecl) = MExpr(meta(td), List()) diff --git a/src/source/generator.scala b/src/source/generator.scala index 696a79a8..14cbfc94 100644 --- a/src/source/generator.scala +++ b/src/source/generator.scala @@ -114,6 +114,7 @@ package object generatorTools { composerFileIdentStyle: IdentConverter, composerTsOutFolder: Option[File], cOutFolder: Option[File], + cHeaderOutFolder: Option[File], cNamespace: String, cBaseLibIncludePrefix: String, cIncludePrefix: String, @@ -340,6 +341,7 @@ package object generatorTools { if (spec.cOutFolder.isDefined) { if (!spec.skipGeneration) { createFolder("C", spec.cOutFolder.get) + createFolder("C header", spec.cHeaderOutFolder.get) } new CGenerator(spec).generate(idl) } diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 32071c61..c838b6d8 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -80,10 +80,16 @@ uint64_t djinni_date_get_epoch(djinni_date_ref date); \ inline djinni_optional_##__type__ djinni_optional_##__type__##_make( \ __type__ value) { \ - return (djinni_optional_##__type__){.value = value, .has_value = true}; \ + djinni_optional_##__type__ output; \ + output.value = value; \ + output.has_value = true; \ + return output; \ } \ inline djinni_optional_##__type__ djinni_optional_##__type__##_empty() { \ - return (djinni_optional_##__type__){.value = 0, .has_value = false}; \ + djinni_optional_##__type__ output; \ + output.value = 0; \ + output.has_value = false; \ + return output; \ } DJINNI_OPTIONAL_PRIMITIVE(bool); diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_helpers.hpp index 64973444..db66a53f 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_helpers.hpp @@ -143,11 +143,14 @@ class Number { class Optional { public: template static T fromCppPrimitive(Opt value) { - T out = {0}; + T out; if (value) { out.has_value = true; out.value = value.value(); + } else { + out.has_value = false; + out.value = 0; } return out; diff --git a/support-lib/dataref.yaml b/support-lib/dataref.yaml index 94ffb167..d900832e 100644 --- a/support-lib/dataref.yaml +++ b/support-lib/dataref.yaml @@ -48,5 +48,5 @@ swiftxx: c: typename: 'djinni_binary_ref' translator: '::djinni::c_api::DataRef' - public_header: '"djinni_c.h"' + public_header: '"$djinni_c.h"' private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/dataview.yaml b/support-lib/dataview.yaml index d1de3602..4dd39416 100644 --- a/support-lib/dataview.yaml +++ b/support-lib/dataview.yaml @@ -48,5 +48,5 @@ swiftxx: c: typename: 'djinni_binary_ref' translator: '::djinni::c_api::DataView' - public_header: '"djinni_c.h"' + public_header: '"$djinni_c.h"' private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/future.yaml b/support-lib/future.yaml index 1bc3e1e9..f5449422 100644 --- a/support-lib/future.yaml +++ b/support-lib/future.yaml @@ -51,5 +51,5 @@ swiftxx: c: typename: 'djinni_future_ref' translator: '::djinni::c_api::Future' - public_header: '"djinni_c.h"' + public_header: '"$djinni_c.h"' private_header: '"$djinni_c_helpers.hpp"' diff --git a/support-lib/outcome.yaml b/support-lib/outcome.yaml index 93558ddb..211651ec 100644 --- a/support-lib/outcome.yaml +++ b/support-lib/outcome.yaml @@ -50,6 +50,6 @@ swiftxx: c: typename: 'djinni_outcome_ref' translator: '::djinni::c_api::Outcome' - public_header: '"djinni_c.h"' + public_header: '"$djinni_c.h"' private_header: '"$djinni_c_helpers.hpp"' From 97ad7a200615d9e44ee06e1fdaf9dc96a89c6098 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 20 Aug 2025 08:50:48 -0500 Subject: [PATCH 23/42] fix + codegen --- src/source/CTypeResolver.scala | 58 ++-- test-suite/generated-src/c/Conflict.cpp | 24 ++ test-suite/generated-src/c/Conflict.h | 31 ++ test-suite/generated-src/c/DataRefTest.cpp | 142 +++++++++ test-suite/generated-src/c/DataRefTest.h | 55 ++++ .../c/RecordWithEmbeddedCppProto.cpp | 24 ++ .../c/RecordWithEmbeddedCppProto.h | 21 ++ .../c/RecordWithEmbeddedProto.cpp | 24 ++ .../generated-src/c/RecordWithEmbeddedProto.h | 21 ++ .../generated-src/c/_varname_interface_.cpp | 63 ++++ .../generated-src/c/_varname_interface_.h | 39 +++ .../generated-src/c/_varname_record_.cpp | 23 ++ test-suite/generated-src/c/_varname_record_.h | 26 ++ test-suite/generated-src/c/access_flags.cpp | 7 + test-suite/generated-src/c/access_flags.h | 28 ++ .../generated-src/c/assorted_primitives.cpp | 153 ++++++++++ .../generated-src/c/assorted_primitives.h | 60 ++++ .../generated-src/c/async_interface.cpp | 42 +++ test-suite/generated-src/c/async_interface.h | 30 ++ .../generated-src/c/client_interface.cpp | 109 +++++++ test-suite/generated-src/c/client_interface.h | 45 +++ .../c/client_returned_record.cpp | 43 +++ .../generated-src/c/client_returned_record.h | 28 ++ test-suite/generated-src/c/color.cpp | 7 + test-suite/generated-src/c/color.h | 33 +++ test-suite/generated-src/c/conflict_user.cpp | 54 ++++ test-suite/generated-src/c/conflict_user.h | 33 +++ test-suite/generated-src/c/constant_enum.cpp | 7 + test-suite/generated-src/c/constant_enum.h | 20 ++ .../c/constant_interface_with_enum.cpp | 24 ++ .../c/constant_interface_with_enum.h | 28 ++ .../generated-src/c/constant_record.cpp | 33 +++ test-suite/generated-src/c/constant_record.h | 25 ++ .../generated-src/c/constant_with_enum.cpp | 13 + .../generated-src/c/constant_with_enum.h | 19 ++ test-suite/generated-src/c/constants.cpp | 13 + test-suite/generated-src/c/constants.h | 19 ++ .../generated-src/c/constants_interface.cpp | 38 +++ .../generated-src/c/constants_interface.h | 35 +++ test-suite/generated-src/c/cpp_exception.cpp | 75 +++++ test-suite/generated-src/c/cpp_exception.h | 40 +++ test-suite/generated-src/c/date_record.cpp | 25 ++ test-suite/generated-src/c/date_record.h | 22 ++ test-suite/generated-src/c/empty_flags.cpp | 7 + test-suite/generated-src/c/empty_flags.h | 19 ++ test-suite/generated-src/c/empty_record.cpp | 13 + test-suite/generated-src/c/empty_record.h | 23 ++ .../generated-src/c/enum_usage_interface.cpp | 103 +++++++ .../generated-src/c/enum_usage_interface.h | 42 +++ .../generated-src/c/enum_usage_record.cpp | 64 +++++ .../generated-src/c/enum_usage_record.h | 34 +++ .../generated-src/c/extended_record.cpp | 23 ++ test-suite/generated-src/c/extended_record.h | 22 ++ test-suite/generated-src/c/first_listener.cpp | 33 +++ test-suite/generated-src/c/first_listener.h | 30 ++ test-suite/generated-src/c/flag_roundtrip.cpp | 50 ++++ test-suite/generated-src/c/flag_roundtrip.h | 40 +++ .../c/interface_using_extended_record.cpp | 41 +++ .../c/interface_using_extended_record.h | 30 ++ .../generated-src/c/java_only_listener.cpp | 24 ++ .../generated-src/c/java_only_listener.h | 27 ++ .../generated-src/c/listener_caller.cpp | 49 ++++ test-suite/generated-src/c/listener_caller.h | 44 +++ .../generated-src/c/map_date_record.cpp | 25 ++ test-suite/generated-src/c/map_date_record.h | 22 ++ .../generated-src/c/map_list_record.cpp | 23 ++ test-suite/generated-src/c/map_list_record.h | 21 ++ test-suite/generated-src/c/map_record.cpp | 33 +++ test-suite/generated-src/c/map_record.h | 24 ++ .../generated-src/c/nested_collection.cpp | 23 ++ .../generated-src/c/nested_collection.h | 21 ++ test-suite/generated-src/c/nested_outcome.cpp | 25 ++ test-suite/generated-src/c/nested_outcome.h | 22 ++ .../generated-src/c/objc_only_listener.cpp | 24 ++ .../generated-src/c/objc_only_listener.h | 27 ++ test-suite/generated-src/c/primitive_list.cpp | 33 +++ test-suite/generated-src/c/primitive_list.h | 24 ++ test-suite/generated-src/c/proto_tests.cpp | 108 +++++++ test-suite/generated-src/c/proto_tests.h | 68 +++++ .../c/record_using_extended_record.cpp | 24 ++ .../c/record_using_extended_record.h | 22 ++ .../generated-src/c/record_with_derivings.cpp | 93 ++++++ .../generated-src/c/record_with_derivings.h | 42 +++ .../c/record_with_duration_and_derivings.cpp | 25 ++ .../c/record_with_duration_and_derivings.h | 22 ++ .../generated-src/c/record_with_flags.cpp | 24 ++ .../generated-src/c/record_with_flags.h | 22 ++ .../c/record_with_nested_derivings.cpp | 34 +++ .../c/record_with_nested_derivings.h | 25 ++ test-suite/generated-src/c/return_one.cpp | 44 +++ test-suite/generated-src/c/return_one.h | 34 +++ test-suite/generated-src/c/return_two.cpp | 44 +++ test-suite/generated-src/c/return_two.h | 34 +++ .../c/reverse_client_interface.cpp | 77 +++++ .../c/reverse_client_interface.h | 39 +++ .../generated-src/c/sample_interface.cpp | 24 ++ test-suite/generated-src/c/sample_interface.h | 31 ++ .../generated-src/c/second_listener.cpp | 33 +++ test-suite/generated-src/c/second_listener.h | 30 ++ test-suite/generated-src/c/set_record.cpp | 33 +++ test-suite/generated-src/c/set_record.h | 24 ++ .../generated-src/c/support_copying.cpp | 23 ++ test-suite/generated-src/c/support_copying.h | 21 ++ test-suite/generated-src/c/test_array.cpp | 49 ++++ test-suite/generated-src/c/test_array.h | 39 +++ test-suite/generated-src/c/test_duration.cpp | 146 ++++++++++ test-suite/generated-src/c/test_duration.h | 87 ++++++ test-suite/generated-src/c/test_helpers.cpp | 272 ++++++++++++++++++ test-suite/generated-src/c/test_helpers.h | 170 +++++++++++ test-suite/generated-src/c/test_outcome.cpp | 75 +++++ test-suite/generated-src/c/test_outcome.h | 52 ++++ .../c/test_static_method_language.cpp | 33 +++ .../c/test_static_method_language.h | 33 +++ .../generated-src/c/throwing_interface.cpp | 33 +++ .../generated-src/c/throwing_interface.h | 29 ++ test-suite/generated-src/c/user_token.cpp | 38 +++ test-suite/generated-src/c/user_token.h | 29 ++ .../c/uses_single_language_listeners.cpp | 75 +++++ .../c/uses_single_language_listeners.h | 44 +++ test-suite/generated-src/c/vec2.cpp | 33 +++ test-suite/generated-src/c/vec2.h | 24 ++ .../java/com/dropbox/djinni/test/Color.java | 4 + .../dropbox/djinni/test/PrimitiveList.java | 22 +- .../generated-src/jni/NativePrimitiveList.cpp | 8 +- .../generated-src/jni/NativePrimitiveList.hpp | 3 +- test-suite/generated-src/objc/DBColor.h | 4 + .../objc/DBPrimitiveList+Private.mm | 6 +- .../generated-src/objc/DBPrimitiveList.h | 8 +- .../generated-src/objc/DBPrimitiveList.mm | 18 +- test-suite/generated-src/outFileList.txt | 120 ++++++++ .../swift/PrimitiveList+Private.swift | 4 +- .../generated-src/swift/PrimitiveList.swift | 4 +- .../swiftxx/NativePrimitiveList.cpp | 3 +- test-suite/generated-src/ts/test.ts | 5 + .../wasm/NativePrimitiveList.cpp | 4 +- 135 files changed, 5161 insertions(+), 37 deletions(-) create mode 100644 test-suite/generated-src/c/Conflict.cpp create mode 100644 test-suite/generated-src/c/Conflict.h create mode 100644 test-suite/generated-src/c/DataRefTest.cpp create mode 100644 test-suite/generated-src/c/DataRefTest.h create mode 100644 test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp create mode 100644 test-suite/generated-src/c/RecordWithEmbeddedCppProto.h create mode 100644 test-suite/generated-src/c/RecordWithEmbeddedProto.cpp create mode 100644 test-suite/generated-src/c/RecordWithEmbeddedProto.h create mode 100644 test-suite/generated-src/c/_varname_interface_.cpp create mode 100644 test-suite/generated-src/c/_varname_interface_.h create mode 100644 test-suite/generated-src/c/_varname_record_.cpp create mode 100644 test-suite/generated-src/c/_varname_record_.h create mode 100644 test-suite/generated-src/c/access_flags.cpp create mode 100644 test-suite/generated-src/c/access_flags.h create mode 100644 test-suite/generated-src/c/assorted_primitives.cpp create mode 100644 test-suite/generated-src/c/assorted_primitives.h create mode 100644 test-suite/generated-src/c/async_interface.cpp create mode 100644 test-suite/generated-src/c/async_interface.h create mode 100644 test-suite/generated-src/c/client_interface.cpp create mode 100644 test-suite/generated-src/c/client_interface.h create mode 100644 test-suite/generated-src/c/client_returned_record.cpp create mode 100644 test-suite/generated-src/c/client_returned_record.h create mode 100644 test-suite/generated-src/c/color.cpp create mode 100644 test-suite/generated-src/c/color.h create mode 100644 test-suite/generated-src/c/conflict_user.cpp create mode 100644 test-suite/generated-src/c/conflict_user.h create mode 100644 test-suite/generated-src/c/constant_enum.cpp create mode 100644 test-suite/generated-src/c/constant_enum.h create mode 100644 test-suite/generated-src/c/constant_interface_with_enum.cpp create mode 100644 test-suite/generated-src/c/constant_interface_with_enum.h create mode 100644 test-suite/generated-src/c/constant_record.cpp create mode 100644 test-suite/generated-src/c/constant_record.h create mode 100644 test-suite/generated-src/c/constant_with_enum.cpp create mode 100644 test-suite/generated-src/c/constant_with_enum.h create mode 100644 test-suite/generated-src/c/constants.cpp create mode 100644 test-suite/generated-src/c/constants.h create mode 100644 test-suite/generated-src/c/constants_interface.cpp create mode 100644 test-suite/generated-src/c/constants_interface.h create mode 100644 test-suite/generated-src/c/cpp_exception.cpp create mode 100644 test-suite/generated-src/c/cpp_exception.h create mode 100644 test-suite/generated-src/c/date_record.cpp create mode 100644 test-suite/generated-src/c/date_record.h create mode 100644 test-suite/generated-src/c/empty_flags.cpp create mode 100644 test-suite/generated-src/c/empty_flags.h create mode 100644 test-suite/generated-src/c/empty_record.cpp create mode 100644 test-suite/generated-src/c/empty_record.h create mode 100644 test-suite/generated-src/c/enum_usage_interface.cpp create mode 100644 test-suite/generated-src/c/enum_usage_interface.h create mode 100644 test-suite/generated-src/c/enum_usage_record.cpp create mode 100644 test-suite/generated-src/c/enum_usage_record.h create mode 100644 test-suite/generated-src/c/extended_record.cpp create mode 100644 test-suite/generated-src/c/extended_record.h create mode 100644 test-suite/generated-src/c/first_listener.cpp create mode 100644 test-suite/generated-src/c/first_listener.h create mode 100644 test-suite/generated-src/c/flag_roundtrip.cpp create mode 100644 test-suite/generated-src/c/flag_roundtrip.h create mode 100644 test-suite/generated-src/c/interface_using_extended_record.cpp create mode 100644 test-suite/generated-src/c/interface_using_extended_record.h create mode 100644 test-suite/generated-src/c/java_only_listener.cpp create mode 100644 test-suite/generated-src/c/java_only_listener.h create mode 100644 test-suite/generated-src/c/listener_caller.cpp create mode 100644 test-suite/generated-src/c/listener_caller.h create mode 100644 test-suite/generated-src/c/map_date_record.cpp create mode 100644 test-suite/generated-src/c/map_date_record.h create mode 100644 test-suite/generated-src/c/map_list_record.cpp create mode 100644 test-suite/generated-src/c/map_list_record.h create mode 100644 test-suite/generated-src/c/map_record.cpp create mode 100644 test-suite/generated-src/c/map_record.h create mode 100644 test-suite/generated-src/c/nested_collection.cpp create mode 100644 test-suite/generated-src/c/nested_collection.h create mode 100644 test-suite/generated-src/c/nested_outcome.cpp create mode 100644 test-suite/generated-src/c/nested_outcome.h create mode 100644 test-suite/generated-src/c/objc_only_listener.cpp create mode 100644 test-suite/generated-src/c/objc_only_listener.h create mode 100644 test-suite/generated-src/c/primitive_list.cpp create mode 100644 test-suite/generated-src/c/primitive_list.h create mode 100644 test-suite/generated-src/c/proto_tests.cpp create mode 100644 test-suite/generated-src/c/proto_tests.h create mode 100644 test-suite/generated-src/c/record_using_extended_record.cpp create mode 100644 test-suite/generated-src/c/record_using_extended_record.h create mode 100644 test-suite/generated-src/c/record_with_derivings.cpp create mode 100644 test-suite/generated-src/c/record_with_derivings.h create mode 100644 test-suite/generated-src/c/record_with_duration_and_derivings.cpp create mode 100644 test-suite/generated-src/c/record_with_duration_and_derivings.h create mode 100644 test-suite/generated-src/c/record_with_flags.cpp create mode 100644 test-suite/generated-src/c/record_with_flags.h create mode 100644 test-suite/generated-src/c/record_with_nested_derivings.cpp create mode 100644 test-suite/generated-src/c/record_with_nested_derivings.h create mode 100644 test-suite/generated-src/c/return_one.cpp create mode 100644 test-suite/generated-src/c/return_one.h create mode 100644 test-suite/generated-src/c/return_two.cpp create mode 100644 test-suite/generated-src/c/return_two.h create mode 100644 test-suite/generated-src/c/reverse_client_interface.cpp create mode 100644 test-suite/generated-src/c/reverse_client_interface.h create mode 100644 test-suite/generated-src/c/sample_interface.cpp create mode 100644 test-suite/generated-src/c/sample_interface.h create mode 100644 test-suite/generated-src/c/second_listener.cpp create mode 100644 test-suite/generated-src/c/second_listener.h create mode 100644 test-suite/generated-src/c/set_record.cpp create mode 100644 test-suite/generated-src/c/set_record.h create mode 100644 test-suite/generated-src/c/support_copying.cpp create mode 100644 test-suite/generated-src/c/support_copying.h create mode 100644 test-suite/generated-src/c/test_array.cpp create mode 100644 test-suite/generated-src/c/test_array.h create mode 100644 test-suite/generated-src/c/test_duration.cpp create mode 100644 test-suite/generated-src/c/test_duration.h create mode 100644 test-suite/generated-src/c/test_helpers.cpp create mode 100644 test-suite/generated-src/c/test_helpers.h create mode 100644 test-suite/generated-src/c/test_outcome.cpp create mode 100644 test-suite/generated-src/c/test_outcome.h create mode 100644 test-suite/generated-src/c/test_static_method_language.cpp create mode 100644 test-suite/generated-src/c/test_static_method_language.h create mode 100644 test-suite/generated-src/c/throwing_interface.cpp create mode 100644 test-suite/generated-src/c/throwing_interface.h create mode 100644 test-suite/generated-src/c/user_token.cpp create mode 100644 test-suite/generated-src/c/user_token.h create mode 100644 test-suite/generated-src/c/uses_single_language_listeners.cpp create mode 100644 test-suite/generated-src/c/uses_single_language_listeners.h create mode 100644 test-suite/generated-src/c/vec2.cpp create mode 100644 test-suite/generated-src/c/vec2.h diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 16b2fb91..6d80bec4 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -61,20 +61,27 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal case _ => false } } + case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, _) => { + defType match { + case DEnum => true + case _ => false + } + } case _ => false } } - private def makeNestedTranslator(inner: CTypeTranslator, typename: String, translator: String): CTypeTranslator = { + private def makeNestedTranslator(inner: CTypeTranslator, typename: String, toCppTranslator: String, fromCppTranslator: String): CTypeTranslator = { + val innerValueParamName = s"std::forward(value)" new CTypeTranslator(typename, true, (p) => { - val innerToCpp = inner.toCppTranslatorFn("value") - s"${translator}::toCpp(${p}, [](auto value) { return ${innerToCpp}; })" + val innerToCpp = inner.toCppTranslatorFn(innerValueParamName) + s"${toCppTranslator}(${p}, [](auto&& value) { return ${innerToCpp}; })" }, (p) => { - val innerFromCpp = inner.fromCppTranslatorFn("value") - s"$translator::fromCpp(${p}, [](auto value) { return ${innerFromCpp}; })" + val innerFromCpp = inner.fromCppTranslatorFn(innerValueParamName) + s"$fromCppTranslator(${p}, [](auto&& value) { return ${innerFromCpp}; })" } ) } @@ -96,17 +103,10 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val sharedPtr = cppMarshal.bySharedPtr(expr) val toCppMethodName = if (sharedPtr) "toSharedPtrCpp" else "toCpp" val fromCppMethodName = if (sharedPtr) "fromSharedPtrCpp" else "fromCpp" - new CTypeTranslator(resolved.typename, - true, - (p) => { - val innerToCpp = resolved.toCppTranslatorFn("value") - s"::djinni::c_api::Optional::${toCppMethodName}<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerToCpp}; })" - }, - (p) => { - val innerFromCpp = resolved.fromCppTranslatorFn("value") - s"::djinni::c_api::Optional::${fromCppMethodName}<${cppOptionalTemplate}>(${p}, [](auto value) { return ${innerFromCpp}; })" - } - ) + makeNestedTranslator(resolved, + resolved.typename, + s"::djinni::c_api::Optional::${toCppMethodName}<${cppOptionalTemplate}>", + s"::djinni::c_api::Optional::${fromCppMethodName}<${cppOptionalTemplate}>") } } @@ -114,7 +114,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val resolved = resolve(expr, true) val cppType = cppMarshal.fqTypename(expr) - makeNestedTranslator(resolved, "djinni_array_ref", translator + s"<${cppType}>") + makeNestedTranslator(resolved, "djinni_array_ref", s"$translator<${cppType}>::toCpp", s"$translator<${cppType}>::fromCpp") } private def resolveMap(keyExpr: MExpr, valueExpr: MExpr): CTypeTranslator = { @@ -168,6 +168,11 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolveEnum(name: String, body: ast.TypeDef, asBoxed: Boolean): CTypeTranslator = { val translator = getTranslatorNameForType(name, body) + val typename = valueTypeName(name) + doResolveEnum(typename, translator, asBoxed) + } + + private def doResolveEnum(typename: String, translator: String, asBoxed: Boolean): CTypeTranslator = { if (asBoxed) { new CTypeTranslator("djinni_number_ref", true, @@ -175,7 +180,6 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal (p) => s"${translator}::fromCppBoxed(${p})" ) } else { - val typename = valueTypeName(name) new CTypeTranslator(typename, false, (p) => s"${translator}::toCpp(${p})", @@ -184,7 +188,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } - private def resolveExtern(expr: MExpr, defType: meta.DefType, c: meta.MExtern.C): CTypeTranslator = { + private def resolveExtern(expr: MExpr, defType: meta.DefType, c: meta.MExtern.C, asBoxed: Boolean): CTypeTranslator = { updatePrivateImports(expr.base) addPublicImport(cppMarshal.resolveExtCppHdr(c.publicHeader)) privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) @@ -192,16 +196,22 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val resolvedTranslator: String = if (expr.args.isEmpty) { c.translator } else { + // Resolve to get the includes + expr.args.foreach(a => resolve(a)) val templateArgs = expr.args.map(a => cppMarshal.fqTypename(a)).mkString(", ") s"${c.translator}<${templateArgs}>" } - val isRefType = defType match { - case DEnum => false - case _ => true + val isEnum = defType match { + case DEnum => true + case _ => false } - makeTranslator(c.typename, isRefType, resolvedTranslator) + if (isEnum) { + doResolveEnum(c.typename, resolvedTranslator, asBoxed) + } else { + makeTranslator(c.typename, isRefType = true, resolvedTranslator) + } } def getTranslatorNameForType(name: String, td: ast.TypeDef): String = { @@ -238,7 +248,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal ) } } - case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, defType, c) + case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, defType, c, asBoxed) case meta.MProtobuf(_, _, _) => updatePrivateImports(expr.base) makeTranslator( diff --git a/test-suite/generated-src/c/Conflict.cpp b/test-suite/generated-src/c/Conflict.cpp new file mode 100644 index 00000000..e17af29d --- /dev/null +++ b/test-suite/generated-src/c/Conflict.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "Conflict.h" +#include "djinni_c_helpers.hpp" +#include "Conflict.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct Conflict_Proxy: public Proxy_Parent, public ::testsuite::Conflict { + Conflict_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~Conflict_Proxy() override = default; + +}; + +testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + + diff --git a/test-suite/generated-src/c/Conflict.h b/test-suite/generated-src/c/Conflict.h new file mode 100644 index 00000000..f7b185a9 --- /dev/null +++ b/test-suite/generated-src/c/Conflict.h @@ -0,0 +1,31 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Test for conflict of method name with an interface name. + * See the comments about scopeSymbols in CppMarshal.scala for more info. + */ +typedef djinni_interface_ref testsuite_Conflict_ref; +typedef djinni_proxy_class_ref testsuite_Conflict_proxy_class_ref; + +typedef struct +{ + void *reserved[1]; +} testsuite_Conflict_method_defs; + +testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/DataRefTest.cpp b/test-suite/generated-src/c/DataRefTest.cpp new file mode 100644 index 00000000..67cbc437 --- /dev/null +++ b/test-suite/generated-src/c/DataRefTest.cpp @@ -0,0 +1,142 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from data_ref_view.djinni + +#include "DataRefTest.h" +#include "djinni_c_helpers.hpp" +#include "DataRef.hpp" +#include "DataRefTest.hpp" +#include "DataView.hpp" +#include "djinni_c_helpers.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest { + DataRefTest_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~DataRefTest_Proxy() override = default; + + void sendData(const ::djinni::DataRef & data) override { + auto data_c = ::djinni::c_api::DataRef::fromCpp(data); + Proxy_Parent::getProxyClass().methodDefs().sendData(Proxy_Parent::getOpaque(), data_c); + djinni_ref_release(data_c); + } + + std::vector retriveAsBin() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().retriveAsBin(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::Binary::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + void sendMutableData(const ::djinni::DataRef & data) override { + auto data_c = ::djinni::c_api::DataRef::fromCpp(data); + Proxy_Parent::getProxyClass().methodDefs().sendMutableData(Proxy_Parent::getOpaque(), data_c); + djinni_ref_release(data_c); + } + + ::djinni::DataRef generateData() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().generateData(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + ::djinni::DataRef dataFromVec() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromVec(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + ::djinni::DataRef dataFromStr() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromStr(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::vector sendDataView(const ::djinni::DataView & data) override { + auto data_c = ::djinni::c_api::DataView::fromCpp(data); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().sendDataView(Proxy_Parent::getOpaque(), data_c); + djinni_ref_release(data_c); + + auto returnValue_cpp = ::djinni::c_api::Binary::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + ::djinni::DataView recvDataView() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().recvDataView(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::DataView::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) +{ + ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendData(::djinni::c_api::DataRef::toCpp(data)); +} + +djinni_binary_ref testsuite_DataRefTest_retriveAsBin(testsuite_DataRefTest_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->retriveAsBin(); + return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); +} + +void testsuite_DataRefTest_sendMutableData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) +{ + ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendMutableData(::djinni::c_api::DataRef::toCpp(data)); +} + +djinni_binary_ref testsuite_DataRefTest_generateData(testsuite_DataRefTest_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->generateData(); + return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_DataRefTest_dataFromVec(testsuite_DataRefTest_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->dataFromVec(); + return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_DataRefTest_dataFromStr(testsuite_DataRefTest_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->dataFromStr(); + return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_DataRefTest_sendDataView(testsuite_DataRefTest_ref instance, djinni_binary_ref data) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendDataView(::djinni::c_api::DataView::toCpp(data)); + return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_DataRefTest_recvDataView(testsuite_DataRefTest_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->recvDataView(); + return ::djinni::c_api::DataView::fromCpp(std::move(retValue)); +} + +testsuite_DataRefTest_ref testsuite_DataRefTest_create() +{ + auto retValue = ::testsuite::DataRefTest::create(); + return ::djinni::c_api::Interface<::testsuite::DataRefTest>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/DataRefTest.h b/test-suite/generated-src/c/DataRefTest.h new file mode 100644 index 00000000..31c8b20c --- /dev/null +++ b/test-suite/generated-src/c/DataRefTest.h @@ -0,0 +1,55 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from data_ref_view.djinni + +#pragma once + +#include "djinni_c.h" +#include "DataRefTest.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_DataRefTest_ref; +typedef djinni_proxy_class_ref testsuite_DataRefTest_proxy_class_ref; + +typedef struct +{ + void (*sendData)(void *, djinni_binary_ref); + djinni_binary_ref (*retriveAsBin)(void *); + void (*sendMutableData)(void *, djinni_binary_ref); + djinni_binary_ref (*generateData)(void *); + djinni_binary_ref (*dataFromVec)(void *); + djinni_binary_ref (*dataFromStr)(void *); + djinni_binary_ref (*sendDataView)(void *, djinni_binary_ref); + djinni_binary_ref (*recvDataView)(void *); + testsuite_DataRefTest_ref (*create)(void *); +} testsuite_DataRefTest_method_defs; + +testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque); + +void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data); + +djinni_binary_ref testsuite_DataRefTest_retriveAsBin(testsuite_DataRefTest_ref instance); + +void testsuite_DataRefTest_sendMutableData(testsuite_DataRefTest_ref instance, djinni_binary_ref data); + +djinni_binary_ref testsuite_DataRefTest_generateData(testsuite_DataRefTest_ref instance); + +djinni_binary_ref testsuite_DataRefTest_dataFromVec(testsuite_DataRefTest_ref instance); + +djinni_binary_ref testsuite_DataRefTest_dataFromStr(testsuite_DataRefTest_ref instance); + +djinni_binary_ref testsuite_DataRefTest_sendDataView(testsuite_DataRefTest_ref instance, djinni_binary_ref data); + +djinni_binary_ref testsuite_DataRefTest_recvDataView(testsuite_DataRefTest_ref instance); + +testsuite_DataRefTest_ref testsuite_DataRefTest_create(); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp new file mode 100644 index 00000000..674e9427 --- /dev/null +++ b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#include "RecordWithEmbeddedCppProto.h" +#include "djinni_c_helpers.hpp" +#include "RecordWithEmbeddedCppProto.hpp" +#include "proto/cpp/test2.pb.h" + +testsuite_RecordWithEmbeddedCppProto_ref testsuite_RecordWithEmbeddedCppProto_new(djinni_binary_ref state) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::make(::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(state)); +} + +djinni_binary_ref testsuite_RecordWithEmbeddedCppProto_get_state(testsuite_RecordWithEmbeddedCppProto_ref instance) +{ + return ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state); +} + +void testsuite_RecordWithEmbeddedCppProto_set_state(testsuite_RecordWithEmbeddedCppProto_ref instance, djinni_binary_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state = ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/RecordWithEmbeddedCppProto.h b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.h new file mode 100644 index 00000000..8ef2c29d --- /dev/null +++ b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.h @@ -0,0 +1,21 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_RecordWithEmbeddedCppProto_ref; + +testsuite_RecordWithEmbeddedCppProto_ref testsuite_RecordWithEmbeddedCppProto_new(djinni_binary_ref state); +djinni_binary_ref testsuite_RecordWithEmbeddedCppProto_get_state(testsuite_RecordWithEmbeddedCppProto_ref instance); +void testsuite_RecordWithEmbeddedCppProto_set_state(testsuite_RecordWithEmbeddedCppProto_ref instance, djinni_binary_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp b/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp new file mode 100644 index 00000000..5802abb6 --- /dev/null +++ b/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#include "RecordWithEmbeddedProto.h" +#include "djinni_c_helpers.hpp" +#include "RecordWithEmbeddedProto.hpp" +#include "proto/cpp/test.pb.h" + +testsuite_RecordWithEmbeddedProto_ref testsuite_RecordWithEmbeddedProto_new(djinni_binary_ref person) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::make(::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(person)); +} + +djinni_binary_ref testsuite_RecordWithEmbeddedProto_get_person(testsuite_RecordWithEmbeddedProto_ref instance) +{ + return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person); +} + +void testsuite_RecordWithEmbeddedProto_set_person(testsuite_RecordWithEmbeddedProto_ref instance, djinni_binary_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person = ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/RecordWithEmbeddedProto.h b/test-suite/generated-src/c/RecordWithEmbeddedProto.h new file mode 100644 index 00000000..f28e1c4b --- /dev/null +++ b/test-suite/generated-src/c/RecordWithEmbeddedProto.h @@ -0,0 +1,21 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_RecordWithEmbeddedProto_ref; + +testsuite_RecordWithEmbeddedProto_ref testsuite_RecordWithEmbeddedProto_new(djinni_binary_ref person); +djinni_binary_ref testsuite_RecordWithEmbeddedProto_get_person(testsuite_RecordWithEmbeddedProto_ref instance); +void testsuite_RecordWithEmbeddedProto_set_person(testsuite_RecordWithEmbeddedProto_ref instance, djinni_binary_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/_varname_interface_.cpp b/test-suite/generated-src/c/_varname_interface_.cpp new file mode 100644 index 00000000..440be93a --- /dev/null +++ b/test-suite/generated-src/c/_varname_interface_.cpp @@ -0,0 +1,63 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from varnames.djinni + +#include "_varname_interface_.h" +#include "djinni_c_helpers.hpp" +#include "_varname_interface_.hpp" +#include "_varname_record_.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct VarnameInterface_Proxy: public Proxy_Parent, public ::testsuite::VarnameInterface { + VarnameInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~VarnameInterface_Proxy() override = default; + + ::testsuite::VarnameRecord _rmethod_(const ::testsuite::VarnameRecord & _r_arg_) override { + auto _r_arg__c = ::djinni::c_api::Record<::testsuite::VarnameRecord>::fromCpp(_r_arg_); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._rmethod_(Proxy_Parent::getOpaque(), _r_arg__c); + djinni_ref_release(_r_arg__c); + + auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> _imethod_(const /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> & _i_arg_) override { + auto _i_arg__c = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::fromCpp(_i_arg_); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._imethod_(Proxy_Parent::getOpaque(), _i_arg__c); + djinni_ref_release(_i_arg__c); + + auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +/** + * We should also rewrite parameter names in docstrings. + * _r_arg_ should be rewritten. + * _i_arg_ should not. + */ +testsuite__varname_record__ref testsuite__varname_interface___rmethod_(testsuite__varname_interface__ref instance, testsuite__varname_record__ref _r_arg_) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(instance)->_rmethod_(::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(_r_arg_)); + return ::djinni::c_api::Record<::testsuite::VarnameRecord>::fromCpp(std::move(retValue)); +} + +testsuite__varname_interface__ref testsuite__varname_interface___imethod_(testsuite__varname_interface__ref instance, testsuite__varname_interface__ref _i_arg_) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(instance)->_imethod_(::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(_i_arg_)); + return ::djinni::c_api::Interface<::testsuite::VarnameInterface>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/_varname_interface_.h b/test-suite/generated-src/c/_varname_interface_.h new file mode 100644 index 00000000..f7cce2e6 --- /dev/null +++ b/test-suite/generated-src/c/_varname_interface_.h @@ -0,0 +1,39 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from varnames.djinni + +#pragma once + +#include "djinni_c.h" +#include "_varname_interface_.h" +#include "_varname_record_.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite__varname_interface__ref; +typedef djinni_proxy_class_ref testsuite__varname_interface__proxy_class_ref; + +typedef struct +{ + testsuite__varname_record__ref (*_rmethod_)(void *, testsuite__varname_record__ref); + testsuite__varname_interface__ref (*_imethod_)(void *, testsuite__varname_interface__ref); +} testsuite__varname_interface__method_defs; + +testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque); + +/** + * We should also rewrite parameter names in docstrings. + * _r_arg_ should be rewritten. + * _i_arg_ should not. + */ +testsuite__varname_record__ref testsuite__varname_interface___rmethod_(testsuite__varname_interface__ref instance, testsuite__varname_record__ref _r_arg_); + +testsuite__varname_interface__ref testsuite__varname_interface___imethod_(testsuite__varname_interface__ref instance, testsuite__varname_interface__ref _i_arg_); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/_varname_record_.cpp b/test-suite/generated-src/c/_varname_record_.cpp new file mode 100644 index 00000000..25478187 --- /dev/null +++ b/test-suite/generated-src/c/_varname_record_.cpp @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from varnames.djinni + +#include "_varname_record_.h" +#include "djinni_c_helpers.hpp" +#include "_varname_record_.hpp" + +testsuite__varname_record__ref testsuite__varname_record__new(int8_t _field_) +{ + return ::djinni::c_api::Record<::testsuite::VarnameRecord>::make(_field_); +} + +int8_t testsuite__varname_record__get__field_(testsuite__varname_record__ref instance) +{ + return ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(instance)._field_; +} + +void testsuite__varname_record__set__field_(testsuite__varname_record__ref instance, int8_t value) +{ + ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(instance)._field_ = value; +} + + diff --git a/test-suite/generated-src/c/_varname_record_.h b/test-suite/generated-src/c/_varname_record_.h new file mode 100644 index 00000000..5aee71f1 --- /dev/null +++ b/test-suite/generated-src/c/_varname_record_.h @@ -0,0 +1,26 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from varnames.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Underscore is used as a separator in Djinni names, so we don't really + * anticipate it to be used as a prefix/suffix. Some name styles behave + * badly when it is. However this test case ensures we at least don't crash. + */ +typedef djinni_record_ref testsuite__varname_record__ref; + +testsuite__varname_record__ref testsuite__varname_record__new(int8_t _field_); +int8_t testsuite__varname_record__get__field_(testsuite__varname_record__ref instance); +void testsuite__varname_record__set__field_(testsuite__varname_record__ref instance, int8_t value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/access_flags.cpp b/test-suite/generated-src/c/access_flags.cpp new file mode 100644 index 00000000..b1b84d3f --- /dev/null +++ b/test-suite/generated-src/c/access_flags.cpp @@ -0,0 +1,7 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#include "access_flags.h" +#include "djinni_c_helpers.hpp" + + diff --git a/test-suite/generated-src/c/access_flags.h b/test-suite/generated-src/c/access_flags.h new file mode 100644 index 00000000..28659dfb --- /dev/null +++ b/test-suite/generated-src/c/access_flags.h @@ -0,0 +1,28 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +enum testsuite_access_flags { + testsuite_access_flags_NOBODY = 0, + testsuite_access_flags_OWNER_READ = 1 << 0, + testsuite_access_flags_OWNER_WRITE = 1 << 1, + testsuite_access_flags_OWNER_EXECUTE = 1 << 2, + testsuite_access_flags_GROUP_READ = 1 << 3, + testsuite_access_flags_GROUP_WRITE = 1 << 4, + testsuite_access_flags_GROUP_EXECUTE = 1 << 5, + testsuite_access_flags_SYSTEM_READ = 1 << 6, + testsuite_access_flags_SYSTEM_WRITE = 1 << 7, + testsuite_access_flags_SYSTEM_EXECUTE = 1 << 8, + testsuite_access_flags_EVERYBODY = 0 | (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8), +}; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/assorted_primitives.cpp b/test-suite/generated-src/c/assorted_primitives.cpp new file mode 100644 index 00000000..e3ff12a0 --- /dev/null +++ b/test-suite/generated-src/c/assorted_primitives.cpp @@ -0,0 +1,153 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from primtypes.djinni + +#include "assorted_primitives.h" +#include "djinni_c_helpers.hpp" +#include "assorted_primitives.hpp" + +testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8_t o_eight, djinni_optional_int16_t o_sixteen, djinni_optional_int32_t o_thirtytwo, djinni_optional_int64_t o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::make(b, eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_bool>(o_b), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int8_t>(o_eight), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int16_t>(o_sixteen), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int32_t>(o_thirtytwo), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int64_t>(o_sixtyfour), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_float>(o_fthirtytwo), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_double>(o_fsixtyfour)); +} + +bool testsuite_assorted_primitives_get_b(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).b; +} + +void testsuite_assorted_primitives_set_b(testsuite_assorted_primitives_ref instance, bool value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).b = value; +} + +int8_t testsuite_assorted_primitives_get_eight(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).eight; +} + +void testsuite_assorted_primitives_set_eight(testsuite_assorted_primitives_ref instance, int8_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).eight = value; +} + +int16_t testsuite_assorted_primitives_get_sixteen(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen; +} + +void testsuite_assorted_primitives_set_sixteen(testsuite_assorted_primitives_ref instance, int16_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen = value; +} + +int32_t testsuite_assorted_primitives_get_thirtytwo(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo; +} + +void testsuite_assorted_primitives_set_thirtytwo(testsuite_assorted_primitives_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo = value; +} + +int64_t testsuite_assorted_primitives_get_sixtyfour(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour; +} + +void testsuite_assorted_primitives_set_sixtyfour(testsuite_assorted_primitives_ref instance, int64_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour = value; +} + +float testsuite_assorted_primitives_get_fthirtytwo(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo; +} + +void testsuite_assorted_primitives_set_fthirtytwo(testsuite_assorted_primitives_ref instance, float value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo = value; +} + +double testsuite_assorted_primitives_get_fsixtyfour(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour; +} + +void testsuite_assorted_primitives_set_fsixtyfour(testsuite_assorted_primitives_ref instance, double value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour = value; +} + +djinni_optional_bool testsuite_assorted_primitives_get_o_b(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_bool>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_b); +} + +void testsuite_assorted_primitives_set_o_b(testsuite_assorted_primitives_ref instance, djinni_optional_bool value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_b = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_bool>(value); +} + +djinni_optional_int8_t testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int8_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight); +} + +void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int8_t>(value); +} + +djinni_optional_int16_t testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int16_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen); +} + +void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int16_t>(value); +} + +djinni_optional_int32_t testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int32_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo); +} + +void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int32_t>(value); +} + +djinni_optional_int64_t testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int64_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour); +} + +void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64_t value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int64_t>(value); +} + +djinni_optional_float testsuite_assorted_primitives_get_o_fthirtytwo(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_float>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo); +} + +void testsuite_assorted_primitives_set_o_fthirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_float value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_float>(value); +} + +djinni_optional_double testsuite_assorted_primitives_get_o_fsixtyfour(testsuite_assorted_primitives_ref instance) +{ + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_double>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour); +} + +void testsuite_assorted_primitives_set_o_fsixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_double value) +{ + ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_double>(value); +} + + diff --git a/test-suite/generated-src/c/assorted_primitives.h b/test-suite/generated-src/c/assorted_primitives.h new file mode 100644 index 00000000..b5122ead --- /dev/null +++ b/test-suite/generated-src/c/assorted_primitives.h @@ -0,0 +1,60 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from primtypes.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_assorted_primitives_ref; + +testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8_t o_eight, djinni_optional_int16_t o_sixteen, djinni_optional_int32_t o_thirtytwo, djinni_optional_int64_t o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour); +bool testsuite_assorted_primitives_get_b(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_b(testsuite_assorted_primitives_ref instance, bool value); + +int8_t testsuite_assorted_primitives_get_eight(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_eight(testsuite_assorted_primitives_ref instance, int8_t value); + +int16_t testsuite_assorted_primitives_get_sixteen(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_sixteen(testsuite_assorted_primitives_ref instance, int16_t value); + +int32_t testsuite_assorted_primitives_get_thirtytwo(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_thirtytwo(testsuite_assorted_primitives_ref instance, int32_t value); + +int64_t testsuite_assorted_primitives_get_sixtyfour(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_sixtyfour(testsuite_assorted_primitives_ref instance, int64_t value); + +float testsuite_assorted_primitives_get_fthirtytwo(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_fthirtytwo(testsuite_assorted_primitives_ref instance, float value); + +double testsuite_assorted_primitives_get_fsixtyfour(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_fsixtyfour(testsuite_assorted_primitives_ref instance, double value); + +djinni_optional_bool testsuite_assorted_primitives_get_o_b(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_b(testsuite_assorted_primitives_ref instance, djinni_optional_bool value); + +djinni_optional_int8_t testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8_t value); + +djinni_optional_int16_t testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16_t value); + +djinni_optional_int32_t testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32_t value); + +djinni_optional_int64_t testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64_t value); + +djinni_optional_float testsuite_assorted_primitives_get_o_fthirtytwo(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_fthirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_float value); + +djinni_optional_double testsuite_assorted_primitives_get_o_fsixtyfour(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_fsixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_double value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/async_interface.cpp b/test-suite/generated-src/c/async_interface.cpp new file mode 100644 index 00000000..66cad880 --- /dev/null +++ b/test-suite/generated-src/c/async_interface.cpp @@ -0,0 +1,42 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "async_interface.h" +#include "djinni_c_helpers.hpp" +#include "Future.hpp" +#include "async_interface.hpp" +#include "djinni_c_helpers.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInterface { + AsyncInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~AsyncInterface_Proxy() override = default; + + ::djinni::Future future_roundtrip(::djinni::Future f) override { + auto f_c = ::djinni::c_api::Future::fromCpp(std::move(f)); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().future_roundtrip(Proxy_Parent::getOpaque(), f_c); + djinni_ref_release(f_c); + + auto returnValue_cpp = ::djinni::c_api::Future::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_async_interface_proxy_class_ref testsuite_async_interface_proxy_class_new(const testsuite_async_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::Future::toCpp(f)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/async_interface.h b/test-suite/generated-src/c/async_interface.h new file mode 100644 index 00000000..9d1c04e3 --- /dev/null +++ b/test-suite/generated-src/c/async_interface.h @@ -0,0 +1,30 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_async_interface_ref; +typedef djinni_proxy_class_ref testsuite_async_interface_proxy_class_ref; + +typedef struct +{ + djinni_future_ref (*future_roundtrip)(void *, djinni_future_ref); +} testsuite_async_interface_method_defs; + +testsuite_async_interface_proxy_class_ref testsuite_async_interface_proxy_class_new(const testsuite_async_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_interface_proxy_class_ref proxy_class, void *opaque); + +djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/client_interface.cpp b/test-suite/generated-src/c/client_interface.cpp new file mode 100644 index 00000000..c8c96055 --- /dev/null +++ b/test-suite/generated-src/c/client_interface.cpp @@ -0,0 +1,109 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#include "client_interface.h" +#include "djinni_c_helpers.hpp" +#include "client_interface.hpp" +#include "client_returned_record.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInterface { + ClientInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ClientInterface_Proxy() override = default; + + ::testsuite::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional & misc) override { + auto record_id_c = record_id; + auto utf8string_c = ::djinni::c_api::String::fromCpp(utf8string); + auto misc_c = ::djinni::c_api::Optional::fromCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().get_record(Proxy_Parent::getOpaque(), record_id_c, utf8string_c, misc_c); + djinni_ref_release(utf8string_c); + djinni_ref_release(misc_c); + + auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + double identifier_check(const std::vector & data, int32_t r, int64_t jret) override { + auto data_c = ::djinni::c_api::Binary::fromCpp(data); + auto r_c = r; + auto jret_c = jret; + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().identifier_check(Proxy_Parent::getOpaque(), data_c, r_c, jret_c); + djinni_ref_release(data_c); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + + std::string return_str() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { + auto i_c = ::djinni::c_api::Interface<::testsuite::ClientInterface>::fromCpp(i); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); + djinni_ref_release(i_c); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { + auto i_c = ::djinni::c_api::Optional::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ClientInterface>::fromCpp(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); + djinni_ref_release(i_c); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_client_interface_proxy_class_ref testsuite_client_interface_proxy_class_new(const testsuite_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_client_interface_ref testsuite_client_interface_new(testsuite_client_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +/** Returns record of given string */ +testsuite_client_returned_record_ref testsuite_client_interface_get_record(testsuite_client_interface_ref instance, int64_t record_id, djinni_string_ref utf8string, djinni_string_ref misc) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->get_record(record_id, ::djinni::c_api::String::toCpp(utf8string), ::djinni::c_api::Optional::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); + return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::fromCpp(std::move(retValue)); +} + +double testsuite_client_interface_identifier_check(testsuite_client_interface_ref instance, djinni_binary_ref data, int32_t r, int64_t jret) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->identifier_check(::djinni::c_api::Binary::toCpp(data), r, jret); + return std::move(retValue); +} + +djinni_string_ref testsuite_client_interface_return_str(testsuite_client_interface_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->return_str(); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_client_interface_meth_taking_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_client_interface_meth_taking_optional_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::Optional::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(std::forward(value)); })); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/client_interface.h b/test-suite/generated-src/c/client_interface.h new file mode 100644 index 00000000..77a02149 --- /dev/null +++ b/test-suite/generated-src/c/client_interface.h @@ -0,0 +1,45 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#pragma once + +#include "djinni_c.h" +#include "client_interface.h" +#include "client_returned_record.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Client interface */ +typedef djinni_interface_ref testsuite_client_interface_ref; +typedef djinni_proxy_class_ref testsuite_client_interface_proxy_class_ref; + +typedef struct +{ + testsuite_client_returned_record_ref (*get_record)(void *, int64_t, djinni_string_ref, djinni_string_ref); + double (*identifier_check)(void *, djinni_binary_ref, int32_t, int64_t); + djinni_string_ref (*return_str)(void *); + djinni_string_ref (*meth_taking_interface)(void *, testsuite_client_interface_ref); + djinni_string_ref (*meth_taking_optional_interface)(void *, testsuite_client_interface_ref); +} testsuite_client_interface_method_defs; + +testsuite_client_interface_proxy_class_ref testsuite_client_interface_proxy_class_new(const testsuite_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_client_interface_ref testsuite_client_interface_new(testsuite_client_interface_proxy_class_ref proxy_class, void *opaque); + +/** Returns record of given string */ +testsuite_client_returned_record_ref testsuite_client_interface_get_record(testsuite_client_interface_ref instance, int64_t record_id, djinni_string_ref utf8string, djinni_string_ref misc); + +double testsuite_client_interface_identifier_check(testsuite_client_interface_ref instance, djinni_binary_ref data, int32_t r, int64_t jret); + +djinni_string_ref testsuite_client_interface_return_str(testsuite_client_interface_ref instance); + +djinni_string_ref testsuite_client_interface_meth_taking_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i); + +djinni_string_ref testsuite_client_interface_meth_taking_optional_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/client_returned_record.cpp b/test-suite/generated-src/c/client_returned_record.cpp new file mode 100644 index 00000000..1c96fb04 --- /dev/null +++ b/test-suite/generated-src/c/client_returned_record.cpp @@ -0,0 +1,43 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#include "client_returned_record.h" +#include "djinni_c_helpers.hpp" +#include "client_returned_record.hpp" + +testsuite_client_returned_record_ref testsuite_client_returned_record_new(int64_t record_id, djinni_string_ref content, djinni_string_ref misc) +{ + return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::make(record_id, ::djinni::c_api::String::toCpp(content), ::djinni::c_api::Optional::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); +} + +int64_t testsuite_client_returned_record_get_record_id(testsuite_client_returned_record_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id; +} + +void testsuite_client_returned_record_set_record_id(testsuite_client_returned_record_ref instance, int64_t value) +{ + ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id = value; +} + +djinni_string_ref testsuite_client_returned_record_get_content(testsuite_client_returned_record_ref instance) +{ + return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).content); +} + +void testsuite_client_returned_record_set_content(testsuite_client_returned_record_ref instance, djinni_string_ref value) +{ + ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).content = ::djinni::c_api::String::toCpp(value); +} + +djinni_string_ref testsuite_client_returned_record_get_misc(testsuite_client_returned_record_ref instance) +{ + return ::djinni::c_api::Optional::fromCpp>(::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).misc, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); +} + +void testsuite_client_returned_record_set_misc(testsuite_client_returned_record_ref instance, djinni_string_ref value) +{ + ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).misc = ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); +} + + diff --git a/test-suite/generated-src/c/client_returned_record.h b/test-suite/generated-src/c/client_returned_record.h new file mode 100644 index 00000000..51aacf81 --- /dev/null +++ b/test-suite/generated-src/c/client_returned_record.h @@ -0,0 +1,28 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Record returned by a client */ +typedef djinni_record_ref testsuite_client_returned_record_ref; + +testsuite_client_returned_record_ref testsuite_client_returned_record_new(int64_t record_id, djinni_string_ref content, djinni_string_ref misc); +int64_t testsuite_client_returned_record_get_record_id(testsuite_client_returned_record_ref instance); +void testsuite_client_returned_record_set_record_id(testsuite_client_returned_record_ref instance, int64_t value); + +djinni_string_ref testsuite_client_returned_record_get_content(testsuite_client_returned_record_ref instance); +void testsuite_client_returned_record_set_content(testsuite_client_returned_record_ref instance, djinni_string_ref value); + +djinni_string_ref testsuite_client_returned_record_get_misc(testsuite_client_returned_record_ref instance); +void testsuite_client_returned_record_set_misc(testsuite_client_returned_record_ref instance, djinni_string_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/color.cpp b/test-suite/generated-src/c/color.cpp new file mode 100644 index 00000000..a59ddae3 --- /dev/null +++ b/test-suite/generated-src/c/color.cpp @@ -0,0 +1,7 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#include "color.h" +#include "djinni_c_helpers.hpp" + + diff --git a/test-suite/generated-src/c/color.h b/test-suite/generated-src/c/color.h new file mode 100644 index 00000000..ffb3a7fc --- /dev/null +++ b/test-suite/generated-src/c/color.h @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * This is a test + * my dude! + */ +enum testsuite_color { + testsuite_color_RED = 0, + testsuite_color_ORANGE = 1, + testsuite_color_YELLOW = 2, + testsuite_color_GREEN = 3, + testsuite_color_BLUE = 4, + /** + * "It is customary to list indigo as a color lying between blue and violet, but it has + * never seemed to me that indigo is worth the dignity of being considered a separate + * color. To my eyes it seems merely deep blue." --Isaac Asimov + */ + testsuite_color_INDIGO = 5, + testsuite_color_VIOLET = 6, +}; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/conflict_user.cpp b/test-suite/generated-src/c/conflict_user.cpp new file mode 100644 index 00000000..63d30790 --- /dev/null +++ b/test-suite/generated-src/c/conflict_user.cpp @@ -0,0 +1,54 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "conflict_user.h" +#include "djinni_c_helpers.hpp" +#include "conflict_user.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ConflictUser_Proxy: public Proxy_Parent, public ::testsuite::ConflictUser { + ConflictUser_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ConflictUser_Proxy() override = default; + + /*not-null*/ std::shared_ptr<::testsuite::Conflict> Conflict() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().Conflict(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::Conflict>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + bool conflict_arg(const std::vector> & cs) override { + auto cs_c = ::djinni::c_api::List>::fromCpp(cs, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::Conflict>::fromCpp(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().conflict_arg(Proxy_Parent::getOpaque(), cs_c); + djinni_ref_release(cs_c); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + +}; + +testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ConflictUser>::toCpp(instance)->Conflict(); + return ::djinni::c_api::Interface<::testsuite::Conflict>::fromCpp(std::move(retValue)); +} + +bool testsuite_conflict_user_conflict_arg(testsuite_conflict_user_ref instance, djinni_array_ref cs) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ConflictUser>::toCpp(instance)->conflict_arg(::djinni::c_api::List>::toCpp(cs, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::Conflict>::toCpp(std::forward(value)); })); + return std::move(retValue); +} + + diff --git a/test-suite/generated-src/c/conflict_user.h b/test-suite/generated-src/c/conflict_user.h new file mode 100644 index 00000000..7ccc97fb --- /dev/null +++ b/test-suite/generated-src/c/conflict_user.h @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" +#include "Conflict.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_conflict_user_ref; +typedef djinni_proxy_class_ref testsuite_conflict_user_proxy_class_ref; + +typedef struct +{ + testsuite_Conflict_ref (*Conflict)(void *); + bool (*conflict_arg)(void *, djinni_array_ref); +} testsuite_conflict_user_method_defs; + +testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque); + +testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance); + +bool testsuite_conflict_user_conflict_arg(testsuite_conflict_user_ref instance, djinni_array_ref cs); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constant_enum.cpp b/test-suite/generated-src/c/constant_enum.cpp new file mode 100644 index 00000000..39950e02 --- /dev/null +++ b/test-suite/generated-src/c/constant_enum.cpp @@ -0,0 +1,7 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#include "constant_enum.h" +#include "djinni_c_helpers.hpp" + + diff --git a/test-suite/generated-src/c/constant_enum.h b/test-suite/generated-src/c/constant_enum.h new file mode 100644 index 00000000..92e50a63 --- /dev/null +++ b/test-suite/generated-src/c/constant_enum.h @@ -0,0 +1,20 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** enum for use in constants */ +enum testsuite_constant_enum { + testsuite_constant_enum_SOME_VALUE = 0, + testsuite_constant_enum_SOME_OTHER_VALUE = 1, +}; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constant_interface_with_enum.cpp b/test-suite/generated-src/c/constant_interface_with_enum.cpp new file mode 100644 index 00000000..fc1a9059 --- /dev/null +++ b/test-suite/generated-src/c/constant_interface_with_enum.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#include "constant_interface_with_enum.h" +#include "djinni_c_helpers.hpp" +#include "constant_interface_with_enum.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct ConstantInterfaceWithEnum_Proxy: public Proxy_Parent, public ::testsuite::ConstantInterfaceWithEnum { + ConstantInterfaceWithEnum_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ConstantInterfaceWithEnum_Proxy() override = default; + +}; + +testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + + diff --git a/test-suite/generated-src/c/constant_interface_with_enum.h b/test-suite/generated-src/c/constant_interface_with_enum.h new file mode 100644 index 00000000..47356332 --- /dev/null +++ b/test-suite/generated-src/c/constant_interface_with_enum.h @@ -0,0 +1,28 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Interface containing enum constant */ +typedef djinni_interface_ref testsuite_constant_interface_with_enum_ref; +typedef djinni_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_ref; + +typedef struct +{ + void *reserved[1]; +} testsuite_constant_interface_with_enum_method_defs; + +testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constant_record.cpp b/test-suite/generated-src/c/constant_record.cpp new file mode 100644 index 00000000..92645d67 --- /dev/null +++ b/test-suite/generated-src/c/constant_record.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#include "constant_record.h" +#include "djinni_c_helpers.hpp" +#include "constant_record.hpp" + +testsuite_constant_record_ref testsuite_constant_record_new(int32_t some_integer, djinni_string_ref some_string) +{ + return ::djinni::c_api::Record<::testsuite::ConstantRecord>::make(some_integer, ::djinni::c_api::String::toCpp(some_string)); +} + +int32_t testsuite_constant_record_get_some_integer(testsuite_constant_record_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_integer; +} + +void testsuite_constant_record_set_some_integer(testsuite_constant_record_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_integer = value; +} + +djinni_string_ref testsuite_constant_record_get_some_string(testsuite_constant_record_ref instance) +{ + return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_string); +} + +void testsuite_constant_record_set_some_string(testsuite_constant_record_ref instance, djinni_string_ref value) +{ + ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_string = ::djinni::c_api::String::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/constant_record.h b/test-suite/generated-src/c/constant_record.h new file mode 100644 index 00000000..e0604398 --- /dev/null +++ b/test-suite/generated-src/c/constant_record.h @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Record for use in constants */ +typedef djinni_record_ref testsuite_constant_record_ref; + +testsuite_constant_record_ref testsuite_constant_record_new(int32_t some_integer, djinni_string_ref some_string); +int32_t testsuite_constant_record_get_some_integer(testsuite_constant_record_ref instance); +void testsuite_constant_record_set_some_integer(testsuite_constant_record_ref instance, int32_t value); + +djinni_string_ref testsuite_constant_record_get_some_string(testsuite_constant_record_ref instance); +void testsuite_constant_record_set_some_string(testsuite_constant_record_ref instance, djinni_string_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constant_with_enum.cpp b/test-suite/generated-src/c/constant_with_enum.cpp new file mode 100644 index 00000000..a53953f5 --- /dev/null +++ b/test-suite/generated-src/c/constant_with_enum.cpp @@ -0,0 +1,13 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#include "constant_with_enum.h" +#include "djinni_c_helpers.hpp" +#include "constant_with_enum.hpp" + +testsuite_constant_with_enum_ref testsuite_constant_with_enum_new() +{ + return ::djinni::c_api::Record<::testsuite::ConstantWithEnum>::make(); +} + + diff --git a/test-suite/generated-src/c/constant_with_enum.h b/test-suite/generated-src/c/constant_with_enum.h new file mode 100644 index 00000000..ed5595e2 --- /dev/null +++ b/test-suite/generated-src/c/constant_with_enum.h @@ -0,0 +1,19 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Record containing enum constant */ +typedef djinni_record_ref testsuite_constant_with_enum_ref; + +testsuite_constant_with_enum_ref testsuite_constant_with_enum_new(); +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constants.cpp b/test-suite/generated-src/c/constants.cpp new file mode 100644 index 00000000..af1b4a26 --- /dev/null +++ b/test-suite/generated-src/c/constants.cpp @@ -0,0 +1,13 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#include "constants.h" +#include "djinni_c_helpers.hpp" +#include "constants.hpp" + +testsuite_constants_ref testsuite_constants_new() +{ + return ::djinni::c_api::Record<::testsuite::Constants>::make(); +} + + diff --git a/test-suite/generated-src/c/constants.h b/test-suite/generated-src/c/constants.h new file mode 100644 index 00000000..60957820 --- /dev/null +++ b/test-suite/generated-src/c/constants.h @@ -0,0 +1,19 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Record containing constants */ +typedef djinni_record_ref testsuite_constants_ref; + +testsuite_constants_ref testsuite_constants_new(); +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/constants_interface.cpp b/test-suite/generated-src/c/constants_interface.cpp new file mode 100644 index 00000000..9e97f27d --- /dev/null +++ b/test-suite/generated-src/c/constants_interface.cpp @@ -0,0 +1,38 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#include "constants_interface.h" +#include "djinni_c_helpers.hpp" +#include "constants_interface.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct ConstantsInterface_Proxy: public Proxy_Parent, public ::testsuite::ConstantsInterface { + ConstantsInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ConstantsInterface_Proxy() override = default; + + void dummy() override { + Proxy_Parent::getProxyClass().methodDefs().dummy(Proxy_Parent::getOpaque()); + } + +}; + +testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +/** + * No support for null optional constants + * No support for optional constant records + * No support for constant binary, list, set, map + */ +void testsuite_constants_interface_dummy(testsuite_constants_interface_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::ConstantsInterface>::toCpp(instance)->dummy(); +} + + diff --git a/test-suite/generated-src/c/constants_interface.h b/test-suite/generated-src/c/constants_interface.h new file mode 100644 index 00000000..b69b0864 --- /dev/null +++ b/test-suite/generated-src/c/constants_interface.h @@ -0,0 +1,35 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Interface containing constants */ +typedef djinni_interface_ref testsuite_constants_interface_ref; +typedef djinni_proxy_class_ref testsuite_constants_interface_proxy_class_ref; + +typedef struct +{ + void (*dummy)(void *); +} testsuite_constants_interface_method_defs; + +testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque); + +/** + * No support for null optional constants + * No support for optional constant records + * No support for constant binary, list, set, map + */ +void testsuite_constants_interface_dummy(testsuite_constants_interface_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/cpp_exception.cpp b/test-suite/generated-src/c/cpp_exception.cpp new file mode 100644 index 00000000..35cbe06c --- /dev/null +++ b/test-suite/generated-src/c/cpp_exception.cpp @@ -0,0 +1,75 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#include "cpp_exception.h" +#include "djinni_c_helpers.hpp" +#include "cpp_exception.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException { + CppException_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~CppException_Proxy() override = default; + + int32_t throw_an_exception() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().throw_an_exception(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + + int32_t call_throwing_interface(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { + auto cb_c = ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::fromCpp(cb); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_interface(Proxy_Parent::getOpaque(), cb_c); + djinni_ref_release(cb_c); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + + std::string call_throwing_and_catch(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { + auto cb_c = ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::fromCpp(cb); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_and_catch(Proxy_Parent::getOpaque(), cb_c); + djinni_ref_release(cb_c); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->throw_an_exception(); + return std::move(retValue); +} + +int32_t testsuite_cpp_exception_call_throwing_interface(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->call_throwing_interface(::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(cb)); + return std::move(retValue); +} + +djinni_string_ref testsuite_cpp_exception_call_throwing_and_catch(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->call_throwing_and_catch(::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(cb)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +testsuite_cpp_exception_ref testsuite_cpp_exception_get() +{ + auto retValue = ::testsuite::CppException::get(); + return ::djinni::c_api::Interface<::testsuite::CppException>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/cpp_exception.h b/test-suite/generated-src/c/cpp_exception.h new file mode 100644 index 00000000..ba879556 --- /dev/null +++ b/test-suite/generated-src/c/cpp_exception.h @@ -0,0 +1,40 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#pragma once + +#include "djinni_c.h" +#include "cpp_exception.h" +#include "throwing_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_cpp_exception_ref; +typedef djinni_proxy_class_ref testsuite_cpp_exception_proxy_class_ref; + +typedef struct +{ + int32_t (*throw_an_exception)(void *); + int32_t (*call_throwing_interface)(void *, testsuite_throwing_interface_ref); + djinni_string_ref (*call_throwing_and_catch)(void *, testsuite_throwing_interface_ref); + testsuite_cpp_exception_ref (*get)(void *); +} testsuite_cpp_exception_method_defs; + +testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque); + +int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance); + +int32_t testsuite_cpp_exception_call_throwing_interface(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb); + +djinni_string_ref testsuite_cpp_exception_call_throwing_and_catch(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb); + +testsuite_cpp_exception_ref testsuite_cpp_exception_get(); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/date_record.cpp b/test-suite/generated-src/c/date_record.cpp new file mode 100644 index 00000000..7e36b617 --- /dev/null +++ b/test-suite/generated-src/c/date_record.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from date.djinni + +#include "date_record.h" +#include "djinni_c_helpers.hpp" +#include "date_record.hpp" +#include "djinni_c_helpers.hpp" +#include + +testsuite_date_record_ref testsuite_date_record_new(djinni_date_ref created_at) +{ + return ::djinni::c_api::Record<::testsuite::DateRecord>::make(::djinni::c_api::Date::toCpp(created_at)); +} + +djinni_date_ref testsuite_date_record_get_created_at(testsuite_date_record_ref instance) +{ + return ::djinni::c_api::Date::fromCpp(::djinni::c_api::Record<::testsuite::DateRecord>::toCpp(instance).created_at); +} + +void testsuite_date_record_set_created_at(testsuite_date_record_ref instance, djinni_date_ref value) +{ + ::djinni::c_api::Record<::testsuite::DateRecord>::toCpp(instance).created_at = ::djinni::c_api::Date::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/date_record.h b/test-suite/generated-src/c/date_record.h new file mode 100644 index 00000000..7ac29fd8 --- /dev/null +++ b/test-suite/generated-src/c/date_record.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from date.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_date_record_ref; + +testsuite_date_record_ref testsuite_date_record_new(djinni_date_ref created_at); +djinni_date_ref testsuite_date_record_get_created_at(testsuite_date_record_ref instance); +void testsuite_date_record_set_created_at(testsuite_date_record_ref instance, djinni_date_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/empty_flags.cpp b/test-suite/generated-src/c/empty_flags.cpp new file mode 100644 index 00000000..fb84b46e --- /dev/null +++ b/test-suite/generated-src/c/empty_flags.cpp @@ -0,0 +1,7 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#include "empty_flags.h" +#include "djinni_c_helpers.hpp" + + diff --git a/test-suite/generated-src/c/empty_flags.h b/test-suite/generated-src/c/empty_flags.h new file mode 100644 index 00000000..9a282571 --- /dev/null +++ b/test-suite/generated-src/c/empty_flags.h @@ -0,0 +1,19 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +enum testsuite_empty_flags { + testsuite_empty_flags_NONE = 0, + testsuite_empty_flags_ALL = 0, +}; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/empty_record.cpp b/test-suite/generated-src/c/empty_record.cpp new file mode 100644 index 00000000..46b48015 --- /dev/null +++ b/test-suite/generated-src/c/empty_record.cpp @@ -0,0 +1,13 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "empty_record.h" +#include "djinni_c_helpers.hpp" +#include "empty_record.hpp" + +testsuite_empty_record_ref testsuite_empty_record_new() +{ + return ::djinni::c_api::Record<::testsuite::EmptyRecord>::make(); +} + + diff --git a/test-suite/generated-src/c/empty_record.h b/test-suite/generated-src/c/empty_record.h new file mode 100644 index 00000000..f80b5a97 --- /dev/null +++ b/test-suite/generated-src/c/empty_record.h @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Empty record + * (Second line of multi-line documentation. + * Indented third line of multi-line documentation.) + */ +typedef djinni_record_ref testsuite_empty_record_ref; + +testsuite_empty_record_ref testsuite_empty_record_new(); +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/enum_usage_interface.cpp b/test-suite/generated-src/c/enum_usage_interface.cpp new file mode 100644 index 00000000..cc8ee0df --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_interface.cpp @@ -0,0 +1,103 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#include "enum_usage_interface.h" +#include "djinni_c_helpers.hpp" +#include "color.hpp" +#include "enum_usage_interface.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct EnumUsageInterface_Proxy: public Proxy_Parent, public ::testsuite::EnumUsageInterface { + EnumUsageInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~EnumUsageInterface_Proxy() override = default; + + ::testsuite::color e(::testsuite::color e) override { + auto e_c = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(e); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().e(Proxy_Parent::getOpaque(), e_c); + + auto returnValue_cpp = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(returnValue); + return returnValue_cpp; + } + + std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> o) override { + auto o_c = ::djinni::c_api::Optional::fromCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().o(Proxy_Parent::getOpaque(), o_c); + djinni_ref_release(o_c); + + auto returnValue_cpp = ::djinni::c_api::Optional::toCpp>(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & l) override { + auto l_c = ::djinni::c_api::List<::testsuite::color>::fromCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().l(Proxy_Parent::getOpaque(), l_c); + djinni_ref_release(l_c); + + auto returnValue_cpp = ::djinni::c_api::List<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & s) override { + auto s_c = ::djinni::c_api::Set<::testsuite::color>::fromCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().s(Proxy_Parent::getOpaque(), s_c); + djinni_ref_release(s_c); + + auto returnValue_cpp = ::djinni::c_api::Set<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & m) override { + auto m_c = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().m(Proxy_Parent::getOpaque(), m_c); + djinni_ref_release(m_c); + + auto returnValue_cpp = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(returnValue, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->e(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(e)); + return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_enum_usage_interface_o(testsuite_enum_usage_interface_ref instance, djinni_number_ref o) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->o(::djinni::c_api::Optional::toCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +djinni_array_ref testsuite_enum_usage_interface_l(testsuite_enum_usage_interface_ref instance, djinni_array_ref l) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->l(::djinni::c_api::List<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::List<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +djinni_array_ref testsuite_enum_usage_interface_s(testsuite_enum_usage_interface_ref instance, djinni_array_ref s) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->s(::djinni::c_api::Set<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::Set<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +djinni_keyval_array_ref testsuite_enum_usage_interface_m(testsuite_enum_usage_interface_ref instance, djinni_keyval_array_ref m) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->m(::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); + return ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); +} + + diff --git a/test-suite/generated-src/c/enum_usage_interface.h b/test-suite/generated-src/c/enum_usage_interface.h new file mode 100644 index 00000000..06507271 --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_interface.h @@ -0,0 +1,42 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#pragma once + +#include "djinni_c.h" +#include "color.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_enum_usage_interface_ref; +typedef djinni_proxy_class_ref testsuite_enum_usage_interface_proxy_class_ref; + +typedef struct +{ + testsuite_color (*e)(void *, testsuite_color); + djinni_number_ref (*o)(void *, djinni_number_ref); + djinni_array_ref (*l)(void *, djinni_array_ref); + djinni_array_ref (*s)(void *, djinni_array_ref); + djinni_keyval_array_ref (*m)(void *, djinni_keyval_array_ref); +} testsuite_enum_usage_interface_method_defs; + +testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque); + +testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e); + +djinni_number_ref testsuite_enum_usage_interface_o(testsuite_enum_usage_interface_ref instance, djinni_number_ref o); + +djinni_array_ref testsuite_enum_usage_interface_l(testsuite_enum_usage_interface_ref instance, djinni_array_ref l); + +djinni_array_ref testsuite_enum_usage_interface_s(testsuite_enum_usage_interface_ref instance, djinni_array_ref s); + +djinni_keyval_array_ref testsuite_enum_usage_interface_m(testsuite_enum_usage_interface_ref instance, djinni_keyval_array_ref m); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/enum_usage_record.cpp b/test-suite/generated-src/c/enum_usage_record.cpp new file mode 100644 index 00000000..fbd1b7ae --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_record.cpp @@ -0,0 +1,64 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#include "enum_usage_record.h" +#include "djinni_c_helpers.hpp" +#include "color.hpp" +#include "enum_usage_record.hpp" + +testsuite_enum_usage_record_ref testsuite_enum_usage_record_new(testsuite_color e, djinni_number_ref o, djinni_array_ref l, djinni_array_ref s, djinni_keyval_array_ref m) +{ + return ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::make(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(e), ::djinni::c_api::Optional::toCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::List<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::Set<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); +} + +testsuite_color testsuite_enum_usage_record_get_e(testsuite_enum_usage_record_ref instance) +{ + return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).e); +} + +void testsuite_enum_usage_record_set_e(testsuite_enum_usage_record_ref instance, testsuite_color value) +{ + ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).e = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(value); +} + +djinni_number_ref testsuite_enum_usage_record_get_o(testsuite_enum_usage_record_ref instance) +{ + return ::djinni::c_api::Optional::fromCpp>(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +void testsuite_enum_usage_record_set_o(testsuite_enum_usage_record_ref instance, djinni_number_ref value) +{ + ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).o = ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); +} + +djinni_array_ref testsuite_enum_usage_record_get_l(testsuite_enum_usage_record_ref instance) +{ + return ::djinni::c_api::List<::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +void testsuite_enum_usage_record_set_l(testsuite_enum_usage_record_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).l = ::djinni::c_api::List<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); +} + +djinni_array_ref testsuite_enum_usage_record_get_s(testsuite_enum_usage_record_ref instance) +{ + return ::djinni::c_api::Set<::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); +} + +void testsuite_enum_usage_record_set_s(testsuite_enum_usage_record_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).s = ::djinni::c_api::Set<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); +} + +djinni_keyval_array_ref testsuite_enum_usage_record_get_m(testsuite_enum_usage_record_ref instance) +{ + return ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); +} + +void testsuite_enum_usage_record_set_m(testsuite_enum_usage_record_ref instance, djinni_keyval_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).m = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); +} + + diff --git a/test-suite/generated-src/c/enum_usage_record.h b/test-suite/generated-src/c/enum_usage_record.h new file mode 100644 index 00000000..a2ed59e2 --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_record.h @@ -0,0 +1,34 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#pragma once + +#include "djinni_c.h" +#include "color.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_enum_usage_record_ref; + +testsuite_enum_usage_record_ref testsuite_enum_usage_record_new(testsuite_color e, djinni_number_ref o, djinni_array_ref l, djinni_array_ref s, djinni_keyval_array_ref m); +testsuite_color testsuite_enum_usage_record_get_e(testsuite_enum_usage_record_ref instance); +void testsuite_enum_usage_record_set_e(testsuite_enum_usage_record_ref instance, testsuite_color value); + +djinni_number_ref testsuite_enum_usage_record_get_o(testsuite_enum_usage_record_ref instance); +void testsuite_enum_usage_record_set_o(testsuite_enum_usage_record_ref instance, djinni_number_ref value); + +djinni_array_ref testsuite_enum_usage_record_get_l(testsuite_enum_usage_record_ref instance); +void testsuite_enum_usage_record_set_l(testsuite_enum_usage_record_ref instance, djinni_array_ref value); + +djinni_array_ref testsuite_enum_usage_record_get_s(testsuite_enum_usage_record_ref instance); +void testsuite_enum_usage_record_set_s(testsuite_enum_usage_record_ref instance, djinni_array_ref value); + +djinni_keyval_array_ref testsuite_enum_usage_record_get_m(testsuite_enum_usage_record_ref instance); +void testsuite_enum_usage_record_set_m(testsuite_enum_usage_record_ref instance, djinni_keyval_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/extended_record.cpp b/test-suite/generated-src/c/extended_record.cpp new file mode 100644 index 00000000..2c073793 --- /dev/null +++ b/test-suite/generated-src/c/extended_record.cpp @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#include "extended_record.h" +#include "djinni_c_helpers.hpp" +#include "extended_record.hpp" + +testsuite_extended_record_ref testsuite_extended_record_new(bool foo) +{ + return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::make(foo); +} + +bool testsuite_extended_record_get_foo(testsuite_extended_record_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(instance).foo; +} + +void testsuite_extended_record_set_foo(testsuite_extended_record_ref instance, bool value) +{ + ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(instance).foo = value; +} + + diff --git a/test-suite/generated-src/c/extended_record.h b/test-suite/generated-src/c/extended_record.h new file mode 100644 index 00000000..1d402933 --- /dev/null +++ b/test-suite/generated-src/c/extended_record.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Extended record */ +typedef djinni_record_ref testsuite_extended_record_ref; + +testsuite_extended_record_ref testsuite_extended_record_new(bool foo); +bool testsuite_extended_record_get_foo(testsuite_extended_record_ref instance); +void testsuite_extended_record_set_foo(testsuite_extended_record_ref instance, bool value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/first_listener.cpp b/test-suite/generated-src/c/first_listener.cpp new file mode 100644 index 00000000..7b121a46 --- /dev/null +++ b/test-suite/generated-src/c/first_listener.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "first_listener.h" +#include "djinni_c_helpers.hpp" +#include "first_listener.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct FirstListener_Proxy: public Proxy_Parent, public ::testsuite::FirstListener { + FirstListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~FirstListener_Proxy() override = default; + + void first() override { + Proxy_Parent::getProxyClass().methodDefs().first(Proxy_Parent::getOpaque()); + } + +}; + +testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +void testsuite_first_listener_first(testsuite_first_listener_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::FirstListener>::toCpp(instance)->first(); +} + + diff --git a/test-suite/generated-src/c/first_listener.h b/test-suite/generated-src/c/first_listener.h new file mode 100644 index 00000000..a34042ac --- /dev/null +++ b/test-suite/generated-src/c/first_listener.h @@ -0,0 +1,30 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Used for ObjC multiple inheritance tests */ +typedef djinni_interface_ref testsuite_first_listener_ref; +typedef djinni_proxy_class_ref testsuite_first_listener_proxy_class_ref; + +typedef struct +{ + void (*first)(void *); +} testsuite_first_listener_method_defs; + +testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque); + +void testsuite_first_listener_first(testsuite_first_listener_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/flag_roundtrip.cpp b/test-suite/generated-src/c/flag_roundtrip.cpp new file mode 100644 index 00000000..abae4498 --- /dev/null +++ b/test-suite/generated-src/c/flag_roundtrip.cpp @@ -0,0 +1,50 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#include "flag_roundtrip.h" +#include "djinni_c_helpers.hpp" +#include "access_flags.hpp" +#include "empty_flags.hpp" +#include "flag_roundtrip.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct FlagRoundtrip_Proxy: public Proxy_Parent, public ::testsuite::FlagRoundtrip { + FlagRoundtrip_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~FlagRoundtrip_Proxy() override = default; + +}; + +testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag) +{ + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access(::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(flag)); + return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCpp(std::move(retValue)); +} + +testsuite_empty_flags testsuite_flag_roundtrip_roundtrip_empty(testsuite_empty_flags flag) +{ + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty(::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::toCpp(flag)); + return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_flag_roundtrip_roundtrip_access_boxed(djinni_number_ref flag) +{ + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access_boxed(::djinni::c_api::Optional::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCppBoxed(std::forward(value)); }); +} + +djinni_number_ref testsuite_flag_roundtrip_roundtrip_empty_boxed(djinni_number_ref flag) +{ + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty_boxed(::djinni::c_api::Optional::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::fromCppBoxed(std::forward(value)); }); +} + + diff --git a/test-suite/generated-src/c/flag_roundtrip.h b/test-suite/generated-src/c/flag_roundtrip.h new file mode 100644 index 00000000..7331f656 --- /dev/null +++ b/test-suite/generated-src/c/flag_roundtrip.h @@ -0,0 +1,40 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#pragma once + +#include "djinni_c.h" +#include "access_flags.h" +#include "empty_flags.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_flag_roundtrip_ref; +typedef djinni_proxy_class_ref testsuite_flag_roundtrip_proxy_class_ref; + +typedef struct +{ + testsuite_access_flags (*roundtrip_access)(void *, testsuite_access_flags); + testsuite_empty_flags (*roundtrip_empty)(void *, testsuite_empty_flags); + djinni_number_ref (*roundtrip_access_boxed)(void *, djinni_number_ref); + djinni_number_ref (*roundtrip_empty_boxed)(void *, djinni_number_ref); +} testsuite_flag_roundtrip_method_defs; + +testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque); + +testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag); + +testsuite_empty_flags testsuite_flag_roundtrip_roundtrip_empty(testsuite_empty_flags flag); + +djinni_number_ref testsuite_flag_roundtrip_roundtrip_access_boxed(djinni_number_ref flag); + +djinni_number_ref testsuite_flag_roundtrip_roundtrip_empty_boxed(djinni_number_ref flag); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/interface_using_extended_record.cpp b/test-suite/generated-src/c/interface_using_extended_record.cpp new file mode 100644 index 00000000..a7ab4056 --- /dev/null +++ b/test-suite/generated-src/c/interface_using_extended_record.cpp @@ -0,0 +1,41 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#include "interface_using_extended_record.h" +#include "djinni_c_helpers.hpp" +#include "../../handwritten-src/cpp/extended_record.hpp" +#include "interface_using_extended_record.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct InterfaceUsingExtendedRecord_Proxy: public Proxy_Parent, public ::testsuite::InterfaceUsingExtendedRecord { + InterfaceUsingExtendedRecord_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~InterfaceUsingExtendedRecord_Proxy() override = default; + + ::testsuite::ExtendedRecord meth(const ::testsuite::ExtendedRecord & er) override { + auto er_c = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(er); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth(Proxy_Parent::getOpaque(), er_c); + djinni_ref_release(er_c); + + auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::InterfaceUsingExtendedRecord>::toCpp(instance)->meth(::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(er)); + return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/interface_using_extended_record.h b/test-suite/generated-src/c/interface_using_extended_record.h new file mode 100644 index 00000000..c5b2dfee --- /dev/null +++ b/test-suite/generated-src/c/interface_using_extended_record.h @@ -0,0 +1,30 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#pragma once + +#include "djinni_c.h" +#include "extended_record.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_interface_using_extended_record_ref; +typedef djinni_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_ref; + +typedef struct +{ + testsuite_extended_record_ref (*meth)(void *, testsuite_extended_record_ref); +} testsuite_interface_using_extended_record_method_defs; + +testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque); + +testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/java_only_listener.cpp b/test-suite/generated-src/c/java_only_listener.cpp new file mode 100644 index 00000000..bffda540 --- /dev/null +++ b/test-suite/generated-src/c/java_only_listener.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#include "java_only_listener.h" +#include "djinni_c_helpers.hpp" +#include "java_only_listener.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct JavaOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::JavaOnlyListener { + JavaOnlyListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~JavaOnlyListener_Proxy() override = default; + +}; + +testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + + diff --git a/test-suite/generated-src/c/java_only_listener.h b/test-suite/generated-src/c/java_only_listener.h new file mode 100644 index 00000000..87fd8c92 --- /dev/null +++ b/test-suite/generated-src/c/java_only_listener.h @@ -0,0 +1,27 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_java_only_listener_ref; +typedef djinni_proxy_class_ref testsuite_java_only_listener_proxy_class_ref; + +typedef struct +{ + void *reserved[1]; +} testsuite_java_only_listener_method_defs; + +testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/listener_caller.cpp b/test-suite/generated-src/c/listener_caller.cpp new file mode 100644 index 00000000..ff4adc6f --- /dev/null +++ b/test-suite/generated-src/c/listener_caller.cpp @@ -0,0 +1,49 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "listener_caller.h" +#include "djinni_c_helpers.hpp" +#include "listener_caller.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ListenerCaller_Proxy: public Proxy_Parent, public ::testsuite::ListenerCaller { + ListenerCaller_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ListenerCaller_Proxy() override = default; + + void callFirst() override { + Proxy_Parent::getProxyClass().methodDefs().callFirst(Proxy_Parent::getOpaque()); + } + + void callSecond() override { + Proxy_Parent::getProxyClass().methodDefs().callSecond(Proxy_Parent::getOpaque()); + } + +}; + +testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l) +{ + auto retValue = ::testsuite::ListenerCaller::init(::djinni::c_api::Interface<::testsuite::FirstListener>::toCpp(first_l), ::djinni::c_api::Interface<::testsuite::SecondListener>::toCpp(second_l)); + return ::djinni::c_api::Interface<::testsuite::ListenerCaller>::fromCpp(std::move(retValue)); +} + +void testsuite_listener_caller_callFirst(testsuite_listener_caller_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::ListenerCaller>::toCpp(instance)->callFirst(); +} + +void testsuite_listener_caller_callSecond(testsuite_listener_caller_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::ListenerCaller>::toCpp(instance)->callSecond(); +} + + diff --git a/test-suite/generated-src/c/listener_caller.h b/test-suite/generated-src/c/listener_caller.h new file mode 100644 index 00000000..e65df48a --- /dev/null +++ b/test-suite/generated-src/c/listener_caller.h @@ -0,0 +1,44 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#pragma once + +#include "djinni_c.h" +#include "first_listener.h" +#include "listener_caller.h" +#include "second_listener.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Tester for the ability to call two interfaces which might be + * implemented on the same object. That's not relevant in all + * languages, due to the details of multiple inheritance and object + * comparison. + */ +typedef djinni_interface_ref testsuite_listener_caller_ref; +typedef djinni_proxy_class_ref testsuite_listener_caller_proxy_class_ref; + +typedef struct +{ + testsuite_listener_caller_ref (*init)(void *, testsuite_first_listener_ref, testsuite_second_listener_ref); + void (*callFirst)(void *); + void (*callSecond)(void *); +} testsuite_listener_caller_method_defs; + +testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque); + +testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l); + +void testsuite_listener_caller_callFirst(testsuite_listener_caller_ref instance); + +void testsuite_listener_caller_callSecond(testsuite_listener_caller_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/map_date_record.cpp b/test-suite/generated-src/c/map_date_record.cpp new file mode 100644 index 00000000..033b18fa --- /dev/null +++ b/test-suite/generated-src/c/map_date_record.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from date.djinni + +#include "map_date_record.h" +#include "djinni_c_helpers.hpp" +#include "djinni_c_helpers.hpp" +#include "map_date_record.hpp" +#include + +testsuite_map_date_record_ref testsuite_map_date_record_new(djinni_keyval_array_ref dates_by_id) +{ + return ::djinni::c_api::Record<::testsuite::MapDateRecord>::make(::djinni::c_api::Map::toCpp(dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Date::toCpp(value)); })); +} + +djinni_keyval_array_ref testsuite_map_date_record_get_dates_by_id(testsuite_map_date_record_ref instance) +{ + return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Date::fromCpp(value)); }); +} + +void testsuite_map_date_record_set_dates_by_id(testsuite_map_date_record_ref instance, djinni_keyval_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Date::toCpp(value)); }); +} + + diff --git a/test-suite/generated-src/c/map_date_record.h b/test-suite/generated-src/c/map_date_record.h new file mode 100644 index 00000000..e1b39ed2 --- /dev/null +++ b/test-suite/generated-src/c/map_date_record.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from date.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_map_date_record_ref; + +testsuite_map_date_record_ref testsuite_map_date_record_new(djinni_keyval_array_ref dates_by_id); +djinni_keyval_array_ref testsuite_map_date_record_get_dates_by_id(testsuite_map_date_record_ref instance); +void testsuite_map_date_record_set_dates_by_id(testsuite_map_date_record_ref instance, djinni_keyval_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/map_list_record.cpp b/test-suite/generated-src/c/map_list_record.cpp new file mode 100644 index 00000000..1250978c --- /dev/null +++ b/test-suite/generated-src/c/map_list_record.cpp @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from map.djinni + +#include "map_list_record.h" +#include "djinni_c_helpers.hpp" +#include "map_list_record.hpp" + +testsuite_map_list_record_ref testsuite_map_list_record_new(djinni_array_ref map_list) +{ + return ::djinni::c_api::Record<::testsuite::MapListRecord>::make(::djinni::c_api::List>::toCpp(map_list, [](auto&& value) { return ::djinni::c_api::Map::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); })); +} + +djinni_array_ref testsuite_map_list_record_get_map_list(testsuite_map_list_record_ref instance) +{ + return ::djinni::c_api::List>::fromCpp(::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(instance).map_list, [](auto&& value) { return ::djinni::c_api::Map::fromCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); }); +} + +void testsuite_map_list_record_set_map_list(testsuite_map_list_record_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(instance).map_list = ::djinni::c_api::List>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Map::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); }); +} + + diff --git a/test-suite/generated-src/c/map_list_record.h b/test-suite/generated-src/c/map_list_record.h new file mode 100644 index 00000000..778ff3c9 --- /dev/null +++ b/test-suite/generated-src/c/map_list_record.h @@ -0,0 +1,21 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from map.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_map_list_record_ref; + +testsuite_map_list_record_ref testsuite_map_list_record_new(djinni_array_ref map_list); +djinni_array_ref testsuite_map_list_record_get_map_list(testsuite_map_list_record_ref instance); +void testsuite_map_list_record_set_map_list(testsuite_map_list_record_ref instance, djinni_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/map_record.cpp b/test-suite/generated-src/c/map_record.cpp new file mode 100644 index 00000000..8bec49b7 --- /dev/null +++ b/test-suite/generated-src/c/map_record.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from map.djinni + +#include "map_record.h" +#include "djinni_c_helpers.hpp" +#include "map_record.hpp" + +testsuite_map_record_ref testsuite_map_record_new(djinni_keyval_array_ref map, djinni_keyval_array_ref imap) +{ + return ::djinni::c_api::Record<::testsuite::MapRecord>::make(::djinni::c_api::Map::toCpp(map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }), ::djinni::c_api::Map::toCpp(imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); +} + +djinni_keyval_array_ref testsuite_map_record_get_map(testsuite_map_record_ref instance) +{ + return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); +} + +void testsuite_map_record_set_map(testsuite_map_record_ref instance, djinni_keyval_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).map = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); +} + +djinni_keyval_array_ref testsuite_map_record_get_imap(testsuite_map_record_ref instance) +{ + return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); +} + +void testsuite_map_record_set_imap(testsuite_map_record_ref instance, djinni_keyval_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).imap = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); +} + + diff --git a/test-suite/generated-src/c/map_record.h b/test-suite/generated-src/c/map_record.h new file mode 100644 index 00000000..c14fff02 --- /dev/null +++ b/test-suite/generated-src/c/map_record.h @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from map.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_map_record_ref; + +testsuite_map_record_ref testsuite_map_record_new(djinni_keyval_array_ref map, djinni_keyval_array_ref imap); +djinni_keyval_array_ref testsuite_map_record_get_map(testsuite_map_record_ref instance); +void testsuite_map_record_set_map(testsuite_map_record_ref instance, djinni_keyval_array_ref value); + +djinni_keyval_array_ref testsuite_map_record_get_imap(testsuite_map_record_ref instance); +void testsuite_map_record_set_imap(testsuite_map_record_ref instance, djinni_keyval_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/nested_collection.cpp b/test-suite/generated-src/c/nested_collection.cpp new file mode 100644 index 00000000..0d313dbd --- /dev/null +++ b/test-suite/generated-src/c/nested_collection.cpp @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from nested_collection.djinni + +#include "nested_collection.h" +#include "djinni_c_helpers.hpp" +#include "nested_collection.hpp" + +testsuite_nested_collection_ref testsuite_nested_collection_new(djinni_array_ref set_list) +{ + return ::djinni::c_api::Record<::testsuite::NestedCollection>::make(::djinni::c_api::List>::toCpp(set_list, [](auto&& value) { return ::djinni::c_api::Set::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); +} + +djinni_array_ref testsuite_nested_collection_get_set_list(testsuite_nested_collection_ref instance) +{ + return ::djinni::c_api::List>::fromCpp(::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(instance).set_list, [](auto&& value) { return ::djinni::c_api::Set::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); +} + +void testsuite_nested_collection_set_set_list(testsuite_nested_collection_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(instance).set_list = ::djinni::c_api::List>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Set::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); }); +} + + diff --git a/test-suite/generated-src/c/nested_collection.h b/test-suite/generated-src/c/nested_collection.h new file mode 100644 index 00000000..67ea9e24 --- /dev/null +++ b/test-suite/generated-src/c/nested_collection.h @@ -0,0 +1,21 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from nested_collection.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_nested_collection_ref; + +testsuite_nested_collection_ref testsuite_nested_collection_new(djinni_array_ref set_list); +djinni_array_ref testsuite_nested_collection_get_set_list(testsuite_nested_collection_ref instance); +void testsuite_nested_collection_set_set_list(testsuite_nested_collection_ref instance, djinni_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/nested_outcome.cpp b/test-suite/generated-src/c/nested_outcome.cpp new file mode 100644 index 00000000..e5244d09 --- /dev/null +++ b/test-suite/generated-src/c/nested_outcome.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from outcome.djinni + +#include "nested_outcome.h" +#include "djinni_c_helpers.hpp" +#include "djinni_c_helpers.hpp" +#include "expected.hpp" +#include "nested_outcome.hpp" + +testsuite_nested_outcome_ref testsuite_nested_outcome_new(djinni_outcome_ref o) +{ + return ::djinni::c_api::Record<::testsuite::NestedOutcome>::make(::djinni::c_api::Outcome::toCpp(o)); +} + +djinni_outcome_ref testsuite_nested_outcome_get_o(testsuite_nested_outcome_ref instance) +{ + return ::djinni::c_api::Outcome::fromCpp(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(instance).o); +} + +void testsuite_nested_outcome_set_o(testsuite_nested_outcome_ref instance, djinni_outcome_ref value) +{ + ::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::Outcome::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/nested_outcome.h b/test-suite/generated-src/c/nested_outcome.h new file mode 100644 index 00000000..26279a42 --- /dev/null +++ b/test-suite/generated-src/c/nested_outcome.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from outcome.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_nested_outcome_ref; + +testsuite_nested_outcome_ref testsuite_nested_outcome_new(djinni_outcome_ref o); +djinni_outcome_ref testsuite_nested_outcome_get_o(testsuite_nested_outcome_ref instance); +void testsuite_nested_outcome_set_o(testsuite_nested_outcome_ref instance, djinni_outcome_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/objc_only_listener.cpp b/test-suite/generated-src/c/objc_only_listener.cpp new file mode 100644 index 00000000..b4179ac7 --- /dev/null +++ b/test-suite/generated-src/c/objc_only_listener.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#include "objc_only_listener.h" +#include "djinni_c_helpers.hpp" +#include "objc_only_listener.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct ObjcOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::ObjcOnlyListener { + ObjcOnlyListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ObjcOnlyListener_Proxy() override = default; + +}; + +testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + + diff --git a/test-suite/generated-src/c/objc_only_listener.h b/test-suite/generated-src/c/objc_only_listener.h new file mode 100644 index 00000000..3823ecc1 --- /dev/null +++ b/test-suite/generated-src/c/objc_only_listener.h @@ -0,0 +1,27 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_objc_only_listener_ref; +typedef djinni_proxy_class_ref testsuite_objc_only_listener_proxy_class_ref; + +typedef struct +{ + void *reserved[1]; +} testsuite_objc_only_listener_method_defs; + +testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/primitive_list.cpp b/test-suite/generated-src/c/primitive_list.cpp new file mode 100644 index 00000000..85ab1144 --- /dev/null +++ b/test-suite/generated-src/c/primitive_list.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from primitive_list.djinni + +#include "primitive_list.h" +#include "djinni_c_helpers.hpp" +#include "primitive_list.hpp" + +testsuite_primitive_list_ref testsuite_primitive_list_new(djinni_array_ref list, djinni_array_ref optional_list) +{ + return ::djinni::c_api::Record<::testsuite::PrimitiveList>::make(::djinni::c_api::List::toCpp(list, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }), ::djinni::c_api::Optional::toCpp>>>(optional_list, [](auto&& value) { return ::djinni::c_api::List>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); }); })); +} + +djinni_array_ref testsuite_primitive_list_get_list(testsuite_primitive_list_ref instance) +{ + return ::djinni::c_api::List::fromCpp(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).list, [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); +} + +void testsuite_primitive_list_set_list(testsuite_primitive_list_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).list = ::djinni::c_api::List::toCpp(value, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_primitive_list_get_optional_list(testsuite_primitive_list_ref instance) +{ + return ::djinni::c_api::Optional::fromCpp>>>(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).optional_list, [](auto&& value) { return ::djinni::c_api::List>::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); }); }); +} + +void testsuite_primitive_list_set_optional_list(testsuite_primitive_list_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).optional_list = ::djinni::c_api::Optional::toCpp>>>(value, [](auto&& value) { return ::djinni::c_api::List>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); }); }); +} + + diff --git a/test-suite/generated-src/c/primitive_list.h b/test-suite/generated-src/c/primitive_list.h new file mode 100644 index 00000000..0ea32c04 --- /dev/null +++ b/test-suite/generated-src/c/primitive_list.h @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from primitive_list.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_primitive_list_ref; + +testsuite_primitive_list_ref testsuite_primitive_list_new(djinni_array_ref list, djinni_array_ref optional_list); +djinni_array_ref testsuite_primitive_list_get_list(testsuite_primitive_list_ref instance); +void testsuite_primitive_list_set_list(testsuite_primitive_list_ref instance, djinni_array_ref value); + +djinni_array_ref testsuite_primitive_list_get_optional_list(testsuite_primitive_list_ref instance); +void testsuite_primitive_list_set_optional_list(testsuite_primitive_list_ref instance, djinni_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/proto_tests.cpp b/test-suite/generated-src/c/proto_tests.cpp new file mode 100644 index 00000000..b17102fe --- /dev/null +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -0,0 +1,108 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#include "proto_tests.h" +#include "djinni_c_helpers.hpp" +#include "RecordWithEmbeddedCppProto.hpp" +#include "RecordWithEmbeddedProto.hpp" +#include "djinni_c_helpers.hpp" +#include "expected.hpp" +#include "proto/cpp/test.pb.h" +#include "proto/cpp/test2.pb.h" +#include "proto_tests.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct ProtoTests_Proxy: public Proxy_Parent, public ::testsuite::ProtoTests { + ProtoTests_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ProtoTests_Proxy() override = default; + +}; + +testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x) +{ + auto retValue = ::testsuite::ProtoTests::protoToStrings(::djinni::c_api::Protobuf<::djinni::test::AddressBook>::toCpp(x)); + return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); +} + +djinni_binary_ref testsuite_proto_tests_stringsToProto(djinni_array_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringsToProto(::djinni::c_api::List::toCpp(x, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); + return ::djinni::c_api::Protobuf<::djinni::test::AddressBook>::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_proto_tests_embeddedProtoToString(testsuite_RecordWithEmbeddedProto_ref x) +{ + auto retValue = ::testsuite::ProtoTests::embeddedProtoToString(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(x)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +testsuite_RecordWithEmbeddedProto_ref testsuite_proto_tests_stringToEmbeddedProto(djinni_string_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringToEmbeddedProto(::djinni::c_api::String::toCpp(x)); + return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_proto_tests_cppProtoToString(djinni_binary_ref x) +{ + auto retValue = ::testsuite::ProtoTests::cppProtoToString(::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(x)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_proto_tests_stringToCppProto(djinni_string_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringToCppProto(::djinni::c_api::String::toCpp(x)); + return ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_proto_tests_embeddedCppProtoToString(testsuite_RecordWithEmbeddedCppProto_ref x) +{ + auto retValue = ::testsuite::ProtoTests::embeddedCppProtoToString(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(x)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +testsuite_RecordWithEmbeddedCppProto_ref testsuite_proto_tests_stringToEmbeddedCppProto(djinni_string_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringToEmbeddedCppProto(::djinni::c_api::String::toCpp(x)); + return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::fromCpp(std::move(retValue)); +} + +djinni_array_ref testsuite_proto_tests_protoListToStrings(djinni_array_ref x) +{ + auto retValue = ::testsuite::ProtoTests::protoListToStrings(::djinni::c_api::List<::djinni::test::Person>::toCpp(x, [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(std::forward(value)); })); + return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_proto_tests_stringsToProtoList(djinni_array_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringsToProtoList(::djinni::c_api::List::toCpp(x, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); + return ::djinni::c_api::List<::djinni::test::Person>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(std::forward(value)); }); +} + +djinni_string_ref testsuite_proto_tests_optionalProtoToString(djinni_binary_ref x) +{ + auto retValue = ::testsuite::ProtoTests::optionalProtoToString(::djinni::c_api::Optional::toCpp>(x, [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(std::forward(value)); })); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_proto_tests_stringToOptionalProto(djinni_string_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringToOptionalProto(::djinni::c_api::String::toCpp(x)); + return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(std::forward(value)); }); +} + +djinni_outcome_ref testsuite_proto_tests_stringToProtoOutcome(djinni_string_ref x) +{ + auto retValue = ::testsuite::ProtoTests::stringToProtoOutcome(::djinni::c_api::String::toCpp(x)); + return ::djinni::c_api::Outcome<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/proto_tests.h b/test-suite/generated-src/c/proto_tests.h new file mode 100644 index 00000000..820d101f --- /dev/null +++ b/test-suite/generated-src/c/proto_tests.h @@ -0,0 +1,68 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#pragma once + +#include "djinni_c.h" +#include "RecordWithEmbeddedCppProto.h" +#include "RecordWithEmbeddedProto.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_proto_tests_ref; +typedef djinni_proxy_class_ref testsuite_proto_tests_proxy_class_ref; + +typedef struct +{ + djinni_array_ref (*protoToStrings)(void *, djinni_binary_ref); + djinni_binary_ref (*stringsToProto)(void *, djinni_array_ref); + djinni_string_ref (*embeddedProtoToString)(void *, testsuite_RecordWithEmbeddedProto_ref); + testsuite_RecordWithEmbeddedProto_ref (*stringToEmbeddedProto)(void *, djinni_string_ref); + djinni_string_ref (*cppProtoToString)(void *, djinni_binary_ref); + djinni_binary_ref (*stringToCppProto)(void *, djinni_string_ref); + djinni_string_ref (*embeddedCppProtoToString)(void *, testsuite_RecordWithEmbeddedCppProto_ref); + testsuite_RecordWithEmbeddedCppProto_ref (*stringToEmbeddedCppProto)(void *, djinni_string_ref); + djinni_array_ref (*protoListToStrings)(void *, djinni_array_ref); + djinni_array_ref (*stringsToProtoList)(void *, djinni_array_ref); + djinni_string_ref (*optionalProtoToString)(void *, djinni_binary_ref); + djinni_binary_ref (*stringToOptionalProto)(void *, djinni_string_ref); + djinni_outcome_ref (*stringToProtoOutcome)(void *, djinni_string_ref); +} testsuite_proto_tests_method_defs; + +testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque); + +djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x); + +djinni_binary_ref testsuite_proto_tests_stringsToProto(djinni_array_ref x); + +djinni_string_ref testsuite_proto_tests_embeddedProtoToString(testsuite_RecordWithEmbeddedProto_ref x); + +testsuite_RecordWithEmbeddedProto_ref testsuite_proto_tests_stringToEmbeddedProto(djinni_string_ref x); + +djinni_string_ref testsuite_proto_tests_cppProtoToString(djinni_binary_ref x); + +djinni_binary_ref testsuite_proto_tests_stringToCppProto(djinni_string_ref x); + +djinni_string_ref testsuite_proto_tests_embeddedCppProtoToString(testsuite_RecordWithEmbeddedCppProto_ref x); + +testsuite_RecordWithEmbeddedCppProto_ref testsuite_proto_tests_stringToEmbeddedCppProto(djinni_string_ref x); + +djinni_array_ref testsuite_proto_tests_protoListToStrings(djinni_array_ref x); + +djinni_array_ref testsuite_proto_tests_stringsToProtoList(djinni_array_ref x); + +djinni_string_ref testsuite_proto_tests_optionalProtoToString(djinni_binary_ref x); + +djinni_binary_ref testsuite_proto_tests_stringToOptionalProto(djinni_string_ref x); + +djinni_outcome_ref testsuite_proto_tests_stringToProtoOutcome(djinni_string_ref x); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/record_using_extended_record.cpp b/test-suite/generated-src/c/record_using_extended_record.cpp new file mode 100644 index 00000000..8ea16a2c --- /dev/null +++ b/test-suite/generated-src/c/record_using_extended_record.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#include "record_using_extended_record.h" +#include "djinni_c_helpers.hpp" +#include "../../handwritten-src/cpp/extended_record.hpp" +#include "record_using_extended_record.hpp" + +testsuite_record_using_extended_record_ref testsuite_record_using_extended_record_new(testsuite_extended_record_ref er) +{ + return ::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::make(::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(er)); +} + +testsuite_extended_record_ref testsuite_record_using_extended_record_get_er(testsuite_record_using_extended_record_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er); +} + +void testsuite_record_using_extended_record_set_er(testsuite_record_using_extended_record_ref instance, testsuite_extended_record_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/record_using_extended_record.h b/test-suite/generated-src/c/record_using_extended_record.h new file mode 100644 index 00000000..c664e18c --- /dev/null +++ b/test-suite/generated-src/c/record_using_extended_record.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#pragma once + +#include "djinni_c.h" +#include "extended_record.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_record_using_extended_record_ref; + +testsuite_record_using_extended_record_ref testsuite_record_using_extended_record_new(testsuite_extended_record_ref er); +testsuite_extended_record_ref testsuite_record_using_extended_record_get_er(testsuite_record_using_extended_record_ref instance); +void testsuite_record_using_extended_record_set_er(testsuite_record_using_extended_record_ref instance, testsuite_extended_record_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/record_with_derivings.cpp b/test-suite/generated-src/c/record_with_derivings.cpp new file mode 100644 index 00000000..7caed94f --- /dev/null +++ b/test-suite/generated-src/c/record_with_derivings.cpp @@ -0,0 +1,93 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from derivings.djinni + +#include "record_with_derivings.h" +#include "djinni_c_helpers.hpp" +#include "record_with_derivings.hpp" + +testsuite_record_with_derivings_ref testsuite_record_with_derivings_new(int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_date_ref d, djinni_string_ref s) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::make(eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::Date::toCpp(d), ::djinni::c_api::String::toCpp(s)); +} + +int8_t testsuite_record_with_derivings_get_eight(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).eight; +} + +void testsuite_record_with_derivings_set_eight(testsuite_record_with_derivings_ref instance, int8_t value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).eight = value; +} + +int16_t testsuite_record_with_derivings_get_sixteen(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen; +} + +void testsuite_record_with_derivings_set_sixteen(testsuite_record_with_derivings_ref instance, int16_t value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen = value; +} + +int32_t testsuite_record_with_derivings_get_thirtytwo(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo; +} + +void testsuite_record_with_derivings_set_thirtytwo(testsuite_record_with_derivings_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo = value; +} + +int64_t testsuite_record_with_derivings_get_sixtyfour(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour; +} + +void testsuite_record_with_derivings_set_sixtyfour(testsuite_record_with_derivings_ref instance, int64_t value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour = value; +} + +float testsuite_record_with_derivings_get_fthirtytwo(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo; +} + +void testsuite_record_with_derivings_set_fthirtytwo(testsuite_record_with_derivings_ref instance, float value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo = value; +} + +double testsuite_record_with_derivings_get_fsixtyfour(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour; +} + +void testsuite_record_with_derivings_set_fsixtyfour(testsuite_record_with_derivings_ref instance, double value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour = value; +} + +djinni_date_ref testsuite_record_with_derivings_get_d(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::Date::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).d); +} + +void testsuite_record_with_derivings_set_d(testsuite_record_with_derivings_ref instance, djinni_date_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).d = ::djinni::c_api::Date::toCpp(value); +} + +djinni_string_ref testsuite_record_with_derivings_get_s(testsuite_record_with_derivings_ref instance) +{ + return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).s); +} + +void testsuite_record_with_derivings_set_s(testsuite_record_with_derivings_ref instance, djinni_string_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).s = ::djinni::c_api::String::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/record_with_derivings.h b/test-suite/generated-src/c/record_with_derivings.h new file mode 100644 index 00000000..94095667 --- /dev/null +++ b/test-suite/generated-src/c/record_with_derivings.h @@ -0,0 +1,42 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from derivings.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_record_with_derivings_ref; + +testsuite_record_with_derivings_ref testsuite_record_with_derivings_new(int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_date_ref d, djinni_string_ref s); +int8_t testsuite_record_with_derivings_get_eight(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_eight(testsuite_record_with_derivings_ref instance, int8_t value); + +int16_t testsuite_record_with_derivings_get_sixteen(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_sixteen(testsuite_record_with_derivings_ref instance, int16_t value); + +int32_t testsuite_record_with_derivings_get_thirtytwo(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_thirtytwo(testsuite_record_with_derivings_ref instance, int32_t value); + +int64_t testsuite_record_with_derivings_get_sixtyfour(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_sixtyfour(testsuite_record_with_derivings_ref instance, int64_t value); + +float testsuite_record_with_derivings_get_fthirtytwo(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_fthirtytwo(testsuite_record_with_derivings_ref instance, float value); + +double testsuite_record_with_derivings_get_fsixtyfour(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_fsixtyfour(testsuite_record_with_derivings_ref instance, double value); + +djinni_date_ref testsuite_record_with_derivings_get_d(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_d(testsuite_record_with_derivings_ref instance, djinni_date_ref value); + +djinni_string_ref testsuite_record_with_derivings_get_s(testsuite_record_with_derivings_ref instance); +void testsuite_record_with_derivings_set_s(testsuite_record_with_derivings_ref instance, djinni_string_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/record_with_duration_and_derivings.cpp b/test-suite/generated-src/c/record_with_duration_and_derivings.cpp new file mode 100644 index 00000000..838c0e86 --- /dev/null +++ b/test-suite/generated-src/c/record_with_duration_and_derivings.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from duration.djinni + +#include "record_with_duration_and_derivings.h" +#include "djinni_c_helpers.hpp" +#include "djinni_c_helpers.hpp" +#include "record_with_duration_and_derivings.hpp" +#include + +testsuite_record_with_duration_and_derivings_ref testsuite_record_with_duration_and_derivings_new(djinni_number_ref dt) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::make(::djinni::c_api::Duration::toCpp(dt)); +} + +djinni_number_ref testsuite_record_with_duration_and_derivings_get_dt(testsuite_record_with_duration_and_derivings_ref instance) +{ + return ::djinni::c_api::Duration::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt); +} + +void testsuite_record_with_duration_and_derivings_set_dt(testsuite_record_with_duration_and_derivings_ref instance, djinni_number_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt = ::djinni::c_api::Duration::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/record_with_duration_and_derivings.h b/test-suite/generated-src/c/record_with_duration_and_derivings.h new file mode 100644 index 00000000..eb638807 --- /dev/null +++ b/test-suite/generated-src/c/record_with_duration_and_derivings.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from duration.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_record_with_duration_and_derivings_ref; + +testsuite_record_with_duration_and_derivings_ref testsuite_record_with_duration_and_derivings_new(djinni_number_ref dt); +djinni_number_ref testsuite_record_with_duration_and_derivings_get_dt(testsuite_record_with_duration_and_derivings_ref instance); +void testsuite_record_with_duration_and_derivings_set_dt(testsuite_record_with_duration_and_derivings_ref instance, djinni_number_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/record_with_flags.cpp b/test-suite/generated-src/c/record_with_flags.cpp new file mode 100644 index 00000000..3f889c3f --- /dev/null +++ b/test-suite/generated-src/c/record_with_flags.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#include "record_with_flags.h" +#include "djinni_c_helpers.hpp" +#include "access_flags.hpp" +#include "record_with_flags.hpp" + +testsuite_record_with_flags_ref testsuite_record_with_flags_new(testsuite_access_flags access) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithFlags>::make(::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(access)); +} + +testsuite_access_flags testsuite_record_with_flags_get_access(testsuite_record_with_flags_ref instance) +{ + return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithFlags>::toCpp(instance).access); +} + +void testsuite_record_with_flags_set_access(testsuite_record_with_flags_ref instance, testsuite_access_flags value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithFlags>::toCpp(instance).access = ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/record_with_flags.h b/test-suite/generated-src/c/record_with_flags.h new file mode 100644 index 00000000..0d297c0f --- /dev/null +++ b/test-suite/generated-src/c/record_with_flags.h @@ -0,0 +1,22 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#pragma once + +#include "djinni_c.h" +#include "access_flags.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_record_with_flags_ref; + +testsuite_record_with_flags_ref testsuite_record_with_flags_new(testsuite_access_flags access); +testsuite_access_flags testsuite_record_with_flags_get_access(testsuite_record_with_flags_ref instance); +void testsuite_record_with_flags_set_access(testsuite_record_with_flags_ref instance, testsuite_access_flags value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/record_with_nested_derivings.cpp b/test-suite/generated-src/c/record_with_nested_derivings.cpp new file mode 100644 index 00000000..a7746310 --- /dev/null +++ b/test-suite/generated-src/c/record_with_nested_derivings.cpp @@ -0,0 +1,34 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from derivings.djinni + +#include "record_with_nested_derivings.h" +#include "djinni_c_helpers.hpp" +#include "record_with_derivings.hpp" +#include "record_with_nested_derivings.hpp" + +testsuite_record_with_nested_derivings_ref testsuite_record_with_nested_derivings_new(int32_t key, testsuite_record_with_derivings_ref rec) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::make(key, ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(rec)); +} + +int32_t testsuite_record_with_nested_derivings_get_key(testsuite_record_with_nested_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key; +} + +void testsuite_record_with_nested_derivings_set_key(testsuite_record_with_nested_derivings_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key = value; +} + +testsuite_record_with_derivings_ref testsuite_record_with_nested_derivings_get_rec(testsuite_record_with_nested_derivings_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec); +} + +void testsuite_record_with_nested_derivings_set_rec(testsuite_record_with_nested_derivings_ref instance, testsuite_record_with_derivings_ref value) +{ + ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec = ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(value); +} + + diff --git a/test-suite/generated-src/c/record_with_nested_derivings.h b/test-suite/generated-src/c/record_with_nested_derivings.h new file mode 100644 index 00000000..5a087ff0 --- /dev/null +++ b/test-suite/generated-src/c/record_with_nested_derivings.h @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from derivings.djinni + +#pragma once + +#include "djinni_c.h" +#include "record_with_derivings.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_record_with_nested_derivings_ref; + +testsuite_record_with_nested_derivings_ref testsuite_record_with_nested_derivings_new(int32_t key, testsuite_record_with_derivings_ref rec); +int32_t testsuite_record_with_nested_derivings_get_key(testsuite_record_with_nested_derivings_ref instance); +void testsuite_record_with_nested_derivings_set_key(testsuite_record_with_nested_derivings_ref instance, int32_t value); + +testsuite_record_with_derivings_ref testsuite_record_with_nested_derivings_get_rec(testsuite_record_with_nested_derivings_ref instance); +void testsuite_record_with_nested_derivings_set_rec(testsuite_record_with_nested_derivings_ref instance, testsuite_record_with_derivings_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/return_one.cpp b/test-suite/generated-src/c/return_one.cpp new file mode 100644 index 00000000..b993b9d4 --- /dev/null +++ b/test-suite/generated-src/c/return_one.cpp @@ -0,0 +1,44 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "return_one.h" +#include "djinni_c_helpers.hpp" +#include "return_one.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ReturnOne_Proxy: public Proxy_Parent, public ::testsuite::ReturnOne { + ReturnOne_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ReturnOne_Proxy() override = default; + + int8_t return_one() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_one(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + +}; + +testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_return_one_ref testsuite_return_one_get_instance() +{ + auto retValue = ::testsuite::ReturnOne::get_instance(); + return ::djinni::c_api::Interface<::testsuite::ReturnOne>::fromCpp(std::move(retValue)); +} + +int8_t testsuite_return_one_return_one(testsuite_return_one_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ReturnOne>::toCpp(instance)->return_one(); + return std::move(retValue); +} + + diff --git a/test-suite/generated-src/c/return_one.h b/test-suite/generated-src/c/return_one.h new file mode 100644 index 00000000..767e6e23 --- /dev/null +++ b/test-suite/generated-src/c/return_one.h @@ -0,0 +1,34 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#pragma once + +#include "djinni_c.h" +#include "return_one.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Used for C++ multiple inheritance tests */ +typedef djinni_interface_ref testsuite_return_one_ref; +typedef djinni_proxy_class_ref testsuite_return_one_proxy_class_ref; + +typedef struct +{ + testsuite_return_one_ref (*get_instance)(void *); + int8_t (*return_one)(void *); +} testsuite_return_one_method_defs; + +testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque); + +testsuite_return_one_ref testsuite_return_one_get_instance(); + +int8_t testsuite_return_one_return_one(testsuite_return_one_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/return_two.cpp b/test-suite/generated-src/c/return_two.cpp new file mode 100644 index 00000000..823424ba --- /dev/null +++ b/test-suite/generated-src/c/return_two.cpp @@ -0,0 +1,44 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "return_two.h" +#include "djinni_c_helpers.hpp" +#include "return_two.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ReturnTwo_Proxy: public Proxy_Parent, public ::testsuite::ReturnTwo { + ReturnTwo_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ReturnTwo_Proxy() override = default; + + int8_t return_two() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_two(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = returnValue; + return returnValue_cpp; + } + +}; + +testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +testsuite_return_two_ref testsuite_return_two_get_instance() +{ + auto retValue = ::testsuite::ReturnTwo::get_instance(); + return ::djinni::c_api::Interface<::testsuite::ReturnTwo>::fromCpp(std::move(retValue)); +} + +int8_t testsuite_return_two_return_two(testsuite_return_two_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ReturnTwo>::toCpp(instance)->return_two(); + return std::move(retValue); +} + + diff --git a/test-suite/generated-src/c/return_two.h b/test-suite/generated-src/c/return_two.h new file mode 100644 index 00000000..27dba911 --- /dev/null +++ b/test-suite/generated-src/c/return_two.h @@ -0,0 +1,34 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#pragma once + +#include "djinni_c.h" +#include "return_two.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Used for C++ multiple inheritance tests */ +typedef djinni_interface_ref testsuite_return_two_ref; +typedef djinni_proxy_class_ref testsuite_return_two_proxy_class_ref; + +typedef struct +{ + testsuite_return_two_ref (*get_instance)(void *); + int8_t (*return_two)(void *); +} testsuite_return_two_method_defs; + +testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque); + +testsuite_return_two_ref testsuite_return_two_get_instance(); + +int8_t testsuite_return_two_return_two(testsuite_return_two_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/reverse_client_interface.cpp b/test-suite/generated-src/c/reverse_client_interface.cpp new file mode 100644 index 00000000..53a1b541 --- /dev/null +++ b/test-suite/generated-src/c/reverse_client_interface.cpp @@ -0,0 +1,77 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#include "reverse_client_interface.h" +#include "djinni_c_helpers.hpp" +#include "reverse_client_interface.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct ReverseClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ReverseClientInterface { + ReverseClientInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ReverseClientInterface_Proxy() override = default; + + std::string return_str() const override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { + auto i_c = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(i); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); + djinni_ref_release(i_c); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { + auto i_c = ::djinni::c_api::Optional::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(std::forward(value)); }); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); + djinni_ref_release(i_c); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->return_str(); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_reverse_client_interface_meth_taking_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(i)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_reverse_client_interface_meth_taking_optional_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::Optional::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(std::forward(value)); })); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_create() +{ + auto retValue = ::testsuite::ReverseClientInterface::create(); + return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/reverse_client_interface.h b/test-suite/generated-src/c/reverse_client_interface.h new file mode 100644 index 00000000..1f4cb3f8 --- /dev/null +++ b/test-suite/generated-src/c/reverse_client_interface.h @@ -0,0 +1,39 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#pragma once + +#include "djinni_c.h" +#include "reverse_client_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_reverse_client_interface_ref; +typedef djinni_proxy_class_ref testsuite_reverse_client_interface_proxy_class_ref; + +typedef struct +{ + djinni_string_ref (*return_str)(void *); + djinni_string_ref (*meth_taking_interface)(void *, testsuite_reverse_client_interface_ref); + djinni_string_ref (*meth_taking_optional_interface)(void *, testsuite_reverse_client_interface_ref); + testsuite_reverse_client_interface_ref (*create)(void *); +} testsuite_reverse_client_interface_method_defs; + +testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque); + +djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance); + +djinni_string_ref testsuite_reverse_client_interface_meth_taking_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i); + +djinni_string_ref testsuite_reverse_client_interface_meth_taking_optional_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i); + +testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_create(); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/sample_interface.cpp b/test-suite/generated-src/c/sample_interface.cpp new file mode 100644 index 00000000..c5cd29a0 --- /dev/null +++ b/test-suite/generated-src/c/sample_interface.cpp @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "sample_interface.h" +#include "djinni_c_helpers.hpp" +#include "sample_interface.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct SampleInterface_Proxy: public Proxy_Parent, public ::testsuite::SampleInterface { + SampleInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~SampleInterface_Proxy() override = default; + +}; + +testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + + diff --git a/test-suite/generated-src/c/sample_interface.h b/test-suite/generated-src/c/sample_interface.h new file mode 100644 index 00000000..38ad0312 --- /dev/null +++ b/test-suite/generated-src/c/sample_interface.h @@ -0,0 +1,31 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * we need to test optional interface + * this one will be used + */ +typedef djinni_interface_ref testsuite_sample_interface_ref; +typedef djinni_proxy_class_ref testsuite_sample_interface_proxy_class_ref; + +typedef struct +{ + void *reserved[1]; +} testsuite_sample_interface_method_defs; + +testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/second_listener.cpp b/test-suite/generated-src/c/second_listener.cpp new file mode 100644 index 00000000..2d709a90 --- /dev/null +++ b/test-suite/generated-src/c/second_listener.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "second_listener.h" +#include "djinni_c_helpers.hpp" +#include "second_listener.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct SecondListener_Proxy: public Proxy_Parent, public ::testsuite::SecondListener { + SecondListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~SecondListener_Proxy() override = default; + + void second() override { + Proxy_Parent::getProxyClass().methodDefs().second(Proxy_Parent::getOpaque()); + } + +}; + +testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +void testsuite_second_listener_second(testsuite_second_listener_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::SecondListener>::toCpp(instance)->second(); +} + + diff --git a/test-suite/generated-src/c/second_listener.h b/test-suite/generated-src/c/second_listener.h new file mode 100644 index 00000000..08cb7229 --- /dev/null +++ b/test-suite/generated-src/c/second_listener.h @@ -0,0 +1,30 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** Used for ObjC multiple inheritance tests */ +typedef djinni_interface_ref testsuite_second_listener_ref; +typedef djinni_proxy_class_ref testsuite_second_listener_proxy_class_ref; + +typedef struct +{ + void (*second)(void *); +} testsuite_second_listener_method_defs; + +testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque); + +void testsuite_second_listener_second(testsuite_second_listener_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/set_record.cpp b/test-suite/generated-src/c/set_record.cpp new file mode 100644 index 00000000..bd8b9bd7 --- /dev/null +++ b/test-suite/generated-src/c/set_record.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from set.djinni + +#include "set_record.h" +#include "djinni_c_helpers.hpp" +#include "set_record.hpp" + +testsuite_set_record_ref testsuite_set_record_new(djinni_array_ref set, djinni_array_ref iset) +{ + return ::djinni::c_api::Record<::testsuite::SetRecord>::make(::djinni::c_api::Set::toCpp(set, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }), ::djinni::c_api::Set::toCpp(iset, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); })); +} + +djinni_array_ref testsuite_set_record_get_set(testsuite_set_record_ref instance) +{ + return ::djinni::c_api::Set::fromCpp(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).set, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); +} + +void testsuite_set_record_set_set(testsuite_set_record_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).set = ::djinni::c_api::Set::toCpp(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_set_record_get_iset(testsuite_set_record_ref instance) +{ + return ::djinni::c_api::Set::fromCpp(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).iset, [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); +} + +void testsuite_set_record_set_iset(testsuite_set_record_ref instance, djinni_array_ref value) +{ + ::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).iset = ::djinni::c_api::Set::toCpp(value, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); +} + + diff --git a/test-suite/generated-src/c/set_record.h b/test-suite/generated-src/c/set_record.h new file mode 100644 index 00000000..049103a9 --- /dev/null +++ b/test-suite/generated-src/c/set_record.h @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from set.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_set_record_ref; + +testsuite_set_record_ref testsuite_set_record_new(djinni_array_ref set, djinni_array_ref iset); +djinni_array_ref testsuite_set_record_get_set(testsuite_set_record_ref instance); +void testsuite_set_record_set_set(testsuite_set_record_ref instance, djinni_array_ref value); + +djinni_array_ref testsuite_set_record_get_iset(testsuite_set_record_ref instance); +void testsuite_set_record_set_iset(testsuite_set_record_ref instance, djinni_array_ref value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/support_copying.cpp b/test-suite/generated-src/c/support_copying.cpp new file mode 100644 index 00000000..05e76137 --- /dev/null +++ b/test-suite/generated-src/c/support_copying.cpp @@ -0,0 +1,23 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from nscopying.djinni + +#include "support_copying.h" +#include "djinni_c_helpers.hpp" +#include "support_copying.hpp" + +testsuite_support_copying_ref testsuite_support_copying_new(int32_t x) +{ + return ::djinni::c_api::Record<::testsuite::SupportCopying>::make(x); +} + +int32_t testsuite_support_copying_get_x(testsuite_support_copying_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::SupportCopying>::toCpp(instance).x; +} + +void testsuite_support_copying_set_x(testsuite_support_copying_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::SupportCopying>::toCpp(instance).x = value; +} + + diff --git a/test-suite/generated-src/c/support_copying.h b/test-suite/generated-src/c/support_copying.h new file mode 100644 index 00000000..6de6c4d4 --- /dev/null +++ b/test-suite/generated-src/c/support_copying.h @@ -0,0 +1,21 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from nscopying.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_support_copying_ref; + +testsuite_support_copying_ref testsuite_support_copying_new(int32_t x); +int32_t testsuite_support_copying_get_x(testsuite_support_copying_ref instance); +void testsuite_support_copying_set_x(testsuite_support_copying_ref instance, int32_t value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/test_array.cpp b/test-suite/generated-src/c/test_array.cpp new file mode 100644 index 00000000..6d51db8c --- /dev/null +++ b/test-suite/generated-src/c/test_array.cpp @@ -0,0 +1,49 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from array.djinni + +#include "test_array.h" +#include "djinni_c_helpers.hpp" +#include "test_array.hpp" +#include "vec2.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct TestArray_Proxy: public Proxy_Parent, public ::testsuite::TestArray { + TestArray_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~TestArray_Proxy() override = default; + +}; + +testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a) +{ + auto retValue = ::testsuite::TestArray::testStringArray(::djinni::c_api::List::toCpp(a, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); + return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_test_array_testIntArray(djinni_array_ref a) +{ + auto retValue = ::testsuite::TestArray::testIntArray(::djinni::c_api::List::toCpp(a, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); })); + return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_test_array_testRecordArray(djinni_array_ref a) +{ + auto retValue = ::testsuite::TestArray::testRecordArray(::djinni::c_api::List<::testsuite::Vec2>::toCpp(a, [](auto&& value) { return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(std::forward(value)); })); + return ::djinni::c_api::List<::testsuite::Vec2>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Record<::testsuite::Vec2>::fromCpp(std::forward(value)); }); +} + +djinni_array_ref testsuite_test_array_testArrayOfArray(djinni_array_ref a) +{ + auto retValue = ::testsuite::TestArray::testArrayOfArray(::djinni::c_api::List>::toCpp(a, [](auto&& value) { return ::djinni::c_api::List::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); })); + return ::djinni::c_api::List>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::List::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); }); +} + + diff --git a/test-suite/generated-src/c/test_array.h b/test-suite/generated-src/c/test_array.h new file mode 100644 index 00000000..6df798d0 --- /dev/null +++ b/test-suite/generated-src/c/test_array.h @@ -0,0 +1,39 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from array.djinni + +#pragma once + +#include "djinni_c.h" +#include "vec2.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_test_array_ref; +typedef djinni_proxy_class_ref testsuite_test_array_proxy_class_ref; + +typedef struct +{ + djinni_array_ref (*testStringArray)(void *, djinni_array_ref); + djinni_array_ref (*testIntArray)(void *, djinni_array_ref); + djinni_array_ref (*testRecordArray)(void *, djinni_array_ref); + djinni_array_ref (*testArrayOfArray)(void *, djinni_array_ref); +} testsuite_test_array_method_defs; + +testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque); + +djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a); + +djinni_array_ref testsuite_test_array_testIntArray(djinni_array_ref a); + +djinni_array_ref testsuite_test_array_testRecordArray(djinni_array_ref a); + +djinni_array_ref testsuite_test_array_testArrayOfArray(djinni_array_ref a); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/test_duration.cpp b/test-suite/generated-src/c/test_duration.cpp new file mode 100644 index 00000000..015c34d4 --- /dev/null +++ b/test-suite/generated-src/c/test_duration.cpp @@ -0,0 +1,146 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from duration.djinni + +#include "test_duration.h" +#include "djinni_c_helpers.hpp" +#include "djinni_c_helpers.hpp" +#include "test_duration.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct TestDuration_Proxy: public Proxy_Parent, public ::testsuite::TestDuration { + TestDuration_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~TestDuration_Proxy() override = default; + +}; + +testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::hoursString(::djinni::c_api::Duration>::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_duration_minutesString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::minutesString(::djinni::c_api::Duration>::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_duration_secondsString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::secondsString(::djinni::c_api::Duration>::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_duration_millisString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::millisString(::djinni::c_api::Duration::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_duration_microsString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::microsString(::djinni::c_api::Duration::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_duration_nanosString(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::nanosString(::djinni::c_api::Duration::toCpp(dt)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_hours(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::hours(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_minutes(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::minutes(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_seconds(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::seconds(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_millis(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::millis(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_micros(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::micros(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_nanos(int32_t count) +{ + auto retValue = ::testsuite::TestDuration::nanos(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_hoursf(double count) +{ + auto retValue = ::testsuite::TestDuration::hoursf(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_minutesf(double count) +{ + auto retValue = ::testsuite::TestDuration::minutesf(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_secondsf(double count) +{ + auto retValue = ::testsuite::TestDuration::secondsf(count); + return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_millisf(double count) +{ + auto retValue = ::testsuite::TestDuration::millisf(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_microsf(double count) +{ + auto retValue = ::testsuite::TestDuration::microsf(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_nanosf(double count) +{ + auto retValue = ::testsuite::TestDuration::nanosf(count); + return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); +} + +djinni_number_ref testsuite_test_duration_box(int64_t count) +{ + auto retValue = ::testsuite::TestDuration::box(count); + return ::djinni::c_api::Optional::fromCpp>>>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Duration>::fromCpp(std::forward(value)); }); +} + +int64_t testsuite_test_duration_unbox(djinni_number_ref dt) +{ + auto retValue = ::testsuite::TestDuration::unbox(::djinni::c_api::Optional::toCpp>>>(dt, [](auto&& value) { return ::djinni::c_api::Duration>::toCpp(std::forward(value)); })); + return std::move(retValue); +} + + diff --git a/test-suite/generated-src/c/test_duration.h b/test-suite/generated-src/c/test_duration.h new file mode 100644 index 00000000..11e0567b --- /dev/null +++ b/test-suite/generated-src/c/test_duration.h @@ -0,0 +1,87 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from duration.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_test_duration_ref; +typedef djinni_proxy_class_ref testsuite_test_duration_proxy_class_ref; + +typedef struct +{ + djinni_string_ref (*hoursString)(void *, djinni_number_ref); + djinni_string_ref (*minutesString)(void *, djinni_number_ref); + djinni_string_ref (*secondsString)(void *, djinni_number_ref); + djinni_string_ref (*millisString)(void *, djinni_number_ref); + djinni_string_ref (*microsString)(void *, djinni_number_ref); + djinni_string_ref (*nanosString)(void *, djinni_number_ref); + djinni_number_ref (*hours)(void *, int32_t); + djinni_number_ref (*minutes)(void *, int32_t); + djinni_number_ref (*seconds)(void *, int32_t); + djinni_number_ref (*millis)(void *, int32_t); + djinni_number_ref (*micros)(void *, int32_t); + djinni_number_ref (*nanos)(void *, int32_t); + djinni_number_ref (*hoursf)(void *, double); + djinni_number_ref (*minutesf)(void *, double); + djinni_number_ref (*secondsf)(void *, double); + djinni_number_ref (*millisf)(void *, double); + djinni_number_ref (*microsf)(void *, double); + djinni_number_ref (*nanosf)(void *, double); + djinni_number_ref (*box)(void *, int64_t); + int64_t (*unbox)(void *, djinni_number_ref); +} testsuite_test_duration_method_defs; + +testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque); + +djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt); + +djinni_string_ref testsuite_test_duration_minutesString(djinni_number_ref dt); + +djinni_string_ref testsuite_test_duration_secondsString(djinni_number_ref dt); + +djinni_string_ref testsuite_test_duration_millisString(djinni_number_ref dt); + +djinni_string_ref testsuite_test_duration_microsString(djinni_number_ref dt); + +djinni_string_ref testsuite_test_duration_nanosString(djinni_number_ref dt); + +djinni_number_ref testsuite_test_duration_hours(int32_t count); + +djinni_number_ref testsuite_test_duration_minutes(int32_t count); + +djinni_number_ref testsuite_test_duration_seconds(int32_t count); + +djinni_number_ref testsuite_test_duration_millis(int32_t count); + +djinni_number_ref testsuite_test_duration_micros(int32_t count); + +djinni_number_ref testsuite_test_duration_nanos(int32_t count); + +djinni_number_ref testsuite_test_duration_hoursf(double count); + +djinni_number_ref testsuite_test_duration_minutesf(double count); + +djinni_number_ref testsuite_test_duration_secondsf(double count); + +djinni_number_ref testsuite_test_duration_millisf(double count); + +djinni_number_ref testsuite_test_duration_microsf(double count); + +djinni_number_ref testsuite_test_duration_nanosf(double count); + +djinni_number_ref testsuite_test_duration_box(int64_t count); + +int64_t testsuite_test_duration_unbox(djinni_number_ref dt); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/test_helpers.cpp b/test-suite/generated-src/c/test_helpers.cpp new file mode 100644 index 00000000..d32ba0a4 --- /dev/null +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -0,0 +1,272 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "test_helpers.h" +#include "djinni_c_helpers.hpp" +#include "Future.hpp" +#include "assorted_primitives.hpp" +#include "color.hpp" +#include "djinni_c_helpers.hpp" +#include "map_list_record.hpp" +#include "nested_collection.hpp" +#include "primitive_list.hpp" +#include "set_record.hpp" +#include "test_helpers.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct TestHelpers_Proxy: public Proxy_Parent, public ::testsuite::TestHelpers { + TestHelpers_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~TestHelpers_Proxy() override = default; + +}; + +testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +/** Method with documentation */ +testsuite_set_record_ref testsuite_test_helpers_get_set_record() +{ + auto retValue = ::testsuite::TestHelpers::get_set_record(); + return ::djinni::c_api::Record<::testsuite::SetRecord>::fromCpp(std::move(retValue)); +} + +/** + * Method with long documentation + * (Second line of multi-line documentation. + * Indented third line of multi-line documentation.) + */ +bool testsuite_test_helpers_check_set_record(testsuite_set_record_ref rec) +{ + auto retValue = ::testsuite::TestHelpers::check_set_record(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(rec)); + return std::move(retValue); +} + +testsuite_primitive_list_ref testsuite_test_helpers_get_primitive_list() +{ + auto retValue = ::testsuite::TestHelpers::get_primitive_list(); + return ::djinni::c_api::Record<::testsuite::PrimitiveList>::fromCpp(std::move(retValue)); +} + +bool testsuite_test_helpers_check_primitive_list(testsuite_primitive_list_ref pl) +{ + auto retValue = ::testsuite::TestHelpers::check_primitive_list(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(pl)); + return std::move(retValue); +} + +testsuite_nested_collection_ref testsuite_test_helpers_get_nested_collection() +{ + auto retValue = ::testsuite::TestHelpers::get_nested_collection(); + return ::djinni::c_api::Record<::testsuite::NestedCollection>::fromCpp(std::move(retValue)); +} + +bool testsuite_test_helpers_check_nested_collection(testsuite_nested_collection_ref nc) +{ + auto retValue = ::testsuite::TestHelpers::check_nested_collection(::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(nc)); + return std::move(retValue); +} + +djinni_keyval_array_ref testsuite_test_helpers_get_map() +{ + auto retValue = ::testsuite::TestHelpers::get_map(); + return ::djinni::c_api::Map::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); +} + +bool testsuite_test_helpers_check_map(djinni_keyval_array_ref m) +{ + auto retValue = ::testsuite::TestHelpers::check_map(::djinni::c_api::Map::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); + return std::move(retValue); +} + +djinni_keyval_array_ref testsuite_test_helpers_get_empty_map() +{ + auto retValue = ::testsuite::TestHelpers::get_empty_map(); + return ::djinni::c_api::Map::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); +} + +bool testsuite_test_helpers_check_empty_map(djinni_keyval_array_ref m) +{ + auto retValue = ::testsuite::TestHelpers::check_empty_map(::djinni::c_api::Map::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); + return std::move(retValue); +} + +testsuite_map_list_record_ref testsuite_test_helpers_get_map_list_record() +{ + auto retValue = ::testsuite::TestHelpers::get_map_list_record(); + return ::djinni::c_api::Record<::testsuite::MapListRecord>::fromCpp(std::move(retValue)); +} + +bool testsuite_test_helpers_check_map_list_record(testsuite_map_list_record_ref m) +{ + auto retValue = ::testsuite::TestHelpers::check_map_list_record(::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(m)); + return std::move(retValue); +} + +void testsuite_test_helpers_check_client_interface_ascii(testsuite_client_interface_ref i) +{ + ::testsuite::TestHelpers::check_client_interface_ascii(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); +} + +void testsuite_test_helpers_check_client_interface_nonascii(testsuite_client_interface_ref i) +{ + ::testsuite::TestHelpers::check_client_interface_nonascii(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); +} + +void testsuite_test_helpers_check_client_interface_args(testsuite_client_interface_ref i) +{ + ::testsuite::TestHelpers::check_client_interface_args(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); +} + +void testsuite_test_helpers_check_enum_map(djinni_keyval_array_ref m) +{ + ::testsuite::TestHelpers::check_enum_map(::djinni::c_api::Map<::testsuite::color, std::string>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::String::toCpp(value)); })); +} + +void testsuite_test_helpers_check_enum(testsuite_color c) +{ + ::testsuite::TestHelpers::check_enum(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(c)); +} + +testsuite_user_token_ref testsuite_test_helpers_token_id(testsuite_user_token_ref t) +{ + auto retValue = ::testsuite::TestHelpers::token_id(::djinni::c_api::Optional::toSharedPtrCpp>(t, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(std::forward(value)); })); + return ::djinni::c_api::Optional::fromSharedPtrCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::UserToken>::fromCpp(std::forward(value)); }); +} + +testsuite_user_token_ref testsuite_test_helpers_create_cpp_token() +{ + auto retValue = ::testsuite::TestHelpers::create_cpp_token(); + return ::djinni::c_api::Interface<::testsuite::UserToken>::fromCpp(std::move(retValue)); +} + +void testsuite_test_helpers_check_cpp_token(testsuite_user_token_ref t) +{ + ::testsuite::TestHelpers::check_cpp_token(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t)); +} + +int64_t testsuite_test_helpers_cpp_token_id(testsuite_user_token_ref t) +{ + auto retValue = ::testsuite::TestHelpers::cpp_token_id(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t)); + return std::move(retValue); +} + +void testsuite_test_helpers_check_token_type(testsuite_user_token_ref t, djinni_string_ref type) +{ + ::testsuite::TestHelpers::check_token_type(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t), ::djinni::c_api::String::toCpp(type)); +} + +djinni_optional_int32_t testsuite_test_helpers_return_none() +{ + auto retValue = ::testsuite::TestHelpers::return_none(); + return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int32_t>(std::move(retValue)); +} + +/** Ensures that we generate integer translation code */ +testsuite_assorted_primitives_ref testsuite_test_helpers_assorted_primitives_id(testsuite_assorted_primitives_ref i) +{ + auto retValue = ::testsuite::TestHelpers::assorted_primitives_id(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(i)); + return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::fromCpp(std::move(retValue)); +} + +djinni_binary_ref testsuite_test_helpers_id_binary(djinni_binary_ref b) +{ + auto retValue = ::testsuite::TestHelpers::id_binary(::djinni::c_api::Binary::toCpp(b)); + return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_get_async_result() +{ + auto retValue = ::testsuite::TestHelpers::get_async_result(); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_future_roundtrip(djinni_future_ref f) +{ + auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::Future::toCpp(f)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_async_early_throw() +{ + auto retValue = ::testsuite::TestHelpers::async_early_throw(); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) +{ + auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::Future::toCpp(f)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +/** + * If the input is empty, returns back an empty future. + * If the input is non-empty, returns back the value plus one. + */ +djinni_future_ref testsuite_test_helpers_add_one_if_present(djinni_future_ref f) +{ + auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::Future>::toCpp(f)); + return ::djinni::c_api::Future>::fromCpp(std::move(retValue)); +} + +/** try-catches the future f, and accesses the error message, and returns as a string. */ +djinni_future_ref testsuite_test_helpers_return_exception_string(djinni_future_ref f) +{ + auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::Future::toCpp(f)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_check_async_interface(testsuite_async_interface_ref i) +{ + auto retValue = ::testsuite::TestHelpers::check_async_interface(::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(i)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_future_ref testsuite_test_helpers_check_async_composition(testsuite_async_interface_ref i) +{ + auto retValue = ::testsuite::TestHelpers::check_async_composition(::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(i)); + return ::djinni::c_api::Future::fromCpp(std::move(retValue)); +} + +djinni_array_ref testsuite_test_helpers_get_optional_list() +{ + auto retValue = ::testsuite::TestHelpers::get_optional_list(); + return ::djinni::c_api::List>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); +} + +bool testsuite_test_helpers_check_optional_list(djinni_array_ref ol) +{ + auto retValue = ::testsuite::TestHelpers::check_optional_list(::djinni::c_api::List>::toCpp(ol, [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); + return std::move(retValue); +} + +djinni_array_ref testsuite_test_helpers_get_optional_set() +{ + auto retValue = ::testsuite::TestHelpers::get_optional_set(); + return ::djinni::c_api::Set>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); +} + +bool testsuite_test_helpers_check_optional_set(djinni_array_ref os) +{ + auto retValue = ::testsuite::TestHelpers::check_optional_set(::djinni::c_api::Set>::toCpp(os, [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); + return std::move(retValue); +} + +djinni_keyval_array_ref testsuite_test_helpers_get_optional_map() +{ + auto retValue = ::testsuite::TestHelpers::get_optional_map(); + return ::djinni::c_api::Map, std::experimental::optional>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::Optional::fromCpp>(key, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }), ::djinni::c_api::Optional::fromCpp>(value, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); })); }); +} + +bool testsuite_test_helpers_check_optional_map(djinni_keyval_array_ref om) +{ + auto retValue = ::testsuite::TestHelpers::check_optional_map(::djinni::c_api::Map, std::experimental::optional>::toCpp(om, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Optional::toCpp>(key, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }), ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); })); + return std::move(retValue); +} + + diff --git a/test-suite/generated-src/c/test_helpers.h b/test-suite/generated-src/c/test_helpers.h new file mode 100644 index 00000000..0b7e6aef --- /dev/null +++ b/test-suite/generated-src/c/test_helpers.h @@ -0,0 +1,170 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#pragma once + +#include "djinni_c.h" +#include "assorted_primitives.h" +#include "async_interface.h" +#include "client_interface.h" +#include "color.h" +#include "djinni_c.h" +#include "map_list_record.h" +#include "nested_collection.h" +#include "primitive_list.h" +#include "set_record.h" +#include "user_token.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Helper methods used by various different tests. + * (Second line of multi-line documentation. + * Indented third line of multi-line documentation.) + */ +typedef djinni_interface_ref testsuite_test_helpers_ref; +typedef djinni_proxy_class_ref testsuite_test_helpers_proxy_class_ref; + +typedef struct +{ + testsuite_set_record_ref (*get_set_record)(void *); + bool (*check_set_record)(void *, testsuite_set_record_ref); + testsuite_primitive_list_ref (*get_primitive_list)(void *); + bool (*check_primitive_list)(void *, testsuite_primitive_list_ref); + testsuite_nested_collection_ref (*get_nested_collection)(void *); + bool (*check_nested_collection)(void *, testsuite_nested_collection_ref); + djinni_keyval_array_ref (*get_map)(void *); + bool (*check_map)(void *, djinni_keyval_array_ref); + djinni_keyval_array_ref (*get_empty_map)(void *); + bool (*check_empty_map)(void *, djinni_keyval_array_ref); + testsuite_map_list_record_ref (*get_map_list_record)(void *); + bool (*check_map_list_record)(void *, testsuite_map_list_record_ref); + void (*check_client_interface_ascii)(void *, testsuite_client_interface_ref); + void (*check_client_interface_nonascii)(void *, testsuite_client_interface_ref); + void (*check_client_interface_args)(void *, testsuite_client_interface_ref); + void (*check_enum_map)(void *, djinni_keyval_array_ref); + void (*check_enum)(void *, testsuite_color); + testsuite_user_token_ref (*token_id)(void *, testsuite_user_token_ref); + testsuite_user_token_ref (*create_cpp_token)(void *); + void (*check_cpp_token)(void *, testsuite_user_token_ref); + int64_t (*cpp_token_id)(void *, testsuite_user_token_ref); + void (*check_token_type)(void *, testsuite_user_token_ref, djinni_string_ref); + djinni_optional_int32_t (*return_none)(void *); + testsuite_assorted_primitives_ref (*assorted_primitives_id)(void *, testsuite_assorted_primitives_ref); + djinni_binary_ref (*id_binary)(void *, djinni_binary_ref); + djinni_future_ref (*get_async_result)(void *); + djinni_future_ref (*future_roundtrip)(void *, djinni_future_ref); + djinni_future_ref (*async_early_throw)(void *); + djinni_future_ref (*void_async_method)(void *, djinni_future_ref); + djinni_future_ref (*add_one_if_present)(void *, djinni_future_ref); + djinni_future_ref (*return_exception_string)(void *, djinni_future_ref); + djinni_future_ref (*check_async_interface)(void *, testsuite_async_interface_ref); + djinni_future_ref (*check_async_composition)(void *, testsuite_async_interface_ref); + djinni_array_ref (*get_optional_list)(void *); + bool (*check_optional_list)(void *, djinni_array_ref); + djinni_array_ref (*get_optional_set)(void *); + bool (*check_optional_set)(void *, djinni_array_ref); + djinni_keyval_array_ref (*get_optional_map)(void *); + bool (*check_optional_map)(void *, djinni_keyval_array_ref); +} testsuite_test_helpers_method_defs; + +testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque); + +/** Method with documentation */ +testsuite_set_record_ref testsuite_test_helpers_get_set_record(); + +/** + * Method with long documentation + * (Second line of multi-line documentation. + * Indented third line of multi-line documentation.) + */ +bool testsuite_test_helpers_check_set_record(testsuite_set_record_ref rec); + +testsuite_primitive_list_ref testsuite_test_helpers_get_primitive_list(); + +bool testsuite_test_helpers_check_primitive_list(testsuite_primitive_list_ref pl); + +testsuite_nested_collection_ref testsuite_test_helpers_get_nested_collection(); + +bool testsuite_test_helpers_check_nested_collection(testsuite_nested_collection_ref nc); + +djinni_keyval_array_ref testsuite_test_helpers_get_map(); + +bool testsuite_test_helpers_check_map(djinni_keyval_array_ref m); + +djinni_keyval_array_ref testsuite_test_helpers_get_empty_map(); + +bool testsuite_test_helpers_check_empty_map(djinni_keyval_array_ref m); + +testsuite_map_list_record_ref testsuite_test_helpers_get_map_list_record(); + +bool testsuite_test_helpers_check_map_list_record(testsuite_map_list_record_ref m); + +void testsuite_test_helpers_check_client_interface_ascii(testsuite_client_interface_ref i); + +void testsuite_test_helpers_check_client_interface_nonascii(testsuite_client_interface_ref i); + +void testsuite_test_helpers_check_client_interface_args(testsuite_client_interface_ref i); + +void testsuite_test_helpers_check_enum_map(djinni_keyval_array_ref m); + +void testsuite_test_helpers_check_enum(testsuite_color c); + +testsuite_user_token_ref testsuite_test_helpers_token_id(testsuite_user_token_ref t); + +testsuite_user_token_ref testsuite_test_helpers_create_cpp_token(); + +void testsuite_test_helpers_check_cpp_token(testsuite_user_token_ref t); + +int64_t testsuite_test_helpers_cpp_token_id(testsuite_user_token_ref t); + +void testsuite_test_helpers_check_token_type(testsuite_user_token_ref t, djinni_string_ref type); + +djinni_optional_int32_t testsuite_test_helpers_return_none(); + +/** Ensures that we generate integer translation code */ +testsuite_assorted_primitives_ref testsuite_test_helpers_assorted_primitives_id(testsuite_assorted_primitives_ref i); + +djinni_binary_ref testsuite_test_helpers_id_binary(djinni_binary_ref b); + +djinni_future_ref testsuite_test_helpers_get_async_result(); + +djinni_future_ref testsuite_test_helpers_future_roundtrip(djinni_future_ref f); + +djinni_future_ref testsuite_test_helpers_async_early_throw(); + +djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f); + +/** + * If the input is empty, returns back an empty future. + * If the input is non-empty, returns back the value plus one. + */ +djinni_future_ref testsuite_test_helpers_add_one_if_present(djinni_future_ref f); + +/** try-catches the future f, and accesses the error message, and returns as a string. */ +djinni_future_ref testsuite_test_helpers_return_exception_string(djinni_future_ref f); + +djinni_future_ref testsuite_test_helpers_check_async_interface(testsuite_async_interface_ref i); + +djinni_future_ref testsuite_test_helpers_check_async_composition(testsuite_async_interface_ref i); + +djinni_array_ref testsuite_test_helpers_get_optional_list(); + +bool testsuite_test_helpers_check_optional_list(djinni_array_ref ol); + +djinni_array_ref testsuite_test_helpers_get_optional_set(); + +bool testsuite_test_helpers_check_optional_set(djinni_array_ref os); + +djinni_keyval_array_ref testsuite_test_helpers_get_optional_map(); + +bool testsuite_test_helpers_check_optional_map(djinni_keyval_array_ref om); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/test_outcome.cpp b/test-suite/generated-src/c/test_outcome.cpp new file mode 100644 index 00000000..175f302b --- /dev/null +++ b/test-suite/generated-src/c/test_outcome.cpp @@ -0,0 +1,75 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from outcome.djinni + +#include "test_outcome.h" +#include "djinni_c_helpers.hpp" +#include "djinni_c_helpers.hpp" +#include "expected.hpp" +#include "nested_outcome.hpp" +#include "test_outcome.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct TestOutcome_Proxy: public Proxy_Parent, public ::testsuite::TestOutcome { + TestOutcome_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~TestOutcome_Proxy() override = default; + +}; + +testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() +{ + auto retValue = ::testsuite::TestOutcome::getSuccessOutcome(); + return ::djinni::c_api::Outcome::fromCpp(std::move(retValue)); +} + +djinni_outcome_ref testsuite_test_outcome_getErrorOutcome() +{ + auto retValue = ::testsuite::TestOutcome::getErrorOutcome(); + return ::djinni::c_api::Outcome::fromCpp(std::move(retValue)); +} + +djinni_string_ref testsuite_test_outcome_putSuccessOutcome(djinni_outcome_ref x) +{ + auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::Outcome::toCpp(x)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + +int32_t testsuite_test_outcome_putErrorOutcome(djinni_outcome_ref x) +{ + auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::Outcome::toCpp(x)); + return std::move(retValue); +} + +testsuite_nested_outcome_ref testsuite_test_outcome_getNestedSuccessOutcome() +{ + auto retValue = ::testsuite::TestOutcome::getNestedSuccessOutcome(); + return ::djinni::c_api::Record<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); +} + +testsuite_nested_outcome_ref testsuite_test_outcome_getNestedErrorOutcome() +{ + auto retValue = ::testsuite::TestOutcome::getNestedErrorOutcome(); + return ::djinni::c_api::Record<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); +} + +int32_t testsuite_test_outcome_putNestedSuccessOutcome(testsuite_nested_outcome_ref x) +{ + auto retValue = ::testsuite::TestOutcome::putNestedSuccessOutcome(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(x)); + return std::move(retValue); +} + +djinni_string_ref testsuite_test_outcome_putNestedErrorOutcome(testsuite_nested_outcome_ref x) +{ + auto retValue = ::testsuite::TestOutcome::putNestedErrorOutcome(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(x)); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/test_outcome.h b/test-suite/generated-src/c/test_outcome.h new file mode 100644 index 00000000..641276d2 --- /dev/null +++ b/test-suite/generated-src/c/test_outcome.h @@ -0,0 +1,52 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from outcome.djinni + +#pragma once + +#include "djinni_c.h" +#include "djinni_c.h" +#include "nested_outcome.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_test_outcome_ref; +typedef djinni_proxy_class_ref testsuite_test_outcome_proxy_class_ref; + +typedef struct +{ + djinni_outcome_ref (*getSuccessOutcome)(void *); + djinni_outcome_ref (*getErrorOutcome)(void *); + djinni_string_ref (*putSuccessOutcome)(void *, djinni_outcome_ref); + int32_t (*putErrorOutcome)(void *, djinni_outcome_ref); + testsuite_nested_outcome_ref (*getNestedSuccessOutcome)(void *); + testsuite_nested_outcome_ref (*getNestedErrorOutcome)(void *); + int32_t (*putNestedSuccessOutcome)(void *, testsuite_nested_outcome_ref); + djinni_string_ref (*putNestedErrorOutcome)(void *, testsuite_nested_outcome_ref); +} testsuite_test_outcome_method_defs; + +testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque); + +djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome(); + +djinni_outcome_ref testsuite_test_outcome_getErrorOutcome(); + +djinni_string_ref testsuite_test_outcome_putSuccessOutcome(djinni_outcome_ref x); + +int32_t testsuite_test_outcome_putErrorOutcome(djinni_outcome_ref x); + +testsuite_nested_outcome_ref testsuite_test_outcome_getNestedSuccessOutcome(); + +testsuite_nested_outcome_ref testsuite_test_outcome_getNestedErrorOutcome(); + +int32_t testsuite_test_outcome_putNestedSuccessOutcome(testsuite_nested_outcome_ref x); + +djinni_string_ref testsuite_test_outcome_putNestedErrorOutcome(testsuite_nested_outcome_ref x); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/test_static_method_language.cpp b/test-suite/generated-src/c/test_static_method_language.cpp new file mode 100644 index 00000000..edbd8f85 --- /dev/null +++ b/test-suite/generated-src/c/test_static_method_language.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from static_method_language.djinni + +#include "test_static_method_language.h" +#include "djinni_c_helpers.hpp" +#include "test_static_method_language.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct TestStaticMethodLanguage_Proxy: public Proxy_Parent, public ::testsuite::TestStaticMethodLanguage { + TestStaticMethodLanguage_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~TestStaticMethodLanguage_Proxy() override = default; + +}; + +testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +/** + * callable only from c++. platform code should compile and link even without + * c++ providing the implementation. + */ +void testsuite_test_static_method_language_test_method() +{ + ::testsuite::TestStaticMethodLanguage::test_method(); +} + + diff --git a/test-suite/generated-src/c/test_static_method_language.h b/test-suite/generated-src/c/test_static_method_language.h new file mode 100644 index 00000000..9d1fffb8 --- /dev/null +++ b/test-suite/generated-src/c/test_static_method_language.h @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from static_method_language.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_test_static_method_language_ref; +typedef djinni_proxy_class_ref testsuite_test_static_method_language_proxy_class_ref; + +typedef struct +{ + void (*test_method)(void *); +} testsuite_test_static_method_language_method_defs; + +testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque); + +/** + * callable only from c++. platform code should compile and link even without + * c++ providing the implementation. + */ +void testsuite_test_static_method_language_test_method(); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/throwing_interface.cpp b/test-suite/generated-src/c/throwing_interface.cpp new file mode 100644 index 00000000..99091500 --- /dev/null +++ b/test-suite/generated-src/c/throwing_interface.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#include "throwing_interface.h" +#include "djinni_c_helpers.hpp" +#include "throwing_interface.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct ThrowingInterface_Proxy: public Proxy_Parent, public ::testsuite::ThrowingInterface { + ThrowingInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~ThrowingInterface_Proxy() override = default; + + void throw_exception() override { + Proxy_Parent::getProxyClass().methodDefs().throw_exception(Proxy_Parent::getOpaque()); + } + +}; + +testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance) +{ + ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(instance)->throw_exception(); +} + + diff --git a/test-suite/generated-src/c/throwing_interface.h b/test-suite/generated-src/c/throwing_interface.h new file mode 100644 index 00000000..f1690ac1 --- /dev/null +++ b/test-suite/generated-src/c/throwing_interface.h @@ -0,0 +1,29 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_throwing_interface_ref; +typedef djinni_proxy_class_ref testsuite_throwing_interface_proxy_class_ref; + +typedef struct +{ + void (*throw_exception)(void *); +} testsuite_throwing_interface_method_defs; + +testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque); + +void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/user_token.cpp b/test-suite/generated-src/c/user_token.cpp new file mode 100644 index 00000000..d243226e --- /dev/null +++ b/test-suite/generated-src/c/user_token.cpp @@ -0,0 +1,38 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from user_token.djinni + +#include "user_token.h" +#include "djinni_c_helpers.hpp" +#include "user_token.hpp" + +using Proxy_Parent = ::djinni::Proxy; +struct UserToken_Proxy: public Proxy_Parent, public ::testsuite::UserToken { + UserToken_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~UserToken_Proxy() override = default; + + std::string whoami() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().whoami(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_user_token_proxy_class_ref testsuite_user_token_proxy_class_new(const testsuite_user_token_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_user_token_ref testsuite_user_token_new(testsuite_user_token_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +djinni_string_ref testsuite_user_token_whoami(testsuite_user_token_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(instance)->whoami(); + return ::djinni::c_api::String::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/user_token.h b/test-suite/generated-src/c/user_token.h new file mode 100644 index 00000000..cb6a1cd8 --- /dev/null +++ b/test-suite/generated-src/c/user_token.h @@ -0,0 +1,29 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from user_token.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_user_token_ref; +typedef djinni_proxy_class_ref testsuite_user_token_proxy_class_ref; + +typedef struct +{ + djinni_string_ref (*whoami)(void *); +} testsuite_user_token_method_defs; + +testsuite_user_token_proxy_class_ref testsuite_user_token_proxy_class_new(const testsuite_user_token_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_user_token_ref testsuite_user_token_new(testsuite_user_token_proxy_class_ref proxy_class, void *opaque); + +djinni_string_ref testsuite_user_token_whoami(testsuite_user_token_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/uses_single_language_listeners.cpp b/test-suite/generated-src/c/uses_single_language_listeners.cpp new file mode 100644 index 00000000..2e8c41c2 --- /dev/null +++ b/test-suite/generated-src/c/uses_single_language_listeners.cpp @@ -0,0 +1,75 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#include "uses_single_language_listeners.h" +#include "djinni_c_helpers.hpp" +#include "uses_single_language_listeners.hpp" +#include + +using Proxy_Parent = ::djinni::Proxy; +struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuite::UsesSingleLanguageListeners { + UsesSingleLanguageListeners_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} + + ~UsesSingleLanguageListeners_Proxy() override = default; + + void callForObjC(const /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override { + auto l_c = ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::fromCpp(l); + Proxy_Parent::getProxyClass().methodDefs().callForObjC(Proxy_Parent::getOpaque(), l_c); + djinni_ref_release(l_c); + } + + /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForObjC(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + + void callForJava(const /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> & l) override { + auto l_c = ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::fromCpp(l); + Proxy_Parent::getProxyClass().methodDefs().callForJava(Proxy_Parent::getOpaque(), l_c); + djinni_ref_release(l_c); + } + + /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override { + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForJava(Proxy_Parent::getOpaque()); + + auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::toCpp(returnValue); + djinni_ref_release(returnValue); + return returnValue_cpp; + } + +}; + +testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { + return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); +} + +testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque) { + return ::djinni::c_api::Proxy::make(proxy_class, opaque); +} + +void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l) +{ + ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForObjC(::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::toCpp(l)); +} + +testsuite_objc_only_listener_ref testsuite_uses_single_language_listeners_returnForObjC(testsuite_uses_single_language_listeners_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForObjC(); + return ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::fromCpp(std::move(retValue)); +} + +void testsuite_uses_single_language_listeners_callForJava(testsuite_uses_single_language_listeners_ref instance, testsuite_java_only_listener_ref l) +{ + ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForJava(::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::toCpp(l)); +} + +testsuite_java_only_listener_ref testsuite_uses_single_language_listeners_returnForJava(testsuite_uses_single_language_listeners_ref instance) +{ + auto retValue = ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForJava(); + return ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::fromCpp(std::move(retValue)); +} + + diff --git a/test-suite/generated-src/c/uses_single_language_listeners.h b/test-suite/generated-src/c/uses_single_language_listeners.h new file mode 100644 index 00000000..cff0fa05 --- /dev/null +++ b/test-suite/generated-src/c/uses_single_language_listeners.h @@ -0,0 +1,44 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#pragma once + +#include "djinni_c.h" +#include "java_only_listener.h" +#include "objc_only_listener.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Generating and compiling this makes sure other languages don't break + * on references to interfaces they don't need. + */ +typedef djinni_interface_ref testsuite_uses_single_language_listeners_ref; +typedef djinni_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_ref; + +typedef struct +{ + void (*callForObjC)(void *, testsuite_objc_only_listener_ref); + testsuite_objc_only_listener_ref (*returnForObjC)(void *); + void (*callForJava)(void *, testsuite_java_only_listener_ref); + testsuite_java_only_listener_ref (*returnForJava)(void *); +} testsuite_uses_single_language_listeners_method_defs; + +testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); + +testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque); + +void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l); + +testsuite_objc_only_listener_ref testsuite_uses_single_language_listeners_returnForObjC(testsuite_uses_single_language_listeners_ref instance); + +void testsuite_uses_single_language_listeners_callForJava(testsuite_uses_single_language_listeners_ref instance, testsuite_java_only_listener_ref l); + +testsuite_java_only_listener_ref testsuite_uses_single_language_listeners_returnForJava(testsuite_uses_single_language_listeners_ref instance); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/c/vec2.cpp b/test-suite/generated-src/c/vec2.cpp new file mode 100644 index 00000000..966c8632 --- /dev/null +++ b/test-suite/generated-src/c/vec2.cpp @@ -0,0 +1,33 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from array.djinni + +#include "vec2.h" +#include "djinni_c_helpers.hpp" +#include "vec2.hpp" + +testsuite_vec2_ref testsuite_vec2_new(int32_t x, int32_t y) +{ + return ::djinni::c_api::Record<::testsuite::Vec2>::make(x, y); +} + +int32_t testsuite_vec2_get_x(testsuite_vec2_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).x; +} + +void testsuite_vec2_set_x(testsuite_vec2_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).x = value; +} + +int32_t testsuite_vec2_get_y(testsuite_vec2_ref instance) +{ + return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).y; +} + +void testsuite_vec2_set_y(testsuite_vec2_ref instance, int32_t value) +{ + ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).y = value; +} + + diff --git a/test-suite/generated-src/c/vec2.h b/test-suite/generated-src/c/vec2.h new file mode 100644 index 00000000..a2b25034 --- /dev/null +++ b/test-suite/generated-src/c/vec2.h @@ -0,0 +1,24 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from array.djinni + +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_record_ref testsuite_vec2_ref; + +testsuite_vec2_ref testsuite_vec2_new(int32_t x, int32_t y); +int32_t testsuite_vec2_get_x(testsuite_vec2_ref instance); +void testsuite_vec2_set_x(testsuite_vec2_ref instance, int32_t value); + +int32_t testsuite_vec2_get_y(testsuite_vec2_ref instance); +void testsuite_vec2_set_y(testsuite_vec2_ref instance, int32_t value); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + diff --git a/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java b/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java index 8ff7d7e5..006fe63f 100644 --- a/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java +++ b/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java @@ -6,6 +6,10 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +/** + * This is a test + * my dude! + */ public enum Color { RED, ORANGE, diff --git a/test-suite/generated-src/java/com/dropbox/djinni/test/PrimitiveList.java b/test-suite/generated-src/java/com/dropbox/djinni/test/PrimitiveList.java index 81f2afc6..4f1d3617 100644 --- a/test-suite/generated-src/java/com/dropbox/djinni/test/PrimitiveList.java +++ b/test-suite/generated-src/java/com/dropbox/djinni/test/PrimitiveList.java @@ -12,9 +12,19 @@ public class PrimitiveList { /*package*/ ArrayList mList; + /*package*/ /*optional*/ ArrayList mOptionalList; + public PrimitiveList( - @Nonnull ArrayList list) { + @Nonnull ArrayList list, + @CheckForNull ArrayList optionalList) { this.mList = list; + this.mOptionalList = optionalList; + } + + public PrimitiveList( + @Nonnull ArrayList list) { + this(list, + null); } @Nonnull @@ -26,10 +36,20 @@ public void setList(@Nonnull ArrayList list) { this.mList = list; } + @CheckForNull + public ArrayList getOptionalList() { + return mOptionalList; + } + + public void setOptionalList(ArrayList optionalList) { + this.mOptionalList = optionalList; + } + @Override public String toString() { return "PrimitiveList{" + "mList=" + mList + + "," + "mOptionalList=" + mOptionalList + "}"; } diff --git a/test-suite/generated-src/jni/NativePrimitiveList.cpp b/test-suite/generated-src/jni/NativePrimitiveList.cpp index 3a4974ad..72d4dfb4 100644 --- a/test-suite/generated-src/jni/NativePrimitiveList.cpp +++ b/test-suite/generated-src/jni/NativePrimitiveList.cpp @@ -13,16 +13,18 @@ NativePrimitiveList::~NativePrimitiveList() = default; auto NativePrimitiveList::fromCpp(JNIEnv* jniEnv, const CppType& c) -> ::djinni::LocalRef { const auto& data = ::djinni::JniClass::get(); auto r = ::djinni::LocalRef{jniEnv->NewObject(data.clazz.get(), data.jconstructor, - ::djinni::get(::djinni::List<::djinni::I64>::fromCpp(jniEnv, c.list)))}; + ::djinni::get(::djinni::List<::djinni::I64>::fromCpp(jniEnv, c.list)), + ::djinni::get(::djinni::Optional>>::fromCpp(jniEnv, c.optional_list)))}; ::djinni::jniExceptionCheck(jniEnv); return r; } auto NativePrimitiveList::toCpp(JNIEnv* jniEnv, JniType j) -> CppType { - ::djinni::JniLocalScope jscope(jniEnv, 2); + ::djinni::JniLocalScope jscope(jniEnv, 3); assert(j != nullptr); const auto& data = ::djinni::JniClass::get(); - return {::djinni::List<::djinni::I64>::toCpp(jniEnv, jniEnv->GetObjectField(j, data.field_mList))}; + return {::djinni::List<::djinni::I64>::toCpp(jniEnv, jniEnv->GetObjectField(j, data.field_mList)), + ::djinni::Optional>>::toCpp(jniEnv, jniEnv->GetObjectField(j, data.field_mOptionalList))}; } } // namespace djinni_generated diff --git a/test-suite/generated-src/jni/NativePrimitiveList.hpp b/test-suite/generated-src/jni/NativePrimitiveList.hpp index 5ff1b554..d857445c 100644 --- a/test-suite/generated-src/jni/NativePrimitiveList.hpp +++ b/test-suite/generated-src/jni/NativePrimitiveList.hpp @@ -25,8 +25,9 @@ class NativePrimitiveList final { friend ::djinni::JniClass; const ::djinni::GlobalRef clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/PrimitiveList") }; - const jmethodID jconstructor { ::djinni::jniGetMethodID(clazz.get(), "", "(Ljava/util/ArrayList;)V") }; + const jmethodID jconstructor { ::djinni::jniGetMethodID(clazz.get(), "", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V") }; const jfieldID field_mList { ::djinni::jniGetFieldID(clazz.get(), "mList", "Ljava/util/ArrayList;") }; + const jfieldID field_mOptionalList { ::djinni::jniGetFieldID(clazz.get(), "mOptionalList", "Ljava/util/ArrayList;") }; }; } // namespace djinni_generated diff --git a/test-suite/generated-src/objc/DBColor.h b/test-suite/generated-src/objc/DBColor.h index 78fc5193..a9b1b0e9 100644 --- a/test-suite/generated-src/objc/DBColor.h +++ b/test-suite/generated-src/objc/DBColor.h @@ -3,6 +3,10 @@ #import +/** + * This is a test + * my dude! + */ typedef NS_ENUM(NSInteger, DBColor) { DBColorRed = 0, diff --git a/test-suite/generated-src/objc/DBPrimitiveList+Private.mm b/test-suite/generated-src/objc/DBPrimitiveList+Private.mm index 3f5786ee..e64e830c 100644 --- a/test-suite/generated-src/objc/DBPrimitiveList+Private.mm +++ b/test-suite/generated-src/objc/DBPrimitiveList+Private.mm @@ -11,12 +11,14 @@ auto PrimitiveList::toCpp(ObjcType obj) -> CppType { assert(obj); - return {::djinni::List<::djinni::I64>::toCpp(obj.list)}; + return {::djinni::List<::djinni::I64>::toCpp(obj.list), + ::djinni::Optional>>::toCpp(obj.optionalList)}; } auto PrimitiveList::fromCpp(const CppType& cpp) -> ObjcType { - return [[DBPrimitiveList alloc] initWithList:(::djinni::List<::djinni::I64>::fromCpp(cpp.list))]; + return [[DBPrimitiveList alloc] initWithList:(::djinni::List<::djinni::I64>::fromCpp(cpp.list)) + optionalList:(::djinni::Optional>>::fromCpp(cpp.optional_list))]; } } // namespace djinni_generated diff --git a/test-suite/generated-src/objc/DBPrimitiveList.h b/test-suite/generated-src/objc/DBPrimitiveList.h index 0df7c4bd..435d6a30 100644 --- a/test-suite/generated-src/objc/DBPrimitiveList.h +++ b/test-suite/generated-src/objc/DBPrimitiveList.h @@ -6,9 +6,15 @@ @interface DBPrimitiveList : NSObject - (nonnull instancetype)init NS_UNAVAILABLE; + (nonnull instancetype)new NS_UNAVAILABLE; -- (nonnull instancetype)initWithList:(nonnull NSArray *)list NS_DESIGNATED_INITIALIZER; +- (nonnull instancetype)initWithList:(nonnull NSArray *)list + optionalList:(nullable NSArray *)optionalList NS_DESIGNATED_INITIALIZER; ++ (nonnull instancetype)primitiveListWithList:(nonnull NSArray *)list + optionalList:(nullable NSArray *)optionalList; +- (nonnull instancetype)initWithList:(nonnull NSArray *)list; + (nonnull instancetype)primitiveListWithList:(nonnull NSArray *)list; @property (nonatomic, copy, nonnull) NSArray * list; +@property (nonatomic, copy, nullable) NSArray * optionalList; + @end diff --git a/test-suite/generated-src/objc/DBPrimitiveList.mm b/test-suite/generated-src/objc/DBPrimitiveList.mm index a8706b1e..007664ad 100644 --- a/test-suite/generated-src/objc/DBPrimitiveList.mm +++ b/test-suite/generated-src/objc/DBPrimitiveList.mm @@ -7,13 +7,29 @@ @implementation DBPrimitiveList - (nonnull instancetype)initWithList:(nonnull NSArray *)list + optionalList:(nullable NSArray *)optionalList { if (self = [super init]) { _list = [list copy]; + _optionalList = [optionalList copy]; } return self; } +- (nonnull instancetype)initWithList:(nonnull NSArray *)list +{ + self = [self initWithList:list + optionalList:nil]; + return self; +} + ++ (nonnull instancetype)primitiveListWithList:(nonnull NSArray *)list + optionalList:(nullable NSArray *)optionalList +{ + return [[self alloc] initWithList:list + optionalList:optionalList]; +} + + (nonnull instancetype)primitiveListWithList:(nonnull NSArray *)list { return [[self alloc] initWithList:list]; @@ -22,7 +38,7 @@ + (nonnull instancetype)primitiveListWithList:(nonnull NSArray *)lis #ifndef DJINNI_DISABLE_DESCRIPTION_METHODS - (NSString *)description { - return [NSString stringWithFormat:@"<%@ %p list:%@>", self.class, (void *)self, self.list]; + return [NSString stringWithFormat:@"<%@ %p list:%@ optionalList:%@>", self.class, (void *)self, self.list, self.optionalList]; } #endif diff --git a/test-suite/generated-src/outFileList.txt b/test-suite/generated-src/outFileList.txt index c807d95a..25e2b43a 100644 --- a/test-suite/generated-src/outFileList.txt +++ b/test-suite/generated-src/outFileList.txt @@ -574,6 +574,126 @@ djinni-output-temp/wasm/NativeRecordWithNestedDerivings.hpp djinni-output-temp/wasm/NativeRecordWithNestedDerivings.cpp djinni-output-temp/wasm/NativeSetRecord.hpp djinni-output-temp/wasm/NativeSetRecord.cpp +djinni-output-temp/c/RecordWithEmbeddedProto.h +djinni-output-temp/c/RecordWithEmbeddedProto.cpp +djinni-output-temp/c/RecordWithEmbeddedCppProto.h +djinni-output-temp/c/RecordWithEmbeddedCppProto.cpp +djinni-output-temp/c/proto_tests.h +djinni-output-temp/c/proto_tests.cpp +djinni-output-temp/c/nested_outcome.h +djinni-output-temp/c/nested_outcome.cpp +djinni-output-temp/c/test_outcome.h +djinni-output-temp/c/test_outcome.cpp +djinni-output-temp/c/test_duration.h +djinni-output-temp/c/test_duration.cpp +djinni-output-temp/c/record_with_duration_and_derivings.h +djinni-output-temp/c/record_with_duration_and_derivings.cpp +djinni-output-temp/c/date_record.h +djinni-output-temp/c/date_record.cpp +djinni-output-temp/c/map_date_record.h +djinni-output-temp/c/map_date_record.cpp +djinni-output-temp/c/DataRefTest.h +djinni-output-temp/c/DataRefTest.cpp +djinni-output-temp/c/constant_enum.h +djinni-output-temp/c/constant_enum.cpp +djinni-output-temp/c/constant_with_enum.h +djinni-output-temp/c/constant_with_enum.cpp +djinni-output-temp/c/constant_interface_with_enum.h +djinni-output-temp/c/constant_interface_with_enum.cpp +djinni-output-temp/c/access_flags.h +djinni-output-temp/c/access_flags.cpp +djinni-output-temp/c/empty_flags.h +djinni-output-temp/c/empty_flags.cpp +djinni-output-temp/c/flag_roundtrip.h +djinni-output-temp/c/flag_roundtrip.cpp +djinni-output-temp/c/record_with_flags.h +djinni-output-temp/c/record_with_flags.cpp +djinni-output-temp/c/test_static_method_language.h +djinni-output-temp/c/test_static_method_language.cpp +djinni-output-temp/c/support_copying.h +djinni-output-temp/c/support_copying.cpp +djinni-output-temp/c/vec2.h +djinni-output-temp/c/vec2.cpp +djinni-output-temp/c/test_array.h +djinni-output-temp/c/test_array.cpp +djinni-output-temp/c/_varname_record_.h +djinni-output-temp/c/_varname_record_.cpp +djinni-output-temp/c/_varname_interface_.h +djinni-output-temp/c/_varname_interface_.cpp +djinni-output-temp/c/extended_record.h +djinni-output-temp/c/extended_record.cpp +djinni-output-temp/c/record_using_extended_record.h +djinni-output-temp/c/record_using_extended_record.cpp +djinni-output-temp/c/interface_using_extended_record.h +djinni-output-temp/c/interface_using_extended_record.cpp +djinni-output-temp/c/objc_only_listener.h +djinni-output-temp/c/objc_only_listener.cpp +djinni-output-temp/c/java_only_listener.h +djinni-output-temp/c/java_only_listener.cpp +djinni-output-temp/c/uses_single_language_listeners.h +djinni-output-temp/c/uses_single_language_listeners.cpp +djinni-output-temp/c/first_listener.h +djinni-output-temp/c/first_listener.cpp +djinni-output-temp/c/second_listener.h +djinni-output-temp/c/second_listener.cpp +djinni-output-temp/c/listener_caller.h +djinni-output-temp/c/listener_caller.cpp +djinni-output-temp/c/return_one.h +djinni-output-temp/c/return_one.cpp +djinni-output-temp/c/return_two.h +djinni-output-temp/c/return_two.cpp +djinni-output-temp/c/constant_record.h +djinni-output-temp/c/constant_record.cpp +djinni-output-temp/c/constants.h +djinni-output-temp/c/constants.cpp +djinni-output-temp/c/constants_interface.h +djinni-output-temp/c/constants_interface.cpp +djinni-output-temp/c/assorted_primitives.h +djinni-output-temp/c/assorted_primitives.cpp +djinni-output-temp/c/async_interface.h +djinni-output-temp/c/async_interface.cpp +djinni-output-temp/c/test_helpers.h +djinni-output-temp/c/test_helpers.cpp +djinni-output-temp/c/empty_record.h +djinni-output-temp/c/empty_record.cpp +djinni-output-temp/c/Conflict.h +djinni-output-temp/c/Conflict.cpp +djinni-output-temp/c/conflict_user.h +djinni-output-temp/c/conflict_user.cpp +djinni-output-temp/c/sample_interface.h +djinni-output-temp/c/sample_interface.cpp +djinni-output-temp/c/user_token.h +djinni-output-temp/c/user_token.cpp +djinni-output-temp/c/color.h +djinni-output-temp/c/color.cpp +djinni-output-temp/c/enum_usage_record.h +djinni-output-temp/c/enum_usage_record.cpp +djinni-output-temp/c/enum_usage_interface.h +djinni-output-temp/c/enum_usage_interface.cpp +djinni-output-temp/c/client_returned_record.h +djinni-output-temp/c/client_returned_record.cpp +djinni-output-temp/c/client_interface.h +djinni-output-temp/c/client_interface.cpp +djinni-output-temp/c/reverse_client_interface.h +djinni-output-temp/c/reverse_client_interface.cpp +djinni-output-temp/c/throwing_interface.h +djinni-output-temp/c/throwing_interface.cpp +djinni-output-temp/c/cpp_exception.h +djinni-output-temp/c/cpp_exception.cpp +djinni-output-temp/c/primitive_list.h +djinni-output-temp/c/primitive_list.cpp +djinni-output-temp/c/map_record.h +djinni-output-temp/c/map_record.cpp +djinni-output-temp/c/map_list_record.h +djinni-output-temp/c/map_list_record.cpp +djinni-output-temp/c/nested_collection.h +djinni-output-temp/c/nested_collection.cpp +djinni-output-temp/c/record_with_derivings.h +djinni-output-temp/c/record_with_derivings.cpp +djinni-output-temp/c/record_with_nested_derivings.h +djinni-output-temp/c/record_with_nested_derivings.cpp +djinni-output-temp/c/set_record.h +djinni-output-temp/c/set_record.cpp djinni-output-temp/ts/test.ts djinni-output-temp/swift/RecordWithEmbeddedProto.swift djinni-output-temp/swift/RecordWithEmbeddedProto+Private.swift diff --git a/test-suite/generated-src/swift/PrimitiveList+Private.swift b/test-suite/generated-src/swift/PrimitiveList+Private.swift index 7dfd79f6..43cf0c58 100644 --- a/test-suite/generated-src/swift/PrimitiveList+Private.swift +++ b/test-suite/generated-src/swift/PrimitiveList+Private.swift @@ -12,12 +12,14 @@ public enum PrimitiveListMarshaller: DjinniSupport.Marshaller { public static func fromCpp(_ c: djinni.swift.AnyValue) -> SwiftType { return withUnsafePointer(to: c) { p in let list = ListMarshaller.fromCpp(djinni.swift.getMember(p, 0)) - return SwiftType(list: list) + let optionalList = OptionalMarshaller>>.fromCpp(djinni.swift.getMember(p, 1)) + return SwiftType(list: list, optionalList: optionalList) } } public static func toCpp(_ s: SwiftType) -> djinni.swift.AnyValue { var ret = djinni.swift.makeCompositeValue() djinni.swift.addMember(&ret, ListMarshaller.toCpp(s.list)) + djinni.swift.addMember(&ret, OptionalMarshaller>>.toCpp(s.optionalList)) return ret } } diff --git a/test-suite/generated-src/swift/PrimitiveList.swift b/test-suite/generated-src/swift/PrimitiveList.swift index 45613a96..e4db0057 100644 --- a/test-suite/generated-src/swift/PrimitiveList.swift +++ b/test-suite/generated-src/swift/PrimitiveList.swift @@ -5,9 +5,11 @@ import Foundation public struct PrimitiveList { public var list: Array + public var optionalList: Optional>> - public init(list: Array) + public init(list: Array, optionalList: Optional>>) { self.list = list + self.optionalList = optionalList } } diff --git a/test-suite/generated-src/swiftxx/NativePrimitiveList.cpp b/test-suite/generated-src/swiftxx/NativePrimitiveList.cpp index e5589e2e..340ea666 100644 --- a/test-suite/generated-src/swiftxx/NativePrimitiveList.cpp +++ b/test-suite/generated-src/swiftxx/NativePrimitiveList.cpp @@ -8,11 +8,12 @@ namespace djinni_generated { djinni::swift::AnyValue NativePrimitiveList::fromCpp(const ::testsuite::PrimitiveList& c) { auto ret = std::make_shared(); ret->addValue(::djinni::swift::List<::djinni::swift::I64>::fromCpp(c.list)); + ret->addValue(::djinni::swift::Optional>>::fromCpp(c.optional_list)); return {ret}; } ::testsuite::PrimitiveList NativePrimitiveList::toCpp(const djinni::swift::AnyValue& s) { auto p = std::get(s); - return ::testsuite::PrimitiveList(::djinni::swift::List<::djinni::swift::I64>::toCpp(p->getValue(0))); + return ::testsuite::PrimitiveList(::djinni::swift::List<::djinni::swift::I64>::toCpp(p->getValue(0)), ::djinni::swift::Optional>>::toCpp(p->getValue(1))); } } // namespace djinni_generated diff --git a/test-suite/generated-src/ts/test.ts b/test-suite/generated-src/ts/test.ts index 83ff6c3e..f888ec53 100644 --- a/test-suite/generated-src/ts/test.ts +++ b/test-suite/generated-src/ts/test.ts @@ -499,6 +499,10 @@ export interface UserToken { whoami(): string; } +/** + * This is a test + * my dude! + */ export enum Color { RED = 0, ORANGE = 1, @@ -571,6 +575,7 @@ export interface CppException_statics { export interface /*record*/ PrimitiveList { list: Array; + optionalList?: Array; } export interface /*record*/ MapRecord { diff --git a/test-suite/generated-src/wasm/NativePrimitiveList.cpp b/test-suite/generated-src/wasm/NativePrimitiveList.cpp index a1208550..29d00251 100644 --- a/test-suite/generated-src/wasm/NativePrimitiveList.cpp +++ b/test-suite/generated-src/wasm/NativePrimitiveList.cpp @@ -6,11 +6,13 @@ namespace djinni_generated { auto NativePrimitiveList::toCpp(const JsType& j) -> CppType { - return {::djinni::List<::djinni::I64>::Boxed::toCpp(j["list"])}; + return {::djinni::List<::djinni::I64>::Boxed::toCpp(j["list"]), + ::djinni::Optional>>::Boxed::toCpp(j["optionalList"])}; } auto NativePrimitiveList::fromCpp(const CppType& c) -> JsType { em::val js = em::val::object(); js.set("list", ::djinni::List<::djinni::I64>::Boxed::fromCpp(c.list)); + js.set("optionalList", ::djinni::Optional>>::Boxed::fromCpp(c.optional_list)); return js; } From 9abcb846baac1dda77f0af8ca3723c4dbe41c58c Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 20 Aug 2025 13:27:48 -0500 Subject: [PATCH 24/42] moved the support lib files into their own translators --- src/source/CGenerator.scala | 12 +- src/source/CTypeResolver.scala | 36 +++--- support-lib/cpp/DataRef_c_translator.cpp | 47 ++++++++ support-lib/cpp/DataRef_c_translator.hpp | 14 +++ support-lib/cpp/DataView_c_translator.cpp | 16 +++ support-lib/cpp/DataView_c_translator.hpp | 15 +++ support-lib/cpp/Future_c_translator.hpp | 41 +++++++ support-lib/cpp/Outcome_c.h | 4 + support-lib/cpp/Outcome_c_translator.hpp | 23 ++++ support-lib/cpp/djinni_c.h | 3 - support-lib/cpp/djinni_c_helpers.cpp | 97 ---------------- support-lib/cpp/djinni_c_translators.cpp | 46 ++++++++ ...c_helpers.hpp => djinni_c_translators.hpp} | 107 +++--------------- support-lib/cpp/djinni_c_types.hpp | 39 +------ support-lib/cpp/future_c.h | 3 + support-lib/dataref.yaml | 4 +- support-lib/dataview.yaml | 4 +- support-lib/future.yaml | 6 +- support-lib/outcome.yaml | 6 +- .../djinni/vendor/third-party/date.yaml | 4 +- .../djinni/vendor/third-party/duration.yaml | 28 ++--- test-suite/generated-src/c/Conflict.cpp | 6 +- test-suite/generated-src/c/DataRefTest.cpp | 57 +++++----- .../c/RecordWithEmbeddedCppProto.cpp | 8 +- .../c/RecordWithEmbeddedProto.cpp | 8 +- .../generated-src/c/_varname_interface_.cpp | 22 ++-- .../generated-src/c/_varname_record_.cpp | 8 +- test-suite/generated-src/c/access_flags.cpp | 2 +- .../generated-src/c/assorted_primitives.cpp | 60 +++++----- .../generated-src/c/async_interface.cpp | 16 +-- test-suite/generated-src/c/async_interface.h | 2 +- .../generated-src/c/client_interface.cpp | 42 +++---- .../c/client_returned_record.cpp | 16 +-- test-suite/generated-src/c/color.cpp | 2 +- test-suite/generated-src/c/conflict_user.cpp | 16 +-- test-suite/generated-src/c/constant_enum.cpp | 2 +- .../c/constant_interface_with_enum.cpp | 6 +- .../generated-src/c/constant_record.cpp | 12 +- .../generated-src/c/constant_with_enum.cpp | 4 +- test-suite/generated-src/c/constants.cpp | 4 +- .../generated-src/c/constants_interface.cpp | 8 +- test-suite/generated-src/c/cpp_exception.cpp | 22 ++-- test-suite/generated-src/c/date_record.cpp | 10 +- test-suite/generated-src/c/empty_flags.cpp | 2 +- test-suite/generated-src/c/empty_record.cpp | 4 +- .../generated-src/c/enum_usage_interface.cpp | 46 ++++---- .../generated-src/c/enum_usage_record.cpp | 24 ++-- .../generated-src/c/extended_record.cpp | 8 +- test-suite/generated-src/c/first_listener.cpp | 8 +- test-suite/generated-src/c/flag_roundtrip.cpp | 22 ++-- .../c/interface_using_extended_record.cpp | 14 +-- .../generated-src/c/java_only_listener.cpp | 6 +- .../generated-src/c/listener_caller.cpp | 14 +-- .../generated-src/c/map_date_record.cpp | 10 +- .../generated-src/c/map_list_record.cpp | 8 +- test-suite/generated-src/c/map_record.cpp | 12 +- .../generated-src/c/nested_collection.cpp | 8 +- test-suite/generated-src/c/nested_outcome.cpp | 10 +- test-suite/generated-src/c/nested_outcome.h | 2 +- .../generated-src/c/objc_only_listener.cpp | 6 +- test-suite/generated-src/c/primitive_list.cpp | 12 +- test-suite/generated-src/c/proto_tests.cpp | 60 +++++----- test-suite/generated-src/c/proto_tests.h | 2 +- .../c/record_using_extended_record.cpp | 8 +- .../generated-src/c/record_with_derivings.cpp | 36 +++--- .../c/record_with_duration_and_derivings.cpp | 10 +- .../generated-src/c/record_with_flags.cpp | 8 +- .../c/record_with_nested_derivings.cpp | 12 +- test-suite/generated-src/c/return_one.cpp | 10 +- test-suite/generated-src/c/return_two.cpp | 10 +- .../c/reverse_client_interface.cpp | 30 ++--- .../generated-src/c/sample_interface.cpp | 6 +- .../generated-src/c/second_listener.cpp | 8 +- test-suite/generated-src/c/set_record.cpp | 12 +- .../generated-src/c/support_copying.cpp | 8 +- test-suite/generated-src/c/test_array.cpp | 22 ++-- test-suite/generated-src/c/test_duration.cpp | 60 +++++----- test-suite/generated-src/c/test_helpers.cpp | 104 ++++++++--------- test-suite/generated-src/c/test_helpers.h | 2 +- test-suite/generated-src/c/test_outcome.cpp | 28 ++--- test-suite/generated-src/c/test_outcome.h | 2 +- .../c/test_static_method_language.cpp | 6 +- .../generated-src/c/throwing_interface.cpp | 8 +- test-suite/generated-src/c/user_token.cpp | 12 +- .../c/uses_single_language_listeners.cpp | 26 ++--- test-suite/generated-src/c/vec2.cpp | 12 +- .../cpp/Duration_c_translator.hpp | 12 ++ 87 files changed, 815 insertions(+), 803 deletions(-) create mode 100644 support-lib/cpp/DataRef_c_translator.cpp create mode 100644 support-lib/cpp/DataRef_c_translator.hpp create mode 100644 support-lib/cpp/DataView_c_translator.cpp create mode 100644 support-lib/cpp/DataView_c_translator.hpp create mode 100644 support-lib/cpp/Future_c_translator.hpp create mode 100644 support-lib/cpp/Outcome_c.h create mode 100644 support-lib/cpp/Outcome_c_translator.hpp delete mode 100644 support-lib/cpp/djinni_c_helpers.cpp create mode 100644 support-lib/cpp/djinni_c_translators.cpp rename support-lib/cpp/{djinni_c_helpers.hpp => djinni_c_translators.hpp} (80%) create mode 100644 support-lib/cpp/future_c.h create mode 100644 test-suite/handwritten-src/cpp/Duration_c_translator.hpp diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index f958ea7a..268b5f13 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -86,7 +86,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { writeCFile(origin, ident, "cpp", (w: IndentWriter) => { w.wl(s"""#include ${publicHeader(ident)}""") - w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_helpers.hpp")) + w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_translators.hpp")) privateIncludes.foreach(w.wl) w.wl @@ -163,7 +163,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(") ") w.braced { - w.w(s"""return ::djinni::c_api::Record<${selfCpp}>::make(""") + w.w(s"""return ::djinni::c_api::RecordTranslator<${selfCpp}>::make(""") writeDelimited(w, resolvedFields, ", ")(t => { w.w(t.translator.toCppTranslatorFn(t.field.ident.name)) @@ -174,7 +174,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl - val toCppExpr = s"::djinni::c_api::Record<${selfCpp}>::toCpp(instance)" + val toCppExpr = s"::djinni::c_api::RecordTranslator<${selfCpp}>::toCpp(instance)" for (resolvedField <- resolvedFields) { val fieldName = resolvedField.field.ident.name val fieldTypename = resolvedField.translator.typename @@ -338,13 +338,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") w.braced { - w.wl(s"return ::djinni::c_api::ProxyClass<${methodDefsStructName}>::make(method_defs, opaque_deallocator);") + w.wl(s"return ::djinni::c_api::ProxyTranslator<${proxyClassNameCpp}, ${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") } w.wl w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") w.braced { - w.wl(s"return ::djinni::c_api::Proxy<${proxyClassNameCpp}, ${methodDefsStructName}>::make(proxy_class, opaque);") + w.wl(s"return ::djinni::c_api::ProxyTranslator<${proxyClassNameCpp}, ${methodDefsStructName}>::make(proxy_class, opaque);") } w.wl @@ -372,7 +372,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { if (resolvedMethod.method.static) { w.w(s"""${selfCpp}::${resolvedMethod.method.ident.name}(""") } else { - w.w(s"""::djinni::c_api::Interface<${selfCpp}>::toCpp(instance)->${resolvedMethod.method.ident.name}(""") + w.w(s"""::djinni::c_api::InterfaceTranslator<${selfCpp}>::toCpp(instance)->${resolvedMethod.method.ident.name}(""") } writeDelimited(w, resolvedMethod.parameters, ", ")(p => { diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 6d80bec4..c0215761 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -96,8 +96,8 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val typename = s"djinni_optional_${resolved.typename}" new CTypeTranslator(typename, false, - (p) => s"::djinni::c_api::Optional::toCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.toCppTranslatorFn(p)})", - (p) => s"::djinni::c_api::Optional::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" + (p) => s"::djinni::c_api::OptionalTranslator::toCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.toCppTranslatorFn(p)})", + (p) => s"::djinni::c_api::OptionalTranslator::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" ) } else { val sharedPtr = cppMarshal.bySharedPtr(expr) @@ -105,8 +105,8 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val fromCppMethodName = if (sharedPtr) "fromSharedPtrCpp" else "fromCpp" makeNestedTranslator(resolved, resolved.typename, - s"::djinni::c_api::Optional::${toCppMethodName}<${cppOptionalTemplate}>", - s"::djinni::c_api::Optional::${fromCppMethodName}<${cppOptionalTemplate}>") + s"::djinni::c_api::OptionalTranslator::${toCppMethodName}<${cppOptionalTemplate}>", + s"::djinni::c_api::OptionalTranslator::${fromCppMethodName}<${cppOptionalTemplate}>") } } @@ -128,12 +128,12 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal (p) => { val innerToCppKey = resolvedKey.toCppTranslatorFn("key") val innerToCppValue = resolvedValue.toCppTranslatorFn("value") - s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::toCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerToCppKey}, ${innerToCppValue}); })" + s"::djinni::c_api::MapTranslator<${cppTypeKey}, ${cppTypeValue}>::toCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerToCppKey}, ${innerToCppValue}); })" }, (p) => { val innerFromCppKey = resolvedKey.fromCppTranslatorFn("key") val innerFromCppValue = resolvedValue.fromCppTranslatorFn("value") - s"::djinni::c_api::Map<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" + s"::djinni::c_api::MapTranslator<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" }) } @@ -141,10 +141,10 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal private def resolvePrimitive(cName: String, asBoxed: Boolean): CTypeTranslator = { if (asBoxed) { new CTypeTranslator("djinni_number_ref", true, (p) => { - s"::djinni::c_api::Number::toCpp<${cName}>(${p})" + s"::djinni::c_api::NumberTranslator::toCpp<${cName}>(${p})" }, (p) => { - s"::djinni::c_api::Number::fromCpp<${cName}>(${p})" + s"::djinni::c_api::NumberTranslator::fromCpp<${cName}>(${p})" }) } else { new CTypeTranslator(cName, false, p => p, p => p) @@ -219,10 +219,10 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal td match { case ast.Enum(_, _) => { val typename = valueTypeName(name) - s"::djinni::c_api::Enum<${cppTypename}, ${typename}>" + s"::djinni::c_api::EnumTranslator<${cppTypename}, ${typename}>" } - case ast.Record(_, _, _, _) => s"::djinni::c_api::Record<${cppTypename}>" - case ast.Interface(_, _, _) => s"::djinni::c_api::Interface<${cppTypename}>" + case ast.Record(_, _, _, _) => s"::djinni::c_api::RecordTranslator<${cppTypename}>" + case ast.Interface(_, _, _) => s"::djinni::c_api::InterfaceTranslator<${cppTypename}>" case ast.ProtobufMessage(_, _, _, _, _) => throw new AssertionError("Unsupported") } } @@ -254,19 +254,19 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal makeTranslator( "djinni_binary_ref", isRefType = true, - s"::djinni::c_api::Protobuf<${cppMarshal.fqTypename(expr)}>" + s"::djinni::c_api::ProtobufTranslator<${cppMarshal.fqTypename(expr)}>" ) case opaque: meta.MOpaque => opaque match { case meta.MPrimitive(_, _, _, cName, _, _, _, _) => resolvePrimitive(cName, asBoxed) - case meta.MString => makeTranslator("djinni_string_ref", isRefType = true, "::djinni::c_api::String") - case meta.MDate => makeTranslator("djinni_date_ref", isRefType = true, "::djinni::c_api::Date") - case meta.MBinary => makeTranslator("djinni_binary_ref", isRefType = true, "::djinni::c_api::Binary") + case meta.MString => makeTranslator("djinni_string_ref", isRefType = true, "::djinni::c_api::StringTranslator") + case meta.MDate => makeTranslator("djinni_date_ref", isRefType = true, "::djinni::c_api::DateTranslator") + case meta.MBinary => makeTranslator("djinni_binary_ref", isRefType = true, "::djinni::c_api::BinaryTranslator") case meta.MOptional => resolveOptional(expr.args.head, asBoxed, expr) - case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::List") - case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::Set") + case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::ListTranslator") + case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::SetTranslator") case meta.MMap => resolveMap(expr.args.head, expr.args(1)) - case meta.MArray => resolveListLike(expr.args.head, "::djinni::c_api::List") + case meta.MArray => resolveListLike(expr.args.head, "::djinni::c_api::ListTranslator") case meta.MVoid => new CTypeTranslator("void", false, p => p, p => p) } } diff --git a/support-lib/cpp/DataRef_c_translator.cpp b/support-lib/cpp/DataRef_c_translator.cpp new file mode 100644 index 00000000..f62f6db9 --- /dev/null +++ b/support-lib/cpp/DataRef_c_translator.cpp @@ -0,0 +1,47 @@ +#include "DataRef_c_translator.hpp" +#include "djinni_c_types.hpp" + +namespace djinni::c_api { + +class BinaryWithDataRef : public ::djinni::Binary { +public: + BinaryWithDataRef(const ::djinni::DataRef &dataRef) + : ::djinni::Binary(dataRef.mutableBuf(), dataRef.len()), + _dataRef(dataRef) {} + + ~BinaryWithDataRef() override = default; + +private: + djinni::DataRef _dataRef; +}; + +class DataRefImpl : public ::djinni::DataRef::Impl { +public: + DataRefImpl(djinni_binary_ref binary) : _binary(binary) { + djinni_ref_retain(binary); + } + + ~DataRefImpl() override { djinni_ref_release(_binary); } + + const uint8_t *buf() const override { + return djinni_binary_get_data(_binary); + } + + size_t len() const override { return djinni_binary_get_length(_binary); } + + uint8_t *mutableBuf() override { return djinni_binary_get_data(_binary); } + +private: + djinni_binary_ref _binary; +}; + +::djinni::DataRef DataRefTranslator::toCpp(djinni_binary_ref binary) { + return ::djinni::DataRef(std::make_shared(binary)); +} + +djinni_binary_ref DataRefTranslator::fromCpp(const ::djinni::DataRef &dataRef) { + Object *obj = new BinaryWithDataRef(dataRef); + return reinterpret_cast(obj); +} + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/DataRef_c_translator.hpp b/support-lib/cpp/DataRef_c_translator.hpp new file mode 100644 index 00000000..33883c03 --- /dev/null +++ b/support-lib/cpp/DataRef_c_translator.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "djinni_c.h" +#include "DataRef.hpp" + +namespace djinni::c_api { + +class DataRefTranslator { +public: + static ::djinni::DataRef toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(const ::djinni::DataRef &dataRef); +}; + +} \ No newline at end of file diff --git a/support-lib/cpp/DataView_c_translator.cpp b/support-lib/cpp/DataView_c_translator.cpp new file mode 100644 index 00000000..f2441c88 --- /dev/null +++ b/support-lib/cpp/DataView_c_translator.cpp @@ -0,0 +1,16 @@ +#include "DataView_c_translator.hpp" + +namespace djinni::c_api { + +::djinni::DataView DataViewTranslator::toCpp(djinni_binary_ref binary) { + return djinni::DataView(djinni_binary_get_data(binary), + djinni_binary_get_length(binary)); +} + +djinni_binary_ref +DataViewTranslator::fromCpp(const ::djinni::DataView &dataRef) { + return djinni_binary_new_with_bytes(dataRef.buf(), dataRef.len(), nullptr, + nullptr); +} + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/DataView_c_translator.hpp b/support-lib/cpp/DataView_c_translator.hpp new file mode 100644 index 00000000..6965db83 --- /dev/null +++ b/support-lib/cpp/DataView_c_translator.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "djinni_c.h" +#include "DataView.hpp" + +namespace djinni::c_api { + +class DataViewTranslator { +public: + static ::djinni::DataView toCpp(djinni_binary_ref binary); + static djinni_binary_ref fromCpp(const ::djinni::DataView &dataRef); +}; + + +} \ No newline at end of file diff --git a/support-lib/cpp/Future_c_translator.hpp b/support-lib/cpp/Future_c_translator.hpp new file mode 100644 index 00000000..502e94b2 --- /dev/null +++ b/support-lib/cpp/Future_c_translator.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include "Future.hpp" +#include "djinni_c.h" +#include "djinni_c_types.hpp" + +namespace djinni { +template class FutureHolder : public Object { +public: + FutureHolder(Future future) : _future(std::move(future)) {} + ~FutureHolder() override = default; + + Future &getFuture() { return _future; } + +private: + Future _future; +}; +} // namespace djinni + +namespace djinni::c_api { + +template class FutureTranslator { +public: + static ::djinni::Future toCpp(djinni_future_ref future) { + auto *futureHolder = static_cast<::djinni::FutureHolder *>( + reinterpret_cast(future)); + + // Any way to make this better? + + return futureHolder->getFuture().then( + [](::djinni::Future value) { return value.get(); }); + } + + static djinni_future_ref fromCpp(::djinni::Future &&future) { + Object *futureHolder = new ::djinni::FutureHolder(std::move(future)); + + return reinterpret_cast(futureHolder); + } +}; + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/Outcome_c.h b/support-lib/cpp/Outcome_c.h new file mode 100644 index 00000000..fb20932b --- /dev/null +++ b/support-lib/cpp/Outcome_c.h @@ -0,0 +1,4 @@ +#pragma once + +typedef void *djinni_outcome_ref; + diff --git a/support-lib/cpp/Outcome_c_translator.hpp b/support-lib/cpp/Outcome_c_translator.hpp new file mode 100644 index 00000000..507f95b2 --- /dev/null +++ b/support-lib/cpp/Outcome_c_translator.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "Outcome_c.h" +#include "expected.hpp" + +namespace djinni::c_api { + +template class OutcomeTranslator { +public: + static ::djinni::expected toCpp(djinni_outcome_ref future) { + std::abort(); + } + + static djinni_outcome_ref fromCpp(::djinni::expected &&outcome) { + std::abort(); + } + + static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome) { + std::abort(); + } +}; + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index c838b6d8..bdc09748 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -12,9 +12,6 @@ typedef djinni_ref djinni_array_ref; typedef djinni_ref djinni_keyval_array_ref; typedef djinni_ref djinni_date_ref; -typedef djinni_ref djinni_outcome_ref; -typedef djinni_ref djinni_future_ref; - typedef djinni_ref djinni_record_ref; typedef djinni_ref djinni_interface_ref; typedef djinni_ref djinni_proxy_class_ref; diff --git a/support-lib/cpp/djinni_c_helpers.cpp b/support-lib/cpp/djinni_c_helpers.cpp deleted file mode 100644 index a06d7520..00000000 --- a/support-lib/cpp/djinni_c_helpers.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "djinni_c_helpers.hpp" - -namespace djinni::c_api { - -class BinaryWithDataRef : public ::djinni::Binary { -public: - BinaryWithDataRef(const ::djinni::DataRef &dataRef) - : ::djinni::Binary(dataRef.mutableBuf(), dataRef.len()), - _dataRef(dataRef) {} - - ~BinaryWithDataRef() override = default; - -private: - djinni::DataRef _dataRef; -}; - -class BinaryWithVector : public ::djinni::Binary { -public: - BinaryWithVector(std::vector &&vec) - : ::djinni::Binary(vec.data(), vec.size()), _vec(std::move(vec)) {} - - ~BinaryWithVector() override = default; - -private: - std::vector _vec; -}; - -class DataRefImpl : public ::djinni::DataRef::Impl { -public: - DataRefImpl(djinni_binary_ref binary) : _binary(binary) { - djinni_ref_retain(binary); - } - - ~DataRefImpl() override { - djinni_ref_release(_binary); - } - - const uint8_t *buf() const override { - return djinni_binary_get_data(_binary); - } - - size_t len() const override { return djinni_binary_get_length(_binary); } - - uint8_t *mutableBuf() override { return djinni_binary_get_data(_binary); } - -private: - djinni_binary_ref _binary; -}; - -djinni_string_ref String::fromCpp(std::string &&str) { - return djinni_string_new(str.c_str(), str.length()); -} - -djinni_string_ref String::fromCpp(const std::string &str) { - return djinni_string_new(str.c_str(), str.length()); -} - -std::string String::toCpp(djinni_string_ref str) { - const auto *data = djinni_string_get_data(str); - auto length = djinni_string_get_length(str); - - return std::string(data, length); -} - -::djinni::DataRef DataRef::toCpp(djinni_binary_ref binary) { - return ::djinni::DataRef(std::make_shared(binary)); -} - -djinni_binary_ref DataRef::fromCpp(const ::djinni::DataRef &dataRef) { - Object *obj = new BinaryWithDataRef(dataRef); - return reinterpret_cast(obj); -} - -::djinni::DataView DataView::toCpp(djinni_binary_ref binary) { - return djinni::DataView(djinni_binary_get_data(binary), - djinni_binary_get_length(binary)); -} - -djinni_binary_ref DataView::fromCpp(const ::djinni::DataView &dataRef) { - return djinni_binary_new_with_bytes(dataRef.buf(), dataRef.len(), nullptr, nullptr); -} - -std::vector Binary::toCpp(djinni_binary_ref binary) { - const auto *data = djinni_binary_get_data(binary); - return std::vector(data, data + djinni_binary_get_length(binary)); -} - -djinni_binary_ref Binary::fromCpp(std::vector &&binary) { - Object *obj = new BinaryWithVector(std::move(binary)); - return reinterpret_cast(obj); -} - -djinni_binary_ref Binary::fromCpp(const std::vector &binary) { - return djinni_binary_new_with_bytes_copy(binary.data(), binary.size()); -} - -} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_translators.cpp b/support-lib/cpp/djinni_c_translators.cpp new file mode 100644 index 00000000..eb15ecfe --- /dev/null +++ b/support-lib/cpp/djinni_c_translators.cpp @@ -0,0 +1,46 @@ +#include "djinni_c_translators.hpp" + +namespace djinni::c_api { + +class BinaryWithVector : public ::djinni::Binary { +public: + BinaryWithVector(std::vector &&vec) + : ::djinni::Binary(vec.data(), vec.size()), _vec(std::move(vec)) {} + + ~BinaryWithVector() override = default; + +private: + std::vector _vec; +}; + +djinni_string_ref StringTranslator::fromCpp(std::string &&str) { + return djinni_string_new(str.c_str(), str.length()); +} + +djinni_string_ref StringTranslator::fromCpp(const std::string &str) { + return djinni_string_new(str.c_str(), str.length()); +} + +std::string StringTranslator::toCpp(djinni_string_ref str) { + const auto *data = djinni_string_get_data(str); + auto length = djinni_string_get_length(str); + + return std::string(data, length); +} + +std::vector BinaryTranslator::toCpp(djinni_binary_ref binary) { + const auto *data = djinni_binary_get_data(binary); + return std::vector(data, data + djinni_binary_get_length(binary)); +} + +djinni_binary_ref BinaryTranslator::fromCpp(std::vector &&binary) { + Object *obj = new BinaryWithVector(std::move(binary)); + return reinterpret_cast(obj); +} + +djinni_binary_ref +BinaryTranslator::fromCpp(const std::vector &binary) { + return djinni_binary_new_with_bytes_copy(binary.data(), binary.size()); +} + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_helpers.hpp b/support-lib/cpp/djinni_c_translators.hpp similarity index 80% rename from support-lib/cpp/djinni_c_helpers.hpp rename to support-lib/cpp/djinni_c_translators.hpp index db66a53f..b824843a 100644 --- a/support-lib/cpp/djinni_c_helpers.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -1,11 +1,7 @@ #pragma once -#include "DataRef.hpp" -#include "DataView.hpp" -#include "Future.hpp" #include "djinni_c.h" #include "djinni_c_types.hpp" -#include "expected.hpp" #include #include #include @@ -14,36 +10,23 @@ #include #include -namespace djinni { -template class FutureHolder : public Object { -public: - FutureHolder(Future future) : _future(std::move(future)) {} - ~FutureHolder() override = default; - - Future &getFuture() { return _future; } - -private: - Future _future; -}; -} // namespace djinni - namespace djinni::c_api { -class String { +class StringTranslator { public: static djinni_string_ref fromCpp(std::string &&str); static djinni_string_ref fromCpp(const std::string &str); static std::string toCpp(djinni_string_ref str); }; -class Date { +class DateTranslator { public: static djinni_date_ref fromCpp(const std::chrono::system_clock::time_point &date); static std::chrono::system_clock::time_point toCpp(djinni_date_ref date); }; -class Number { +class NumberTranslator { public: template static djinni_number_ref fromCpp(T value) = delete; template static T toCpp(djinni_number_ref value) = delete; @@ -140,7 +123,7 @@ class Number { } }; -class Optional { +class OptionalTranslator { public: template static T fromCppPrimitive(Opt value) { T out; @@ -221,7 +204,7 @@ class Optional { private: }; -template class List { +template class ListTranslator { public: template static std::vector toCpp(djinni_array_ref value, F &&convert) { @@ -253,7 +236,7 @@ template class List { } }; -template class Set { +template class SetTranslator { public: template static std::unordered_set toCpp(djinni_array_ref value, F &&convert) { @@ -286,7 +269,7 @@ template class Set { } }; -template class Map { +template class MapTranslator { public: template static std::unordered_map toCpp(djinni_keyval_array_ref key_values, @@ -324,7 +307,7 @@ template class Map { } }; -template class Record { +template class RecordTranslator { public: template static djinni_record_ref make(Args &&...args) { Object *obj = new RecordHolder(T(std::forward(args)...)); @@ -350,7 +333,7 @@ template class Record { } }; -template class Interface { +template class InterfaceTranslator { public: static const std::shared_ptr &toCpp(djinni_interface_ref ref) { auto *i = @@ -368,28 +351,25 @@ template class Interface { } }; -template class ProxyClass { +template class ProxyTranslator { public: static djinni_proxy_class_ref - make(const T *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { - Object *obj = new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); + makeClass(const PT *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { + Object *obj = new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); return reinterpret_cast(obj); } -}; -template class Proxy { -public: static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, void *opaque) { auto *proxyClass = static_cast<::djinni::ProxyClass *>( reinterpret_cast(proxyClassRef)); - return ::djinni::c_api::Interface::fromCpp( + return ::djinni::c_api::InterfaceTranslator::fromCpp( std::make_shared(proxyClass, opaque)); } }; -template class Enum { +template class EnumTranslator { public: static Cpp toCpp(C value) { return static_cast(value); } static C fromCpp(Cpp value) { return static_cast(value); } @@ -399,71 +379,18 @@ template class Enum { } static djinni_number_ref fromCppBoxed(Cpp value) { - return Number::fromCpp(static_cast(value)); + return NumberTranslator::fromCpp(static_cast(value)); } }; -class DataRef { -public: - static ::djinni::DataRef toCpp(djinni_binary_ref binary); - static djinni_binary_ref fromCpp(const ::djinni::DataRef &dataRef); -}; - -class DataView { -public: - static ::djinni::DataView toCpp(djinni_binary_ref binary); - static djinni_binary_ref fromCpp(const ::djinni::DataView &dataRef); -}; - -class Binary { +class BinaryTranslator { public: static std::vector toCpp(djinni_binary_ref binary); static djinni_binary_ref fromCpp(std::vector &&binary); static djinni_binary_ref fromCpp(const std::vector &binary); }; -template class Future { -public: - static ::djinni::Future toCpp(djinni_future_ref future) { - auto *futureHolder = static_cast<::djinni::FutureHolder *>( - reinterpret_cast(future)); - - // Any way to make this better? - - return futureHolder->getFuture().then( - [](::djinni::Future value) { return value.get(); }); - } - - static djinni_future_ref fromCpp(::djinni::Future &&future) { - Object *futureHolder = new ::djinni::FutureHolder(std::move(future)); - - return reinterpret_cast(futureHolder); - } -}; - -template class Outcome { -public: - static ::djinni::expected toCpp(djinni_outcome_ref future) { - std::abort(); - } - - static djinni_outcome_ref fromCpp(::djinni::expected &&outcome) { - std::abort(); - } - - static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome) { - std::abort(); - } -}; - -template class Duration { -public: - static std::chrono::duration toCpp(djinni_number_ref value); - static djinni_number_ref - fromCpp(const std::chrono::duration &value); -}; - -template class Protobuf { +template class ProtobufTranslator { public: static T toCpp(djinni_binary_ref binary) { T output; diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 1d1fb954..0cbaede1 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -1,8 +1,7 @@ #pragma once #include -#include -#include +#include namespace djinni { @@ -169,40 +168,4 @@ template class Proxy { void *_opaque; }; -template class Ref { -public: - struct AdoptRef {}; - - Ref(T ref, AdoptRef adoptRef) : _ref(ref) {} - - Ref(T ref) : _ref(ref) { Object::retain(_ref); } - - ~Ref() { Object::release(_ref); } - - Ref &operator=(const Ref &other) { - if (other != &this) { - auto old = _ref; - _ref = other._ref; - - Object::retain(_ref); - Object::release(old); - } - return *this; - } - - Ref &operator=(Ref &&other) { - if (other != &this) { - auto old = _ref; - _ref = other._ref; - other._ref = nullptr; - - Object::release(old); - } - return *this; - } - -private: - T _ref; -}; - } // namespace djinni \ No newline at end of file diff --git a/support-lib/cpp/future_c.h b/support-lib/cpp/future_c.h new file mode 100644 index 00000000..978baa39 --- /dev/null +++ b/support-lib/cpp/future_c.h @@ -0,0 +1,3 @@ +#pragma once + +typedef void *djinni_future_ref; diff --git a/support-lib/dataref.yaml b/support-lib/dataref.yaml index d900832e..b72ff210 100644 --- a/support-lib/dataref.yaml +++ b/support-lib/dataref.yaml @@ -47,6 +47,6 @@ swiftxx: header: '"Data_swift.hpp"' c: typename: 'djinni_binary_ref' - translator: '::djinni::c_api::DataRef' + translator: '::djinni::c_api::DataRefTranslator' public_header: '"$djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$DataRef_c_translator.hpp"' diff --git a/support-lib/dataview.yaml b/support-lib/dataview.yaml index 4dd39416..3ff49ce8 100644 --- a/support-lib/dataview.yaml +++ b/support-lib/dataview.yaml @@ -47,6 +47,6 @@ swiftxx: header: '"Data_swift.hpp"' c: typename: 'djinni_binary_ref' - translator: '::djinni::c_api::DataView' + translator: '::djinni::c_api::DataViewTranslator' public_header: '"$djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$DataView_c_translator.hpp"' diff --git a/support-lib/future.yaml b/support-lib/future.yaml index f5449422..596d7390 100644 --- a/support-lib/future.yaml +++ b/support-lib/future.yaml @@ -50,6 +50,6 @@ swiftxx: header: '"$Future_swift.hpp"' c: typename: 'djinni_future_ref' - translator: '::djinni::c_api::Future' - public_header: '"$djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + translator: '::djinni::c_api::FutureTranslator' + public_header: '"$Future_c.h"' + private_header: '"$Future_c_translator.hpp"' diff --git a/support-lib/outcome.yaml b/support-lib/outcome.yaml index 211651ec..e4e158b4 100644 --- a/support-lib/outcome.yaml +++ b/support-lib/outcome.yaml @@ -49,7 +49,7 @@ swiftxx: header: '"Outcome_swift.hpp"' c: typename: 'djinni_outcome_ref' - translator: '::djinni::c_api::Outcome' - public_header: '"$djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + translator: '::djinni::c_api::OutcomeTranslator' + public_header: '"$Outcome_c.h"' + private_header: '"$Outcome_c_translator.hpp"' diff --git a/test-suite/djinni/vendor/third-party/date.yaml b/test-suite/djinni/vendor/third-party/date.yaml index cf911c6f..72c0f4be 100644 --- a/test-suite/djinni/vendor/third-party/date.yaml +++ b/test-suite/djinni/vendor/third-party/date.yaml @@ -46,6 +46,6 @@ swiftxx: header: '"djinni_support.hpp"' c: typename: 'djinni_date_ref' - translator: '::djinni::c_api::Date' + translator: '::djinni::c_api::DateTranslator' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$djinni_c_translators.hpp"' diff --git a/test-suite/djinni/vendor/third-party/duration.yaml b/test-suite/djinni/vendor/third-party/duration.yaml index 07d02224..935c1f30 100644 --- a/test-suite/djinni/vendor/third-party/duration.yaml +++ b/test-suite/djinni/vendor/third-party/duration.yaml @@ -47,9 +47,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration' + translator: '::djinni::c_api::DurationTranslator' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: h typedef: 'record' @@ -95,9 +95,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_h' + translator: '::djinni::c_api::DurationTranslator_h' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: min typedef: 'record' @@ -143,9 +143,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_min' + translator: '::djinni::c_api::DurationTranslator_min' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: s typedef: 'record' @@ -191,9 +191,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_s' + translator: '::djinni::c_api::DurationTranslator_s' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: ms typedef: 'record' @@ -239,9 +239,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_ms' + translator: '::djinni::c_api::DurationTranslator_ms' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: us typedef: 'record' @@ -287,9 +287,9 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_us' + translator: '::djinni::c_api::DurationTranslator_us' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' --- name: ns typedef: 'record' @@ -335,6 +335,6 @@ swiftxx: header: '"Duration-swift.hpp"' c: typename: 'djinni_number_ref' - translator: '::djinni::c_api::Duration_ns' + translator: '::djinni::c_api::DurationTranslator_ns' public_header: '"djinni_c.h"' - private_header: '"$djinni_c_helpers.hpp"' + private_header: '"$duration_c_translator.hpp"' diff --git a/test-suite/generated-src/c/Conflict.cpp b/test-suite/generated-src/c/Conflict.cpp index e17af29d..5adb066d 100644 --- a/test-suite/generated-src/c/Conflict.cpp +++ b/test-suite/generated-src/c/Conflict.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from test.djinni #include "Conflict.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "Conflict.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct Conflict_Proxy: public Proxy_Parent, public ::testsuite::Conflict { }; testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/DataRefTest.cpp b/test-suite/generated-src/c/DataRefTest.cpp index 67cbc437..08d5059f 100644 --- a/test-suite/generated-src/c/DataRefTest.cpp +++ b/test-suite/generated-src/c/DataRefTest.cpp @@ -2,11 +2,12 @@ // This file was generated by Djinni from data_ref_view.djinni #include "DataRefTest.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "DataRef.hpp" #include "DataRefTest.hpp" +#include "DataRef_c_translator.hpp" #include "DataView.hpp" -#include "djinni_c_helpers.hpp" +#include "DataView_c_translator.hpp" #include using Proxy_Parent = ::djinni::Proxy; @@ -16,7 +17,7 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest ~DataRefTest_Proxy() override = default; void sendData(const ::djinni::DataRef & data) override { - auto data_c = ::djinni::c_api::DataRef::fromCpp(data); + auto data_c = ::djinni::c_api::DataRefTranslator::fromCpp(data); Proxy_Parent::getProxyClass().methodDefs().sendData(Proxy_Parent::getOpaque(), data_c); djinni_ref_release(data_c); } @@ -24,13 +25,13 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest std::vector retriveAsBin() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().retriveAsBin(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::Binary::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::BinaryTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } void sendMutableData(const ::djinni::DataRef & data) override { - auto data_c = ::djinni::c_api::DataRef::fromCpp(data); + auto data_c = ::djinni::c_api::DataRefTranslator::fromCpp(data); Proxy_Parent::getProxyClass().methodDefs().sendMutableData(Proxy_Parent::getOpaque(), data_c); djinni_ref_release(data_c); } @@ -38,7 +39,7 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest ::djinni::DataRef generateData() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().generateData(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -46,7 +47,7 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest ::djinni::DataRef dataFromVec() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromVec(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -54,17 +55,17 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest ::djinni::DataRef dataFromStr() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromStr(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::DataRef::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } std::vector sendDataView(const ::djinni::DataView & data) override { - auto data_c = ::djinni::c_api::DataView::fromCpp(data); + auto data_c = ::djinni::c_api::DataViewTranslator::fromCpp(data); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().sendDataView(Proxy_Parent::getOpaque(), data_c); djinni_ref_release(data_c); - auto returnValue_cpp = ::djinni::c_api::Binary::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::BinaryTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -72,7 +73,7 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest ::djinni::DataView recvDataView() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().recvDataView(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::DataView::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::DataViewTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -80,63 +81,63 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest }; testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { - ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendData(::djinni::c_api::DataRef::toCpp(data)); + ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendData(::djinni::c_api::DataRefTranslator::toCpp(data)); } djinni_binary_ref testsuite_DataRefTest_retriveAsBin(testsuite_DataRefTest_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->retriveAsBin(); - return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->retriveAsBin(); + return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); } void testsuite_DataRefTest_sendMutableData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { - ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendMutableData(::djinni::c_api::DataRef::toCpp(data)); + ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendMutableData(::djinni::c_api::DataRefTranslator::toCpp(data)); } djinni_binary_ref testsuite_DataRefTest_generateData(testsuite_DataRefTest_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->generateData(); - return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->generateData(); + return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_DataRefTest_dataFromVec(testsuite_DataRefTest_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->dataFromVec(); - return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->dataFromVec(); + return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_DataRefTest_dataFromStr(testsuite_DataRefTest_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->dataFromStr(); - return ::djinni::c_api::DataRef::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->dataFromStr(); + return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_DataRefTest_sendDataView(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->sendDataView(::djinni::c_api::DataView::toCpp(data)); - return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendDataView(::djinni::c_api::DataViewTranslator::toCpp(data)); + return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_DataRefTest_recvDataView(testsuite_DataRefTest_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::DataRefTest>::toCpp(instance)->recvDataView(); - return ::djinni::c_api::DataView::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->recvDataView(); + return ::djinni::c_api::DataViewTranslator::fromCpp(std::move(retValue)); } testsuite_DataRefTest_ref testsuite_DataRefTest_create() { auto retValue = ::testsuite::DataRefTest::create(); - return ::djinni::c_api::Interface<::testsuite::DataRefTest>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp index 674e9427..f3d21695 100644 --- a/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp +++ b/test-suite/generated-src/c/RecordWithEmbeddedCppProto.cpp @@ -2,23 +2,23 @@ // This file was generated by Djinni from proto.djinni #include "RecordWithEmbeddedCppProto.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "RecordWithEmbeddedCppProto.hpp" #include "proto/cpp/test2.pb.h" testsuite_RecordWithEmbeddedCppProto_ref testsuite_RecordWithEmbeddedCppProto_new(djinni_binary_ref state) { - return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::make(::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(state)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::make(::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::toCpp(state)); } djinni_binary_ref testsuite_RecordWithEmbeddedCppProto_get_state(testsuite_RecordWithEmbeddedCppProto_ref instance) { - return ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state); + return ::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state); } void testsuite_RecordWithEmbeddedCppProto_set_state(testsuite_RecordWithEmbeddedCppProto_ref instance, djinni_binary_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state = ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state = ::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::toCpp(value); } diff --git a/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp b/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp index 5802abb6..41b0eb49 100644 --- a/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp +++ b/test-suite/generated-src/c/RecordWithEmbeddedProto.cpp @@ -2,23 +2,23 @@ // This file was generated by Djinni from proto.djinni #include "RecordWithEmbeddedProto.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "RecordWithEmbeddedProto.hpp" #include "proto/cpp/test.pb.h" testsuite_RecordWithEmbeddedProto_ref testsuite_RecordWithEmbeddedProto_new(djinni_binary_ref person) { - return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::make(::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(person)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::make(::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(person)); } djinni_binary_ref testsuite_RecordWithEmbeddedProto_get_person(testsuite_RecordWithEmbeddedProto_ref instance) { - return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person); + return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person); } void testsuite_RecordWithEmbeddedProto_set_person(testsuite_RecordWithEmbeddedProto_ref instance, djinni_binary_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person = ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person = ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(value); } diff --git a/test-suite/generated-src/c/_varname_interface_.cpp b/test-suite/generated-src/c/_varname_interface_.cpp index 440be93a..c91f5280 100644 --- a/test-suite/generated-src/c/_varname_interface_.cpp +++ b/test-suite/generated-src/c/_varname_interface_.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from varnames.djinni #include "_varname_interface_.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "_varname_interface_.hpp" #include "_varname_record_.hpp" #include @@ -14,21 +14,21 @@ struct VarnameInterface_Proxy: public Proxy_Parent, public ::testsuite::VarnameI ~VarnameInterface_Proxy() override = default; ::testsuite::VarnameRecord _rmethod_(const ::testsuite::VarnameRecord & _r_arg_) override { - auto _r_arg__c = ::djinni::c_api::Record<::testsuite::VarnameRecord>::fromCpp(_r_arg_); + auto _r_arg__c = ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::fromCpp(_r_arg_); auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._rmethod_(Proxy_Parent::getOpaque(), _r_arg__c); djinni_ref_release(_r_arg__c); - auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> _imethod_(const /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> & _i_arg_) override { - auto _i_arg__c = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::fromCpp(_i_arg_); + auto _i_arg__c = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::fromCpp(_i_arg_); auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._imethod_(Proxy_Parent::getOpaque(), _i_arg__c); djinni_ref_release(_i_arg__c); - auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -36,11 +36,11 @@ struct VarnameInterface_Proxy: public Proxy_Parent, public ::testsuite::VarnameI }; testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** @@ -50,14 +50,14 @@ testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__v */ testsuite__varname_record__ref testsuite__varname_interface___rmethod_(testsuite__varname_interface__ref instance, testsuite__varname_record__ref _r_arg_) { - auto retValue = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(instance)->_rmethod_(::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(_r_arg_)); - return ::djinni::c_api::Record<::testsuite::VarnameRecord>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(instance)->_rmethod_(::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(_r_arg_)); + return ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::fromCpp(std::move(retValue)); } testsuite__varname_interface__ref testsuite__varname_interface___imethod_(testsuite__varname_interface__ref instance, testsuite__varname_interface__ref _i_arg_) { - auto retValue = ::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(instance)->_imethod_(::djinni::c_api::Interface<::testsuite::VarnameInterface>::toCpp(_i_arg_)); - return ::djinni::c_api::Interface<::testsuite::VarnameInterface>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(instance)->_imethod_(::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(_i_arg_)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/_varname_record_.cpp b/test-suite/generated-src/c/_varname_record_.cpp index 25478187..3fce47dd 100644 --- a/test-suite/generated-src/c/_varname_record_.cpp +++ b/test-suite/generated-src/c/_varname_record_.cpp @@ -2,22 +2,22 @@ // This file was generated by Djinni from varnames.djinni #include "_varname_record_.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "_varname_record_.hpp" testsuite__varname_record__ref testsuite__varname_record__new(int8_t _field_) { - return ::djinni::c_api::Record<::testsuite::VarnameRecord>::make(_field_); + return ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::make(_field_); } int8_t testsuite__varname_record__get__field_(testsuite__varname_record__ref instance) { - return ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(instance)._field_; + return ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(instance)._field_; } void testsuite__varname_record__set__field_(testsuite__varname_record__ref instance, int8_t value) { - ::djinni::c_api::Record<::testsuite::VarnameRecord>::toCpp(instance)._field_ = value; + ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(instance)._field_ = value; } diff --git a/test-suite/generated-src/c/access_flags.cpp b/test-suite/generated-src/c/access_flags.cpp index b1b84d3f..97a141d1 100644 --- a/test-suite/generated-src/c/access_flags.cpp +++ b/test-suite/generated-src/c/access_flags.cpp @@ -2,6 +2,6 @@ // This file was generated by Djinni from enum_flags.djinni #include "access_flags.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" diff --git a/test-suite/generated-src/c/assorted_primitives.cpp b/test-suite/generated-src/c/assorted_primitives.cpp index e3ff12a0..3b2e27b7 100644 --- a/test-suite/generated-src/c/assorted_primitives.cpp +++ b/test-suite/generated-src/c/assorted_primitives.cpp @@ -2,152 +2,152 @@ // This file was generated by Djinni from primtypes.djinni #include "assorted_primitives.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "assorted_primitives.hpp" testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8_t o_eight, djinni_optional_int16_t o_sixteen, djinni_optional_int32_t o_thirtytwo, djinni_optional_int64_t o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::make(b, eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_bool>(o_b), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int8_t>(o_eight), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int16_t>(o_sixteen), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int32_t>(o_thirtytwo), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int64_t>(o_sixtyfour), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_float>(o_fthirtytwo), ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_double>(o_fsixtyfour)); + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::make(b, eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_bool>(o_b), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int8_t>(o_eight), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int16_t>(o_sixteen), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int32_t>(o_thirtytwo), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int64_t>(o_sixtyfour), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_float>(o_fthirtytwo), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_double>(o_fsixtyfour)); } bool testsuite_assorted_primitives_get_b(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).b; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).b; } void testsuite_assorted_primitives_set_b(testsuite_assorted_primitives_ref instance, bool value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).b = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).b = value; } int8_t testsuite_assorted_primitives_get_eight(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).eight; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).eight; } void testsuite_assorted_primitives_set_eight(testsuite_assorted_primitives_ref instance, int8_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).eight = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).eight = value; } int16_t testsuite_assorted_primitives_get_sixteen(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen; } void testsuite_assorted_primitives_set_sixteen(testsuite_assorted_primitives_ref instance, int16_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen = value; } int32_t testsuite_assorted_primitives_get_thirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo; } void testsuite_assorted_primitives_set_thirtytwo(testsuite_assorted_primitives_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo = value; } int64_t testsuite_assorted_primitives_get_sixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour; } void testsuite_assorted_primitives_set_sixtyfour(testsuite_assorted_primitives_ref instance, int64_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour = value; } float testsuite_assorted_primitives_get_fthirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo; } void testsuite_assorted_primitives_set_fthirtytwo(testsuite_assorted_primitives_ref instance, float value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo = value; } double testsuite_assorted_primitives_get_fsixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour; + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour; } void testsuite_assorted_primitives_set_fsixtyfour(testsuite_assorted_primitives_ref instance, double value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour = value; + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).fsixtyfour = value; } djinni_optional_bool testsuite_assorted_primitives_get_o_b(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_bool>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_b); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_bool>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b); } void testsuite_assorted_primitives_set_o_b(testsuite_assorted_primitives_ref instance, djinni_optional_bool value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_b = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_bool>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_bool>(value); } djinni_optional_int8_t testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int8_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int8_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight); } void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int8_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int8_t>(value); } djinni_optional_int16_t testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int16_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int16_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen); } void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int16_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int16_t>(value); } djinni_optional_int32_t testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int32_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int32_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo); } void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int32_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int32_t>(value); } djinni_optional_int64_t testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int64_t>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int64_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour); } void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64_t value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_int64_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int64_t>(value); } djinni_optional_float testsuite_assorted_primitives_get_o_fthirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_float>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_float>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo); } void testsuite_assorted_primitives_set_o_fthirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_float value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_float>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_float>(value); } djinni_optional_double testsuite_assorted_primitives_get_o_fsixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_double>(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_double>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour); } void testsuite_assorted_primitives_set_o_fsixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_double value) { - ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour = ::djinni::c_api::Optional::toCppPrimitive, djinni_optional_double>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_double>(value); } diff --git a/test-suite/generated-src/c/async_interface.cpp b/test-suite/generated-src/c/async_interface.cpp index 66cad880..1baea922 100644 --- a/test-suite/generated-src/c/async_interface.cpp +++ b/test-suite/generated-src/c/async_interface.cpp @@ -2,10 +2,10 @@ // This file was generated by Djinni from test.djinni #include "async_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "Future.hpp" +#include "Future_c_translator.hpp" #include "async_interface.hpp" -#include "djinni_c_helpers.hpp" using Proxy_Parent = ::djinni::Proxy; struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInterface { @@ -14,11 +14,11 @@ struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInter ~AsyncInterface_Proxy() override = default; ::djinni::Future future_roundtrip(::djinni::Future f) override { - auto f_c = ::djinni::c_api::Future::fromCpp(std::move(f)); + auto f_c = ::djinni::c_api::FutureTranslator::fromCpp(std::move(f)); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().future_roundtrip(Proxy_Parent::getOpaque(), f_c); djinni_ref_release(f_c); - auto returnValue_cpp = ::djinni::c_api::Future::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::FutureTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -26,17 +26,17 @@ struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInter }; testsuite_async_interface_proxy_class_ref testsuite_async_interface_proxy_class_new(const testsuite_async_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) { - auto retValue = ::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::Future::toCpp(f)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/async_interface.h b/test-suite/generated-src/c/async_interface.h index 9d1c04e3..34148a01 100644 --- a/test-suite/generated-src/c/async_interface.h +++ b/test-suite/generated-src/c/async_interface.h @@ -4,7 +4,7 @@ #pragma once #include "djinni_c.h" -#include "djinni_c.h" +#include "Future_c.h" #ifdef __cplusplus extern "C" { diff --git a/test-suite/generated-src/c/client_interface.cpp b/test-suite/generated-src/c/client_interface.cpp index c8c96055..fbba88b6 100644 --- a/test-suite/generated-src/c/client_interface.cpp +++ b/test-suite/generated-src/c/client_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from client_interface.djinni #include "client_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "client_interface.hpp" #include "client_returned_record.hpp" #include @@ -15,19 +15,19 @@ struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInt ::testsuite::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional & misc) override { auto record_id_c = record_id; - auto utf8string_c = ::djinni::c_api::String::fromCpp(utf8string); - auto misc_c = ::djinni::c_api::Optional::fromCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + auto utf8string_c = ::djinni::c_api::StringTranslator::fromCpp(utf8string); + auto misc_c = ::djinni::c_api::OptionalTranslator::fromCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().get_record(Proxy_Parent::getOpaque(), record_id_c, utf8string_c, misc_c); djinni_ref_release(utf8string_c); djinni_ref_release(misc_c); - auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } double identifier_check(const std::vector & data, int32_t r, int64_t jret) override { - auto data_c = ::djinni::c_api::Binary::fromCpp(data); + auto data_c = ::djinni::c_api::BinaryTranslator::fromCpp(data); auto r_c = r; auto jret_c = jret; auto returnValue = Proxy_Parent::getProxyClass().methodDefs().identifier_check(Proxy_Parent::getOpaque(), data_c, r_c, jret_c); @@ -40,27 +40,27 @@ struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInt std::string return_str() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { - auto i_c = ::djinni::c_api::Interface<::testsuite::ClientInterface>::fromCpp(i); + auto i_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::fromCpp(i); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); djinni_ref_release(i_c); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { - auto i_c = ::djinni::c_api::Optional::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ClientInterface>::fromCpp(std::forward(value)); }); + auto i_c = ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::fromCpp(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); djinni_ref_release(i_c); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -68,42 +68,42 @@ struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInt }; testsuite_client_interface_proxy_class_ref testsuite_client_interface_proxy_class_new(const testsuite_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_client_interface_ref testsuite_client_interface_new(testsuite_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** Returns record of given string */ testsuite_client_returned_record_ref testsuite_client_interface_get_record(testsuite_client_interface_ref instance, int64_t record_id, djinni_string_ref utf8string, djinni_string_ref misc) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->get_record(record_id, ::djinni::c_api::String::toCpp(utf8string), ::djinni::c_api::Optional::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); - return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->get_record(record_id, ::djinni::c_api::StringTranslator::toCpp(utf8string), ::djinni::c_api::OptionalTranslator::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::fromCpp(std::move(retValue)); } double testsuite_client_interface_identifier_check(testsuite_client_interface_ref instance, djinni_binary_ref data, int32_t r, int64_t jret) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->identifier_check(::djinni::c_api::Binary::toCpp(data), r, jret); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->identifier_check(::djinni::c_api::BinaryTranslator::toCpp(data), r, jret); return std::move(retValue); } djinni_string_ref testsuite_client_interface_return_str(testsuite_client_interface_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->return_str(); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->return_str(); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_client_interface_meth_taking_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_client_interface_meth_taking_optional_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::Optional::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(std::forward(value)); })); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(std::forward(value)); })); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/client_returned_record.cpp b/test-suite/generated-src/c/client_returned_record.cpp index 1c96fb04..410b7b53 100644 --- a/test-suite/generated-src/c/client_returned_record.cpp +++ b/test-suite/generated-src/c/client_returned_record.cpp @@ -2,42 +2,42 @@ // This file was generated by Djinni from client_interface.djinni #include "client_returned_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "client_returned_record.hpp" testsuite_client_returned_record_ref testsuite_client_returned_record_new(int64_t record_id, djinni_string_ref content, djinni_string_ref misc) { - return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::make(record_id, ::djinni::c_api::String::toCpp(content), ::djinni::c_api::Optional::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::make(record_id, ::djinni::c_api::StringTranslator::toCpp(content), ::djinni::c_api::OptionalTranslator::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); } int64_t testsuite_client_returned_record_get_record_id(testsuite_client_returned_record_ref instance) { - return ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id; + return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id; } void testsuite_client_returned_record_set_record_id(testsuite_client_returned_record_ref instance, int64_t value) { - ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id = value; + ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).record_id = value; } djinni_string_ref testsuite_client_returned_record_get_content(testsuite_client_returned_record_ref instance) { - return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).content); + return ::djinni::c_api::StringTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).content); } void testsuite_client_returned_record_set_content(testsuite_client_returned_record_ref instance, djinni_string_ref value) { - ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).content = ::djinni::c_api::String::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).content = ::djinni::c_api::StringTranslator::toCpp(value); } djinni_string_ref testsuite_client_returned_record_get_misc(testsuite_client_returned_record_ref instance) { - return ::djinni::c_api::Optional::fromCpp>(::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).misc, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator::fromCpp>(::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } void testsuite_client_returned_record_set_misc(testsuite_client_returned_record_ref instance, djinni_string_ref value) { - ::djinni::c_api::Record<::testsuite::ClientReturnedRecord>::toCpp(instance).misc = ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc = ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/color.cpp b/test-suite/generated-src/c/color.cpp index a59ddae3..17ea2a83 100644 --- a/test-suite/generated-src/c/color.cpp +++ b/test-suite/generated-src/c/color.cpp @@ -2,6 +2,6 @@ // This file was generated by Djinni from enum.djinni #include "color.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" diff --git a/test-suite/generated-src/c/conflict_user.cpp b/test-suite/generated-src/c/conflict_user.cpp index 63d30790..a29e0526 100644 --- a/test-suite/generated-src/c/conflict_user.cpp +++ b/test-suite/generated-src/c/conflict_user.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from test.djinni #include "conflict_user.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "conflict_user.hpp" #include @@ -15,13 +15,13 @@ struct ConflictUser_Proxy: public Proxy_Parent, public ::testsuite::ConflictUser /*not-null*/ std::shared_ptr<::testsuite::Conflict> Conflict() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().Conflict(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::Conflict>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } bool conflict_arg(const std::vector> & cs) override { - auto cs_c = ::djinni::c_api::List>::fromCpp(cs, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::Conflict>::fromCpp(std::forward(value)); }); + auto cs_c = ::djinni::c_api::ListTranslator>::fromCpp(cs, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::fromCpp(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().conflict_arg(Proxy_Parent::getOpaque(), cs_c); djinni_ref_release(cs_c); @@ -32,22 +32,22 @@ struct ConflictUser_Proxy: public Proxy_Parent, public ::testsuite::ConflictUser }; testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ConflictUser>::toCpp(instance)->Conflict(); - return ::djinni::c_api::Interface<::testsuite::Conflict>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ConflictUser>::toCpp(instance)->Conflict(); + return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::fromCpp(std::move(retValue)); } bool testsuite_conflict_user_conflict_arg(testsuite_conflict_user_ref instance, djinni_array_ref cs) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ConflictUser>::toCpp(instance)->conflict_arg(::djinni::c_api::List>::toCpp(cs, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::Conflict>::toCpp(std::forward(value)); })); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ConflictUser>::toCpp(instance)->conflict_arg(::djinni::c_api::ListTranslator>::toCpp(cs, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::toCpp(std::forward(value)); })); return std::move(retValue); } diff --git a/test-suite/generated-src/c/constant_enum.cpp b/test-suite/generated-src/c/constant_enum.cpp index 39950e02..035c9cd8 100644 --- a/test-suite/generated-src/c/constant_enum.cpp +++ b/test-suite/generated-src/c/constant_enum.cpp @@ -2,6 +2,6 @@ // This file was generated by Djinni from constant_enum.djinni #include "constant_enum.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" diff --git a/test-suite/generated-src/c/constant_interface_with_enum.cpp b/test-suite/generated-src/c/constant_interface_with_enum.cpp index fc1a9059..a6676597 100644 --- a/test-suite/generated-src/c/constant_interface_with_enum.cpp +++ b/test-suite/generated-src/c/constant_interface_with_enum.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from constant_enum.djinni #include "constant_interface_with_enum.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "constant_interface_with_enum.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct ConstantInterfaceWithEnum_Proxy: public Proxy_Parent, public ::testsuite: }; testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/constant_record.cpp b/test-suite/generated-src/c/constant_record.cpp index 92645d67..6a4a0802 100644 --- a/test-suite/generated-src/c/constant_record.cpp +++ b/test-suite/generated-src/c/constant_record.cpp @@ -2,32 +2,32 @@ // This file was generated by Djinni from constants.djinni #include "constant_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "constant_record.hpp" testsuite_constant_record_ref testsuite_constant_record_new(int32_t some_integer, djinni_string_ref some_string) { - return ::djinni::c_api::Record<::testsuite::ConstantRecord>::make(some_integer, ::djinni::c_api::String::toCpp(some_string)); + return ::djinni::c_api::RecordTranslator<::testsuite::ConstantRecord>::make(some_integer, ::djinni::c_api::StringTranslator::toCpp(some_string)); } int32_t testsuite_constant_record_get_some_integer(testsuite_constant_record_ref instance) { - return ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_integer; + return ::djinni::c_api::RecordTranslator<::testsuite::ConstantRecord>::toCpp(instance).some_integer; } void testsuite_constant_record_set_some_integer(testsuite_constant_record_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_integer = value; + ::djinni::c_api::RecordTranslator<::testsuite::ConstantRecord>::toCpp(instance).some_integer = value; } djinni_string_ref testsuite_constant_record_get_some_string(testsuite_constant_record_ref instance) { - return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_string); + return ::djinni::c_api::StringTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::ConstantRecord>::toCpp(instance).some_string); } void testsuite_constant_record_set_some_string(testsuite_constant_record_ref instance, djinni_string_ref value) { - ::djinni::c_api::Record<::testsuite::ConstantRecord>::toCpp(instance).some_string = ::djinni::c_api::String::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::ConstantRecord>::toCpp(instance).some_string = ::djinni::c_api::StringTranslator::toCpp(value); } diff --git a/test-suite/generated-src/c/constant_with_enum.cpp b/test-suite/generated-src/c/constant_with_enum.cpp index a53953f5..20b713ed 100644 --- a/test-suite/generated-src/c/constant_with_enum.cpp +++ b/test-suite/generated-src/c/constant_with_enum.cpp @@ -2,12 +2,12 @@ // This file was generated by Djinni from constant_enum.djinni #include "constant_with_enum.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "constant_with_enum.hpp" testsuite_constant_with_enum_ref testsuite_constant_with_enum_new() { - return ::djinni::c_api::Record<::testsuite::ConstantWithEnum>::make(); + return ::djinni::c_api::RecordTranslator<::testsuite::ConstantWithEnum>::make(); } diff --git a/test-suite/generated-src/c/constants.cpp b/test-suite/generated-src/c/constants.cpp index af1b4a26..7e8fc4c5 100644 --- a/test-suite/generated-src/c/constants.cpp +++ b/test-suite/generated-src/c/constants.cpp @@ -2,12 +2,12 @@ // This file was generated by Djinni from constants.djinni #include "constants.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "constants.hpp" testsuite_constants_ref testsuite_constants_new() { - return ::djinni::c_api::Record<::testsuite::Constants>::make(); + return ::djinni::c_api::RecordTranslator<::testsuite::Constants>::make(); } diff --git a/test-suite/generated-src/c/constants_interface.cpp b/test-suite/generated-src/c/constants_interface.cpp index 9e97f27d..5587fdb3 100644 --- a/test-suite/generated-src/c/constants_interface.cpp +++ b/test-suite/generated-src/c/constants_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from constants.djinni #include "constants_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "constants_interface.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -18,11 +18,11 @@ struct ConstantsInterface_Proxy: public Proxy_Parent, public ::testsuite::Consta }; testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** @@ -32,7 +32,7 @@ testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_co */ void testsuite_constants_interface_dummy(testsuite_constants_interface_ref instance) { - ::djinni::c_api::Interface<::testsuite::ConstantsInterface>::toCpp(instance)->dummy(); + ::djinni::c_api::InterfaceTranslator<::testsuite::ConstantsInterface>::toCpp(instance)->dummy(); } diff --git a/test-suite/generated-src/c/cpp_exception.cpp b/test-suite/generated-src/c/cpp_exception.cpp index 35cbe06c..5cded102 100644 --- a/test-suite/generated-src/c/cpp_exception.cpp +++ b/test-suite/generated-src/c/cpp_exception.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from exception.djinni #include "cpp_exception.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "cpp_exception.hpp" #include @@ -20,7 +20,7 @@ struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException } int32_t call_throwing_interface(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { - auto cb_c = ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::fromCpp(cb); + auto cb_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::fromCpp(cb); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_interface(Proxy_Parent::getOpaque(), cb_c); djinni_ref_release(cb_c); @@ -29,11 +29,11 @@ struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException } std::string call_throwing_and_catch(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { - auto cb_c = ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::fromCpp(cb); + auto cb_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::fromCpp(cb); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_and_catch(Proxy_Parent::getOpaque(), cb_c); djinni_ref_release(cb_c); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -41,35 +41,35 @@ struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException }; testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->throw_an_exception(); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->throw_an_exception(); return std::move(retValue); } int32_t testsuite_cpp_exception_call_throwing_interface(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) { - auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->call_throwing_interface(::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(cb)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->call_throwing_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(cb)); return std::move(retValue); } djinni_string_ref testsuite_cpp_exception_call_throwing_and_catch(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) { - auto retValue = ::djinni::c_api::Interface<::testsuite::CppException>::toCpp(instance)->call_throwing_and_catch(::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(cb)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->call_throwing_and_catch(::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(cb)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } testsuite_cpp_exception_ref testsuite_cpp_exception_get() { auto retValue = ::testsuite::CppException::get(); - return ::djinni::c_api::Interface<::testsuite::CppException>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/date_record.cpp b/test-suite/generated-src/c/date_record.cpp index 7e36b617..8bc7a8b6 100644 --- a/test-suite/generated-src/c/date_record.cpp +++ b/test-suite/generated-src/c/date_record.cpp @@ -2,24 +2,24 @@ // This file was generated by Djinni from date.djinni #include "date_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "date_record.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include testsuite_date_record_ref testsuite_date_record_new(djinni_date_ref created_at) { - return ::djinni::c_api::Record<::testsuite::DateRecord>::make(::djinni::c_api::Date::toCpp(created_at)); + return ::djinni::c_api::RecordTranslator<::testsuite::DateRecord>::make(::djinni::c_api::DateTranslator::toCpp(created_at)); } djinni_date_ref testsuite_date_record_get_created_at(testsuite_date_record_ref instance) { - return ::djinni::c_api::Date::fromCpp(::djinni::c_api::Record<::testsuite::DateRecord>::toCpp(instance).created_at); + return ::djinni::c_api::DateTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::DateRecord>::toCpp(instance).created_at); } void testsuite_date_record_set_created_at(testsuite_date_record_ref instance, djinni_date_ref value) { - ::djinni::c_api::Record<::testsuite::DateRecord>::toCpp(instance).created_at = ::djinni::c_api::Date::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::DateRecord>::toCpp(instance).created_at = ::djinni::c_api::DateTranslator::toCpp(value); } diff --git a/test-suite/generated-src/c/empty_flags.cpp b/test-suite/generated-src/c/empty_flags.cpp index fb84b46e..6b775b34 100644 --- a/test-suite/generated-src/c/empty_flags.cpp +++ b/test-suite/generated-src/c/empty_flags.cpp @@ -2,6 +2,6 @@ // This file was generated by Djinni from enum_flags.djinni #include "empty_flags.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" diff --git a/test-suite/generated-src/c/empty_record.cpp b/test-suite/generated-src/c/empty_record.cpp index 46b48015..6b40d71a 100644 --- a/test-suite/generated-src/c/empty_record.cpp +++ b/test-suite/generated-src/c/empty_record.cpp @@ -2,12 +2,12 @@ // This file was generated by Djinni from test.djinni #include "empty_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "empty_record.hpp" testsuite_empty_record_ref testsuite_empty_record_new() { - return ::djinni::c_api::Record<::testsuite::EmptyRecord>::make(); + return ::djinni::c_api::RecordTranslator<::testsuite::EmptyRecord>::make(); } diff --git a/test-suite/generated-src/c/enum_usage_interface.cpp b/test-suite/generated-src/c/enum_usage_interface.cpp index cc8ee0df..203b6e93 100644 --- a/test-suite/generated-src/c/enum_usage_interface.cpp +++ b/test-suite/generated-src/c/enum_usage_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from enum.djinni #include "enum_usage_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "color.hpp" #include "enum_usage_interface.hpp" @@ -13,49 +13,49 @@ struct EnumUsageInterface_Proxy: public Proxy_Parent, public ::testsuite::EnumUs ~EnumUsageInterface_Proxy() override = default; ::testsuite::color e(::testsuite::color e) override { - auto e_c = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(e); + auto e_c = ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCpp(e); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().e(Proxy_Parent::getOpaque(), e_c); - auto returnValue_cpp = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(returnValue); return returnValue_cpp; } std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> o) override { - auto o_c = ::djinni::c_api::Optional::fromCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto o_c = ::djinni::c_api::OptionalTranslator::fromCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().o(Proxy_Parent::getOpaque(), o_c); djinni_ref_release(o_c); - auto returnValue_cpp = ::djinni::c_api::Optional::toCpp>(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + auto returnValue_cpp = ::djinni::c_api::OptionalTranslator::toCpp>(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); djinni_ref_release(returnValue); return returnValue_cpp; } std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & l) override { - auto l_c = ::djinni::c_api::List<::testsuite::color>::fromCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto l_c = ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().l(Proxy_Parent::getOpaque(), l_c); djinni_ref_release(l_c); - auto returnValue_cpp = ::djinni::c_api::List<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + auto returnValue_cpp = ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); djinni_ref_release(returnValue); return returnValue_cpp; } std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & s) override { - auto s_c = ::djinni::c_api::Set<::testsuite::color>::fromCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto s_c = ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().s(Proxy_Parent::getOpaque(), s_c); djinni_ref_release(s_c); - auto returnValue_cpp = ::djinni::c_api::Set<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + auto returnValue_cpp = ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); djinni_ref_release(returnValue); return returnValue_cpp; } std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & m) override { - auto m_c = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + auto m_c = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().m(Proxy_Parent::getOpaque(), m_c); djinni_ref_release(m_c); - auto returnValue_cpp = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(returnValue, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); + auto returnValue_cpp = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(returnValue, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -63,41 +63,41 @@ struct EnumUsageInterface_Proxy: public Proxy_Parent, public ::testsuite::EnumUs }; testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e) { - auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->e(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(e)); - return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->e(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(e)); + return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_enum_usage_interface_o(testsuite_enum_usage_interface_ref instance, djinni_number_ref o) { - auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->o(::djinni::c_api::Optional::toCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->o(::djinni::c_api::OptionalTranslator::toCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } djinni_array_ref testsuite_enum_usage_interface_l(testsuite_enum_usage_interface_ref instance, djinni_array_ref l) { - auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->l(::djinni::c_api::List<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::List<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->l(::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } djinni_array_ref testsuite_enum_usage_interface_s(testsuite_enum_usage_interface_ref instance, djinni_array_ref s) { - auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->s(::djinni::c_api::Set<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::Set<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->s(::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } djinni_keyval_array_ref testsuite_enum_usage_interface_m(testsuite_enum_usage_interface_ref instance, djinni_keyval_array_ref m) { - auto retValue = ::djinni::c_api::Interface<::testsuite::EnumUsageInterface>::toCpp(instance)->m(::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); - return ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->m(::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); + return ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); } diff --git a/test-suite/generated-src/c/enum_usage_record.cpp b/test-suite/generated-src/c/enum_usage_record.cpp index fbd1b7ae..9db02a7e 100644 --- a/test-suite/generated-src/c/enum_usage_record.cpp +++ b/test-suite/generated-src/c/enum_usage_record.cpp @@ -2,63 +2,63 @@ // This file was generated by Djinni from enum.djinni #include "enum_usage_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "color.hpp" #include "enum_usage_record.hpp" testsuite_enum_usage_record_ref testsuite_enum_usage_record_new(testsuite_color e, djinni_number_ref o, djinni_array_ref l, djinni_array_ref s, djinni_keyval_array_ref m) { - return ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::make(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(e), ::djinni::c_api::Optional::toCpp>(o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::List<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::Set<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::make(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(e), ::djinni::c_api::OptionalTranslator::toCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); } testsuite_color testsuite_enum_usage_record_get_e(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).e); + return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).e); } void testsuite_enum_usage_record_set_e(testsuite_enum_usage_record_ref instance, testsuite_color value) { - ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).e = ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).e = ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(value); } djinni_number_ref testsuite_enum_usage_record_get_o(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::Optional::fromCpp>(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator::fromCpp>(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } void testsuite_enum_usage_record_set_o(testsuite_enum_usage_record_ref instance, djinni_number_ref value) { - ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).o = ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o = ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); } djinni_array_ref testsuite_enum_usage_record_get_l(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::List<::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).l, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } void testsuite_enum_usage_record_set_l(testsuite_enum_usage_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).l = ::djinni::c_api::List<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l = ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); } djinni_array_ref testsuite_enum_usage_record_get_s(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::Set<::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).s, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); } void testsuite_enum_usage_record_set_s(testsuite_enum_usage_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).s = ::djinni::c_api::Set<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s = ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); } djinni_keyval_array_ref testsuite_enum_usage_record_get_m(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::fromCpp(::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + return ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); } void testsuite_enum_usage_record_set_m(testsuite_enum_usage_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::Record<::testsuite::EnumUsageRecord>::toCpp(instance).m = ::djinni::c_api::Map<::testsuite::color, ::testsuite::color>::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); } diff --git a/test-suite/generated-src/c/extended_record.cpp b/test-suite/generated-src/c/extended_record.cpp index 2c073793..9c059f95 100644 --- a/test-suite/generated-src/c/extended_record.cpp +++ b/test-suite/generated-src/c/extended_record.cpp @@ -2,22 +2,22 @@ // This file was generated by Djinni from extended_record.djinni #include "extended_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "extended_record.hpp" testsuite_extended_record_ref testsuite_extended_record_new(bool foo) { - return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::make(foo); + return ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::make(foo); } bool testsuite_extended_record_get_foo(testsuite_extended_record_ref instance) { - return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(instance).foo; + return ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(instance).foo; } void testsuite_extended_record_set_foo(testsuite_extended_record_ref instance, bool value) { - ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(instance).foo = value; + ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(instance).foo = value; } diff --git a/test-suite/generated-src/c/first_listener.cpp b/test-suite/generated-src/c/first_listener.cpp index 7b121a46..1a92e3e1 100644 --- a/test-suite/generated-src/c/first_listener.cpp +++ b/test-suite/generated-src/c/first_listener.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from multiple_inheritance.djinni #include "first_listener.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "first_listener.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -18,16 +18,16 @@ struct FirstListener_Proxy: public Proxy_Parent, public ::testsuite::FirstListen }; testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_first_listener_first(testsuite_first_listener_ref instance) { - ::djinni::c_api::Interface<::testsuite::FirstListener>::toCpp(instance)->first(); + ::djinni::c_api::InterfaceTranslator<::testsuite::FirstListener>::toCpp(instance)->first(); } diff --git a/test-suite/generated-src/c/flag_roundtrip.cpp b/test-suite/generated-src/c/flag_roundtrip.cpp index abae4498..94e95839 100644 --- a/test-suite/generated-src/c/flag_roundtrip.cpp +++ b/test-suite/generated-src/c/flag_roundtrip.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from enum_flags.djinni #include "flag_roundtrip.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "access_flags.hpp" #include "empty_flags.hpp" #include "flag_roundtrip.hpp" @@ -16,35 +16,35 @@ struct FlagRoundtrip_Proxy: public Proxy_Parent, public ::testsuite::FlagRoundtr }; testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access(::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(flag)); - return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access(::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCpp(flag)); + return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::fromCpp(std::move(retValue)); } testsuite_empty_flags testsuite_flag_roundtrip_roundtrip_empty(testsuite_empty_flags flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty(::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::toCpp(flag)); - return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty(::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::toCpp(flag)); + return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_flag_roundtrip_roundtrip_access_boxed(djinni_number_ref flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access_boxed(::djinni::c_api::Optional::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCppBoxed(std::forward(value)); }); + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access_boxed(::djinni::c_api::OptionalTranslator::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::fromCppBoxed(std::forward(value)); }); } djinni_number_ref testsuite_flag_roundtrip_roundtrip_empty_boxed(djinni_number_ref flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty_boxed(::djinni::c_api::Optional::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Enum<::testsuite::empty_flags, testsuite_empty_flags>::fromCppBoxed(std::forward(value)); }); + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty_boxed(::djinni::c_api::OptionalTranslator::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::toCppBoxed(std::forward(value)); })); + return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::fromCppBoxed(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/interface_using_extended_record.cpp b/test-suite/generated-src/c/interface_using_extended_record.cpp index a7ab4056..7bbb8f5d 100644 --- a/test-suite/generated-src/c/interface_using_extended_record.cpp +++ b/test-suite/generated-src/c/interface_using_extended_record.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from extended_record.djinni #include "interface_using_extended_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "../../handwritten-src/cpp/extended_record.hpp" #include "interface_using_extended_record.hpp" @@ -13,11 +13,11 @@ struct InterfaceUsingExtendedRecord_Proxy: public Proxy_Parent, public ::testsui ~InterfaceUsingExtendedRecord_Proxy() override = default; ::testsuite::ExtendedRecord meth(const ::testsuite::ExtendedRecord & er) override { - auto er_c = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(er); + auto er_c = ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::fromCpp(er); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth(Proxy_Parent::getOpaque(), er_c); djinni_ref_release(er_c); - auto returnValue_cpp = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -25,17 +25,17 @@ struct InterfaceUsingExtendedRecord_Proxy: public Proxy_Parent, public ::testsui }; testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er) { - auto retValue = ::djinni::c_api::Interface<::testsuite::InterfaceUsingExtendedRecord>::toCpp(instance)->meth(::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(er)); - return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::InterfaceUsingExtendedRecord>::toCpp(instance)->meth(::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(er)); + return ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/java_only_listener.cpp b/test-suite/generated-src/c/java_only_listener.cpp index bffda540..72093744 100644 --- a/test-suite/generated-src/c/java_only_listener.cpp +++ b/test-suite/generated-src/c/java_only_listener.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from single_language_interfaces.djinni #include "java_only_listener.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "java_only_listener.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct JavaOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::JavaOnly }; testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/listener_caller.cpp b/test-suite/generated-src/c/listener_caller.cpp index ff4adc6f..21d8dca0 100644 --- a/test-suite/generated-src/c/listener_caller.cpp +++ b/test-suite/generated-src/c/listener_caller.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from multiple_inheritance.djinni #include "listener_caller.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "listener_caller.hpp" #include @@ -23,27 +23,27 @@ struct ListenerCaller_Proxy: public Proxy_Parent, public ::testsuite::ListenerCa }; testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l) { - auto retValue = ::testsuite::ListenerCaller::init(::djinni::c_api::Interface<::testsuite::FirstListener>::toCpp(first_l), ::djinni::c_api::Interface<::testsuite::SecondListener>::toCpp(second_l)); - return ::djinni::c_api::Interface<::testsuite::ListenerCaller>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ListenerCaller::init(::djinni::c_api::InterfaceTranslator<::testsuite::FirstListener>::toCpp(first_l), ::djinni::c_api::InterfaceTranslator<::testsuite::SecondListener>::toCpp(second_l)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::fromCpp(std::move(retValue)); } void testsuite_listener_caller_callFirst(testsuite_listener_caller_ref instance) { - ::djinni::c_api::Interface<::testsuite::ListenerCaller>::toCpp(instance)->callFirst(); + ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::toCpp(instance)->callFirst(); } void testsuite_listener_caller_callSecond(testsuite_listener_caller_ref instance) { - ::djinni::c_api::Interface<::testsuite::ListenerCaller>::toCpp(instance)->callSecond(); + ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::toCpp(instance)->callSecond(); } diff --git a/test-suite/generated-src/c/map_date_record.cpp b/test-suite/generated-src/c/map_date_record.cpp index 033b18fa..b0b3a893 100644 --- a/test-suite/generated-src/c/map_date_record.cpp +++ b/test-suite/generated-src/c/map_date_record.cpp @@ -2,24 +2,24 @@ // This file was generated by Djinni from date.djinni #include "map_date_record.h" -#include "djinni_c_helpers.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "djinni_c_translators.hpp" #include "map_date_record.hpp" #include testsuite_map_date_record_ref testsuite_map_date_record_new(djinni_keyval_array_ref dates_by_id) { - return ::djinni::c_api::Record<::testsuite::MapDateRecord>::make(::djinni::c_api::Map::toCpp(dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Date::toCpp(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::make(::djinni::c_api::MapTranslator::toCpp(dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::DateTranslator::toCpp(value)); })); } djinni_keyval_array_ref testsuite_map_date_record_get_dates_by_id(testsuite_map_date_record_ref instance) { - return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Date::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::DateTranslator::fromCpp(value)); }); } void testsuite_map_date_record_set_dates_by_id(testsuite_map_date_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::Record<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Date::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::DateTranslator::toCpp(value)); }); } diff --git a/test-suite/generated-src/c/map_list_record.cpp b/test-suite/generated-src/c/map_list_record.cpp index 1250978c..36b37f2b 100644 --- a/test-suite/generated-src/c/map_list_record.cpp +++ b/test-suite/generated-src/c/map_list_record.cpp @@ -2,22 +2,22 @@ // This file was generated by Djinni from map.djinni #include "map_list_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "map_list_record.hpp" testsuite_map_list_record_ref testsuite_map_list_record_new(djinni_array_ref map_list) { - return ::djinni::c_api::Record<::testsuite::MapListRecord>::make(::djinni::c_api::List>::toCpp(map_list, [](auto&& value) { return ::djinni::c_api::Map::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::make(::djinni::c_api::ListTranslator>::toCpp(map_list, [](auto&& value) { return ::djinni::c_api::MapTranslator::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); })); } djinni_array_ref testsuite_map_list_record_get_map_list(testsuite_map_list_record_ref instance) { - return ::djinni::c_api::List>::fromCpp(::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(instance).map_list, [](auto&& value) { return ::djinni::c_api::Map::fromCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); }); + return ::djinni::c_api::ListTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list, [](auto&& value) { return ::djinni::c_api::MapTranslator::fromCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); }); } void testsuite_map_list_record_set_map_list(testsuite_map_list_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(instance).map_list = ::djinni::c_api::List>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Map::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list = ::djinni::c_api::ListTranslator>::toCpp(value, [](auto&& value) { return ::djinni::c_api::MapTranslator::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); }); } diff --git a/test-suite/generated-src/c/map_record.cpp b/test-suite/generated-src/c/map_record.cpp index 8bec49b7..377396f0 100644 --- a/test-suite/generated-src/c/map_record.cpp +++ b/test-suite/generated-src/c/map_record.cpp @@ -2,32 +2,32 @@ // This file was generated by Djinni from map.djinni #include "map_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "map_record.hpp" testsuite_map_record_ref testsuite_map_record_new(djinni_keyval_array_ref map, djinni_keyval_array_ref imap) { - return ::djinni::c_api::Record<::testsuite::MapRecord>::make(::djinni::c_api::Map::toCpp(map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }), ::djinni::c_api::Map::toCpp(imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::make(::djinni::c_api::MapTranslator::toCpp(map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }), ::djinni::c_api::MapTranslator::toCpp(imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); } djinni_keyval_array_ref testsuite_map_record_get_map(testsuite_map_record_ref instance) { - return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); } void testsuite_map_record_set_map(testsuite_map_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).map = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); } djinni_keyval_array_ref testsuite_map_record_get_imap(testsuite_map_record_ref instance) { - return ::djinni::c_api::Map::fromCpp(::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); } void testsuite_map_record_set_imap(testsuite_map_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::Record<::testsuite::MapRecord>::toCpp(instance).imap = ::djinni::c_api::Map::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Number::toCpp(key), ::djinni::c_api::Number::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); } diff --git a/test-suite/generated-src/c/nested_collection.cpp b/test-suite/generated-src/c/nested_collection.cpp index 0d313dbd..bf583387 100644 --- a/test-suite/generated-src/c/nested_collection.cpp +++ b/test-suite/generated-src/c/nested_collection.cpp @@ -2,22 +2,22 @@ // This file was generated by Djinni from nested_collection.djinni #include "nested_collection.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "nested_collection.hpp" testsuite_nested_collection_ref testsuite_nested_collection_new(djinni_array_ref set_list) { - return ::djinni::c_api::Record<::testsuite::NestedCollection>::make(::djinni::c_api::List>::toCpp(set_list, [](auto&& value) { return ::djinni::c_api::Set::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::make(::djinni::c_api::ListTranslator>::toCpp(set_list, [](auto&& value) { return ::djinni::c_api::SetTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); } djinni_array_ref testsuite_nested_collection_get_set_list(testsuite_nested_collection_ref instance) { - return ::djinni::c_api::List>::fromCpp(::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(instance).set_list, [](auto&& value) { return ::djinni::c_api::Set::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::ListTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list, [](auto&& value) { return ::djinni::c_api::SetTranslator::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); } void testsuite_nested_collection_set_set_list(testsuite_nested_collection_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(instance).set_list = ::djinni::c_api::List>::toCpp(value, [](auto&& value) { return ::djinni::c_api::Set::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list = ::djinni::c_api::ListTranslator>::toCpp(value, [](auto&& value) { return ::djinni::c_api::SetTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); }); } diff --git a/test-suite/generated-src/c/nested_outcome.cpp b/test-suite/generated-src/c/nested_outcome.cpp index e5244d09..440d75b0 100644 --- a/test-suite/generated-src/c/nested_outcome.cpp +++ b/test-suite/generated-src/c/nested_outcome.cpp @@ -2,24 +2,24 @@ // This file was generated by Djinni from outcome.djinni #include "nested_outcome.h" -#include "djinni_c_helpers.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "Outcome_c_translator.hpp" #include "expected.hpp" #include "nested_outcome.hpp" testsuite_nested_outcome_ref testsuite_nested_outcome_new(djinni_outcome_ref o) { - return ::djinni::c_api::Record<::testsuite::NestedOutcome>::make(::djinni::c_api::Outcome::toCpp(o)); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::make(::djinni::c_api::OutcomeTranslator::toCpp(o)); } djinni_outcome_ref testsuite_nested_outcome_get_o(testsuite_nested_outcome_ref instance) { - return ::djinni::c_api::Outcome::fromCpp(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(instance).o); + return ::djinni::c_api::OutcomeTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o); } void testsuite_nested_outcome_set_o(testsuite_nested_outcome_ref instance, djinni_outcome_ref value) { - ::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::Outcome::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::OutcomeTranslator::toCpp(value); } diff --git a/test-suite/generated-src/c/nested_outcome.h b/test-suite/generated-src/c/nested_outcome.h index 26279a42..687b0e9a 100644 --- a/test-suite/generated-src/c/nested_outcome.h +++ b/test-suite/generated-src/c/nested_outcome.h @@ -4,7 +4,7 @@ #pragma once #include "djinni_c.h" -#include "djinni_c.h" +#include "Outcome_c.h" #ifdef __cplusplus extern "C" { diff --git a/test-suite/generated-src/c/objc_only_listener.cpp b/test-suite/generated-src/c/objc_only_listener.cpp index b4179ac7..9b772e09 100644 --- a/test-suite/generated-src/c/objc_only_listener.cpp +++ b/test-suite/generated-src/c/objc_only_listener.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from single_language_interfaces.djinni #include "objc_only_listener.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "objc_only_listener.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct ObjcOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::ObjcOnly }; testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/primitive_list.cpp b/test-suite/generated-src/c/primitive_list.cpp index 85ab1144..e5a0601e 100644 --- a/test-suite/generated-src/c/primitive_list.cpp +++ b/test-suite/generated-src/c/primitive_list.cpp @@ -2,32 +2,32 @@ // This file was generated by Djinni from primitive_list.djinni #include "primitive_list.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "primitive_list.hpp" testsuite_primitive_list_ref testsuite_primitive_list_new(djinni_array_ref list, djinni_array_ref optional_list) { - return ::djinni::c_api::Record<::testsuite::PrimitiveList>::make(::djinni::c_api::List::toCpp(list, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }), ::djinni::c_api::Optional::toCpp>>>(optional_list, [](auto&& value) { return ::djinni::c_api::List>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::make(::djinni::c_api::ListTranslator::toCpp(list, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::toCpp>>>(optional_list, [](auto&& value) { return ::djinni::c_api::ListTranslator>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); }); })); } djinni_array_ref testsuite_primitive_list_get_list(testsuite_primitive_list_ref instance) { - return ::djinni::c_api::List::fromCpp(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).list, [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); + return ::djinni::c_api::ListTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } void testsuite_primitive_list_set_list(testsuite_primitive_list_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).list = ::djinni::c_api::List::toCpp(value, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list = ::djinni::c_api::ListTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); } djinni_array_ref testsuite_primitive_list_get_optional_list(testsuite_primitive_list_ref instance) { - return ::djinni::c_api::Optional::fromCpp>>>(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).optional_list, [](auto&& value) { return ::djinni::c_api::List>::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); }); }); + return ::djinni::c_api::OptionalTranslator::fromCpp>>>(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list, [](auto&& value) { return ::djinni::c_api::ListTranslator>::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); }); } void testsuite_primitive_list_set_optional_list(testsuite_primitive_list_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(instance).optional_list = ::djinni::c_api::Optional::toCpp>>>(value, [](auto&& value) { return ::djinni::c_api::List>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list = ::djinni::c_api::OptionalTranslator::toCpp>>>(value, [](auto&& value) { return ::djinni::c_api::ListTranslator>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); }); }); } diff --git a/test-suite/generated-src/c/proto_tests.cpp b/test-suite/generated-src/c/proto_tests.cpp index b17102fe..0b761a69 100644 --- a/test-suite/generated-src/c/proto_tests.cpp +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -2,10 +2,10 @@ // This file was generated by Djinni from proto.djinni #include "proto_tests.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "Outcome_c_translator.hpp" #include "RecordWithEmbeddedCppProto.hpp" #include "RecordWithEmbeddedProto.hpp" -#include "djinni_c_helpers.hpp" #include "expected.hpp" #include "proto/cpp/test.pb.h" #include "proto/cpp/test2.pb.h" @@ -20,89 +20,89 @@ struct ProtoTests_Proxy: public Proxy_Parent, public ::testsuite::ProtoTests { }; testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x) { - auto retValue = ::testsuite::ProtoTests::protoToStrings(::djinni::c_api::Protobuf<::djinni::test::AddressBook>::toCpp(x)); - return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::ProtoTests::protoToStrings(::djinni::c_api::ProtobufTranslator<::djinni::test::AddressBook>::toCpp(x)); + return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_binary_ref testsuite_proto_tests_stringsToProto(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::stringsToProto(::djinni::c_api::List::toCpp(x, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); - return ::djinni::c_api::Protobuf<::djinni::test::AddressBook>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::stringsToProto(::djinni::c_api::ListTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::ProtobufTranslator<::djinni::test::AddressBook>::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_proto_tests_embeddedProtoToString(testsuite_RecordWithEmbeddedProto_ref x) { - auto retValue = ::testsuite::ProtoTests::embeddedProtoToString(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::toCpp(x)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::embeddedProtoToString(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::toCpp(x)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } testsuite_RecordWithEmbeddedProto_ref testsuite_proto_tests_stringToEmbeddedProto(djinni_string_ref x) { - auto retValue = ::testsuite::ProtoTests::stringToEmbeddedProto(::djinni::c_api::String::toCpp(x)); - return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedProto>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::stringToEmbeddedProto(::djinni::c_api::StringTranslator::toCpp(x)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_proto_tests_cppProtoToString(djinni_binary_ref x) { - auto retValue = ::testsuite::ProtoTests::cppProtoToString(::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::toCpp(x)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::cppProtoToString(::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::toCpp(x)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_proto_tests_stringToCppProto(djinni_string_ref x) { - auto retValue = ::testsuite::ProtoTests::stringToCppProto(::djinni::c_api::String::toCpp(x)); - return ::djinni::c_api::Protobuf<::djinni::test2::PersistingState>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::stringToCppProto(::djinni::c_api::StringTranslator::toCpp(x)); + return ::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_proto_tests_embeddedCppProtoToString(testsuite_RecordWithEmbeddedCppProto_ref x) { - auto retValue = ::testsuite::ProtoTests::embeddedCppProtoToString(::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::toCpp(x)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::embeddedCppProtoToString(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::toCpp(x)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } testsuite_RecordWithEmbeddedCppProto_ref testsuite_proto_tests_stringToEmbeddedCppProto(djinni_string_ref x) { - auto retValue = ::testsuite::ProtoTests::stringToEmbeddedCppProto(::djinni::c_api::String::toCpp(x)); - return ::djinni::c_api::Record<::testsuite::RecordWithEmbeddedCppProto>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::stringToEmbeddedCppProto(::djinni::c_api::StringTranslator::toCpp(x)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::fromCpp(std::move(retValue)); } djinni_array_ref testsuite_proto_tests_protoListToStrings(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::protoListToStrings(::djinni::c_api::List<::djinni::test::Person>::toCpp(x, [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(std::forward(value)); })); - return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::ProtoTests::protoListToStrings(::djinni::c_api::ListTranslator<::djinni::test::Person>::toCpp(x, [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(std::forward(value)); })); + return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_array_ref testsuite_proto_tests_stringsToProtoList(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::stringsToProtoList(::djinni::c_api::List::toCpp(x, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); - return ::djinni::c_api::List<::djinni::test::Person>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::ProtoTests::stringsToProtoList(::djinni::c_api::ListTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::ListTranslator<::djinni::test::Person>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }); } djinni_string_ref testsuite_proto_tests_optionalProtoToString(djinni_binary_ref x) { - auto retValue = ::testsuite::ProtoTests::optionalProtoToString(::djinni::c_api::Optional::toCpp>(x, [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::toCpp(std::forward(value)); })); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::optionalProtoToString(::djinni::c_api::OptionalTranslator::toCpp>(x, [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(std::forward(value)); })); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_proto_tests_stringToOptionalProto(djinni_string_ref x) { - auto retValue = ::testsuite::ProtoTests::stringToOptionalProto(::djinni::c_api::String::toCpp(x)); - return ::djinni::c_api::Optional::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Protobuf<::djinni::test::Person>::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::ProtoTests::stringToOptionalProto(::djinni::c_api::StringTranslator::toCpp(x)); + return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }); } djinni_outcome_ref testsuite_proto_tests_stringToProtoOutcome(djinni_string_ref x) { - auto retValue = ::testsuite::ProtoTests::stringToProtoOutcome(::djinni::c_api::String::toCpp(x)); - return ::djinni::c_api::Outcome<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::ProtoTests::stringToProtoOutcome(::djinni::c_api::StringTranslator::toCpp(x)); + return ::djinni::c_api::OutcomeTranslator<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/proto_tests.h b/test-suite/generated-src/c/proto_tests.h index 820d101f..5ead2789 100644 --- a/test-suite/generated-src/c/proto_tests.h +++ b/test-suite/generated-src/c/proto_tests.h @@ -4,9 +4,9 @@ #pragma once #include "djinni_c.h" +#include "Outcome_c.h" #include "RecordWithEmbeddedCppProto.h" #include "RecordWithEmbeddedProto.h" -#include "djinni_c.h" #ifdef __cplusplus extern "C" { diff --git a/test-suite/generated-src/c/record_using_extended_record.cpp b/test-suite/generated-src/c/record_using_extended_record.cpp index 8ea16a2c..79b68c00 100644 --- a/test-suite/generated-src/c/record_using_extended_record.cpp +++ b/test-suite/generated-src/c/record_using_extended_record.cpp @@ -2,23 +2,23 @@ // This file was generated by Djinni from extended_record.djinni #include "record_using_extended_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "../../handwritten-src/cpp/extended_record.hpp" #include "record_using_extended_record.hpp" testsuite_record_using_extended_record_ref testsuite_record_using_extended_record_new(testsuite_extended_record_ref er) { - return ::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::make(::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(er)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordUsingExtendedRecord>::make(::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(er)); } testsuite_extended_record_ref testsuite_record_using_extended_record_get_er(testsuite_record_using_extended_record_ref instance) { - return ::djinni::c_api::Record<::testsuite::ExtendedRecord>::fromCpp(::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er); + return ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er); } void testsuite_record_using_extended_record_set_er(testsuite_record_using_extended_record_ref instance, testsuite_extended_record_ref value) { - ::djinni::c_api::Record<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er = ::djinni::c_api::Record<::testsuite::ExtendedRecord>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er = ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(value); } diff --git a/test-suite/generated-src/c/record_with_derivings.cpp b/test-suite/generated-src/c/record_with_derivings.cpp index 7caed94f..019f6dc9 100644 --- a/test-suite/generated-src/c/record_with_derivings.cpp +++ b/test-suite/generated-src/c/record_with_derivings.cpp @@ -2,92 +2,92 @@ // This file was generated by Djinni from derivings.djinni #include "record_with_derivings.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "record_with_derivings.hpp" testsuite_record_with_derivings_ref testsuite_record_with_derivings_new(int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_date_ref d, djinni_string_ref s) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::make(eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::Date::toCpp(d), ::djinni::c_api::String::toCpp(s)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::make(eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::DateTranslator::toCpp(d), ::djinni::c_api::StringTranslator::toCpp(s)); } int8_t testsuite_record_with_derivings_get_eight(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).eight; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).eight; } void testsuite_record_with_derivings_set_eight(testsuite_record_with_derivings_ref instance, int8_t value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).eight = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).eight = value; } int16_t testsuite_record_with_derivings_get_sixteen(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen; } void testsuite_record_with_derivings_set_sixteen(testsuite_record_with_derivings_ref instance, int16_t value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).sixteen = value; } int32_t testsuite_record_with_derivings_get_thirtytwo(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo; } void testsuite_record_with_derivings_set_thirtytwo(testsuite_record_with_derivings_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).thirtytwo = value; } int64_t testsuite_record_with_derivings_get_sixtyfour(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour; } void testsuite_record_with_derivings_set_sixtyfour(testsuite_record_with_derivings_ref instance, int64_t value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour = value; } float testsuite_record_with_derivings_get_fthirtytwo(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo; } void testsuite_record_with_derivings_set_fthirtytwo(testsuite_record_with_derivings_ref instance, float value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo = value; } double testsuite_record_with_derivings_get_fsixtyfour(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour; } void testsuite_record_with_derivings_set_fsixtyfour(testsuite_record_with_derivings_ref instance, double value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).fsixtyfour = value; } djinni_date_ref testsuite_record_with_derivings_get_d(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::Date::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).d); + return ::djinni::c_api::DateTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).d); } void testsuite_record_with_derivings_set_d(testsuite_record_with_derivings_ref instance, djinni_date_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).d = ::djinni::c_api::Date::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).d = ::djinni::c_api::DateTranslator::toCpp(value); } djinni_string_ref testsuite_record_with_derivings_get_s(testsuite_record_with_derivings_ref instance) { - return ::djinni::c_api::String::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).s); + return ::djinni::c_api::StringTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).s); } void testsuite_record_with_derivings_set_s(testsuite_record_with_derivings_ref instance, djinni_string_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(instance).s = ::djinni::c_api::String::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).s = ::djinni::c_api::StringTranslator::toCpp(value); } diff --git a/test-suite/generated-src/c/record_with_duration_and_derivings.cpp b/test-suite/generated-src/c/record_with_duration_and_derivings.cpp index 838c0e86..08c3a29b 100644 --- a/test-suite/generated-src/c/record_with_duration_and_derivings.cpp +++ b/test-suite/generated-src/c/record_with_duration_and_derivings.cpp @@ -2,24 +2,24 @@ // This file was generated by Djinni from duration.djinni #include "record_with_duration_and_derivings.h" -#include "djinni_c_helpers.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "duration_c_translator.hpp" #include "record_with_duration_and_derivings.hpp" #include testsuite_record_with_duration_and_derivings_ref testsuite_record_with_duration_and_derivings_new(djinni_number_ref dt) { - return ::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::make(::djinni::c_api::Duration::toCpp(dt)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDurationAndDerivings>::make(::djinni::c_api::DurationTranslator::toCpp(dt)); } djinni_number_ref testsuite_record_with_duration_and_derivings_get_dt(testsuite_record_with_duration_and_derivings_ref instance) { - return ::djinni::c_api::Duration::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt); + return ::djinni::c_api::DurationTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt); } void testsuite_record_with_duration_and_derivings_set_dt(testsuite_record_with_duration_and_derivings_ref instance, djinni_number_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt = ::djinni::c_api::Duration::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt = ::djinni::c_api::DurationTranslator::toCpp(value); } diff --git a/test-suite/generated-src/c/record_with_flags.cpp b/test-suite/generated-src/c/record_with_flags.cpp index 3f889c3f..2bf3542c 100644 --- a/test-suite/generated-src/c/record_with_flags.cpp +++ b/test-suite/generated-src/c/record_with_flags.cpp @@ -2,23 +2,23 @@ // This file was generated by Djinni from enum_flags.djinni #include "record_with_flags.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "access_flags.hpp" #include "record_with_flags.hpp" testsuite_record_with_flags_ref testsuite_record_with_flags_new(testsuite_access_flags access) { - return ::djinni::c_api::Record<::testsuite::RecordWithFlags>::make(::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(access)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithFlags>::make(::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCpp(access)); } testsuite_access_flags testsuite_record_with_flags_get_access(testsuite_record_with_flags_ref instance) { - return ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithFlags>::toCpp(instance).access); + return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithFlags>::toCpp(instance).access); } void testsuite_record_with_flags_set_access(testsuite_record_with_flags_ref instance, testsuite_access_flags value) { - ::djinni::c_api::Record<::testsuite::RecordWithFlags>::toCpp(instance).access = ::djinni::c_api::Enum<::testsuite::access_flags, testsuite_access_flags>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithFlags>::toCpp(instance).access = ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCpp(value); } diff --git a/test-suite/generated-src/c/record_with_nested_derivings.cpp b/test-suite/generated-src/c/record_with_nested_derivings.cpp index a7746310..c5284b2a 100644 --- a/test-suite/generated-src/c/record_with_nested_derivings.cpp +++ b/test-suite/generated-src/c/record_with_nested_derivings.cpp @@ -2,33 +2,33 @@ // This file was generated by Djinni from derivings.djinni #include "record_with_nested_derivings.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "record_with_derivings.hpp" #include "record_with_nested_derivings.hpp" testsuite_record_with_nested_derivings_ref testsuite_record_with_nested_derivings_new(int32_t key, testsuite_record_with_derivings_ref rec) { - return ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::make(key, ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(rec)); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithNestedDerivings>::make(key, ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(rec)); } int32_t testsuite_record_with_nested_derivings_get_key(testsuite_record_with_nested_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key; + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key; } void testsuite_record_with_nested_derivings_set_key(testsuite_record_with_nested_derivings_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key = value; + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithNestedDerivings>::toCpp(instance).key = value; } testsuite_record_with_derivings_ref testsuite_record_with_nested_derivings_get_rec(testsuite_record_with_nested_derivings_ref instance) { - return ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::fromCpp(::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec); + return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec); } void testsuite_record_with_nested_derivings_set_rec(testsuite_record_with_nested_derivings_ref instance, testsuite_record_with_derivings_ref value) { - ::djinni::c_api::Record<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec = ::djinni::c_api::Record<::testsuite::RecordWithDerivings>::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec = ::djinni::c_api::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(value); } diff --git a/test-suite/generated-src/c/return_one.cpp b/test-suite/generated-src/c/return_one.cpp index b993b9d4..4bcf9c76 100644 --- a/test-suite/generated-src/c/return_one.cpp +++ b/test-suite/generated-src/c/return_one.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from multiple_inheritance.djinni #include "return_one.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "return_one.hpp" #include @@ -22,22 +22,22 @@ struct ReturnOne_Proxy: public Proxy_Parent, public ::testsuite::ReturnOne { }; testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_return_one_ref testsuite_return_one_get_instance() { auto retValue = ::testsuite::ReturnOne::get_instance(); - return ::djinni::c_api::Interface<::testsuite::ReturnOne>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnOne>::fromCpp(std::move(retValue)); } int8_t testsuite_return_one_return_one(testsuite_return_one_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ReturnOne>::toCpp(instance)->return_one(); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnOne>::toCpp(instance)->return_one(); return std::move(retValue); } diff --git a/test-suite/generated-src/c/return_two.cpp b/test-suite/generated-src/c/return_two.cpp index 823424ba..be23753b 100644 --- a/test-suite/generated-src/c/return_two.cpp +++ b/test-suite/generated-src/c/return_two.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from multiple_inheritance.djinni #include "return_two.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "return_two.hpp" #include @@ -22,22 +22,22 @@ struct ReturnTwo_Proxy: public Proxy_Parent, public ::testsuite::ReturnTwo { }; testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_return_two_ref testsuite_return_two_get_instance() { auto retValue = ::testsuite::ReturnTwo::get_instance(); - return ::djinni::c_api::Interface<::testsuite::ReturnTwo>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnTwo>::fromCpp(std::move(retValue)); } int8_t testsuite_return_two_return_two(testsuite_return_two_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ReturnTwo>::toCpp(instance)->return_two(); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnTwo>::toCpp(instance)->return_two(); return std::move(retValue); } diff --git a/test-suite/generated-src/c/reverse_client_interface.cpp b/test-suite/generated-src/c/reverse_client_interface.cpp index 53a1b541..1e9e2d35 100644 --- a/test-suite/generated-src/c/reverse_client_interface.cpp +++ b/test-suite/generated-src/c/reverse_client_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from client_interface.djinni #include "reverse_client_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "reverse_client_interface.hpp" #include @@ -15,27 +15,27 @@ struct ReverseClientInterface_Proxy: public Proxy_Parent, public ::testsuite::Re std::string return_str() const override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { - auto i_c = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(i); + auto i_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(i); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); djinni_ref_release(i_c); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { - auto i_c = ::djinni::c_api::Optional::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(std::forward(value)); }); + auto i_c = ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); djinni_ref_release(i_c); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -43,35 +43,35 @@ struct ReverseClientInterface_Proxy: public Proxy_Parent, public ::testsuite::Re }; testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->return_str(); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->return_str(); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_reverse_client_interface_meth_taking_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(i)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(i)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_reverse_client_interface_meth_taking_optional_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) { - auto retValue = ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::Optional::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::toCpp(std::forward(value)); })); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(std::forward(value)); })); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_create() { auto retValue = ::testsuite::ReverseClientInterface::create(); - return ::djinni::c_api::Interface<::testsuite::ReverseClientInterface>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/sample_interface.cpp b/test-suite/generated-src/c/sample_interface.cpp index c5cd29a0..92d9feb8 100644 --- a/test-suite/generated-src/c/sample_interface.cpp +++ b/test-suite/generated-src/c/sample_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from test.djinni #include "sample_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "sample_interface.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct SampleInterface_Proxy: public Proxy_Parent, public ::testsuite::SampleInt }; testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/second_listener.cpp b/test-suite/generated-src/c/second_listener.cpp index 2d709a90..db28cd81 100644 --- a/test-suite/generated-src/c/second_listener.cpp +++ b/test-suite/generated-src/c/second_listener.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from multiple_inheritance.djinni #include "second_listener.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "second_listener.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -18,16 +18,16 @@ struct SecondListener_Proxy: public Proxy_Parent, public ::testsuite::SecondList }; testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_second_listener_second(testsuite_second_listener_ref instance) { - ::djinni::c_api::Interface<::testsuite::SecondListener>::toCpp(instance)->second(); + ::djinni::c_api::InterfaceTranslator<::testsuite::SecondListener>::toCpp(instance)->second(); } diff --git a/test-suite/generated-src/c/set_record.cpp b/test-suite/generated-src/c/set_record.cpp index bd8b9bd7..ece4858e 100644 --- a/test-suite/generated-src/c/set_record.cpp +++ b/test-suite/generated-src/c/set_record.cpp @@ -2,32 +2,32 @@ // This file was generated by Djinni from set.djinni #include "set_record.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "set_record.hpp" testsuite_set_record_ref testsuite_set_record_new(djinni_array_ref set, djinni_array_ref iset) { - return ::djinni::c_api::Record<::testsuite::SetRecord>::make(::djinni::c_api::Set::toCpp(set, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }), ::djinni::c_api::Set::toCpp(iset, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::make(::djinni::c_api::SetTranslator::toCpp(set, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::SetTranslator::toCpp(iset, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); } djinni_array_ref testsuite_set_record_get_set(testsuite_set_record_ref instance) { - return ::djinni::c_api::Set::fromCpp(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).set, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + return ::djinni::c_api::SetTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } void testsuite_set_record_set_set(testsuite_set_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).set = ::djinni::c_api::Set::toCpp(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set = ::djinni::c_api::SetTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); } djinni_array_ref testsuite_set_record_get_iset(testsuite_set_record_ref instance) { - return ::djinni::c_api::Set::fromCpp(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).iset, [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); + return ::djinni::c_api::SetTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } void testsuite_set_record_set_iset(testsuite_set_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(instance).iset = ::djinni::c_api::Set::toCpp(value, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset = ::djinni::c_api::SetTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/support_copying.cpp b/test-suite/generated-src/c/support_copying.cpp index 05e76137..df4e446d 100644 --- a/test-suite/generated-src/c/support_copying.cpp +++ b/test-suite/generated-src/c/support_copying.cpp @@ -2,22 +2,22 @@ // This file was generated by Djinni from nscopying.djinni #include "support_copying.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "support_copying.hpp" testsuite_support_copying_ref testsuite_support_copying_new(int32_t x) { - return ::djinni::c_api::Record<::testsuite::SupportCopying>::make(x); + return ::djinni::c_api::RecordTranslator<::testsuite::SupportCopying>::make(x); } int32_t testsuite_support_copying_get_x(testsuite_support_copying_ref instance) { - return ::djinni::c_api::Record<::testsuite::SupportCopying>::toCpp(instance).x; + return ::djinni::c_api::RecordTranslator<::testsuite::SupportCopying>::toCpp(instance).x; } void testsuite_support_copying_set_x(testsuite_support_copying_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::SupportCopying>::toCpp(instance).x = value; + ::djinni::c_api::RecordTranslator<::testsuite::SupportCopying>::toCpp(instance).x = value; } diff --git a/test-suite/generated-src/c/test_array.cpp b/test-suite/generated-src/c/test_array.cpp index 6d51db8c..1e4d2fc3 100644 --- a/test-suite/generated-src/c/test_array.cpp +++ b/test-suite/generated-src/c/test_array.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from array.djinni #include "test_array.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "test_array.hpp" #include "vec2.hpp" @@ -15,35 +15,35 @@ struct TestArray_Proxy: public Proxy_Parent, public ::testsuite::TestArray { }; testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testStringArray(::djinni::c_api::List::toCpp(a, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); - return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::TestArray::testStringArray(::djinni::c_api::ListTranslator::toCpp(a, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_array_ref testsuite_test_array_testIntArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testIntArray(::djinni::c_api::List::toCpp(a, [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); })); - return ::djinni::c_api::List::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::TestArray::testIntArray(::djinni::c_api::ListTranslator::toCpp(a, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } djinni_array_ref testsuite_test_array_testRecordArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testRecordArray(::djinni::c_api::List<::testsuite::Vec2>::toCpp(a, [](auto&& value) { return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(std::forward(value)); })); - return ::djinni::c_api::List<::testsuite::Vec2>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Record<::testsuite::Vec2>::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::TestArray::testRecordArray(::djinni::c_api::ListTranslator<::testsuite::Vec2>::toCpp(a, [](auto&& value) { return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(std::forward(value)); })); + return ::djinni::c_api::ListTranslator<::testsuite::Vec2>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::fromCpp(std::forward(value)); }); } djinni_array_ref testsuite_test_array_testArrayOfArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testArrayOfArray(::djinni::c_api::List>::toCpp(a, [](auto&& value) { return ::djinni::c_api::List::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::toCpp(std::forward(value)); }); })); - return ::djinni::c_api::List>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::List::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::Number::fromCpp(std::forward(value)); }); }); + auto retValue = ::testsuite::TestArray::testArrayOfArray(::djinni::c_api::ListTranslator>::toCpp(a, [](auto&& value) { return ::djinni::c_api::ListTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); })); + return ::djinni::c_api::ListTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ListTranslator::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); } diff --git a/test-suite/generated-src/c/test_duration.cpp b/test-suite/generated-src/c/test_duration.cpp index 015c34d4..6ed65fe2 100644 --- a/test-suite/generated-src/c/test_duration.cpp +++ b/test-suite/generated-src/c/test_duration.cpp @@ -2,8 +2,8 @@ // This file was generated by Djinni from duration.djinni #include "test_duration.h" -#include "djinni_c_helpers.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "duration_c_translator.hpp" #include "test_duration.hpp" #include @@ -16,130 +16,130 @@ struct TestDuration_Proxy: public Proxy_Parent, public ::testsuite::TestDuration }; testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::hoursString(::djinni::c_api::Duration>::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::hoursString(::djinni::c_api::DurationTranslator>::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_duration_minutesString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::minutesString(::djinni::c_api::Duration>::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::minutesString(::djinni::c_api::DurationTranslator>::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_duration_secondsString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::secondsString(::djinni::c_api::Duration>::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::secondsString(::djinni::c_api::DurationTranslator>::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_duration_millisString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::millisString(::djinni::c_api::Duration::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::millisString(::djinni::c_api::DurationTranslator::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_duration_microsString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::microsString(::djinni::c_api::Duration::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::microsString(::djinni::c_api::DurationTranslator::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_duration_nanosString(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::nanosString(::djinni::c_api::Duration::toCpp(dt)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestDuration::nanosString(::djinni::c_api::DurationTranslator::toCpp(dt)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_hours(int32_t count) { auto retValue = ::testsuite::TestDuration::hours(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_minutes(int32_t count) { auto retValue = ::testsuite::TestDuration::minutes(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_seconds(int32_t count) { auto retValue = ::testsuite::TestDuration::seconds(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_millis(int32_t count) { auto retValue = ::testsuite::TestDuration::millis(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_micros(int32_t count) { auto retValue = ::testsuite::TestDuration::micros(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_nanos(int32_t count) { auto retValue = ::testsuite::TestDuration::nanos(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_hoursf(double count) { auto retValue = ::testsuite::TestDuration::hoursf(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_minutesf(double count) { auto retValue = ::testsuite::TestDuration::minutesf(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_secondsf(double count) { auto retValue = ::testsuite::TestDuration::secondsf(count); - return ::djinni::c_api::Duration>::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_millisf(double count) { auto retValue = ::testsuite::TestDuration::millisf(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_microsf(double count) { auto retValue = ::testsuite::TestDuration::microsf(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_nanosf(double count) { auto retValue = ::testsuite::TestDuration::nanosf(count); - return ::djinni::c_api::Duration::fromCpp(std::move(retValue)); + return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); } djinni_number_ref testsuite_test_duration_box(int64_t count) { auto retValue = ::testsuite::TestDuration::box(count); - return ::djinni::c_api::Optional::fromCpp>>>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Duration>::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator::fromCpp>>>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::DurationTranslator>::fromCpp(std::forward(value)); }); } int64_t testsuite_test_duration_unbox(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::unbox(::djinni::c_api::Optional::toCpp>>>(dt, [](auto&& value) { return ::djinni::c_api::Duration>::toCpp(std::forward(value)); })); + auto retValue = ::testsuite::TestDuration::unbox(::djinni::c_api::OptionalTranslator::toCpp>>>(dt, [](auto&& value) { return ::djinni::c_api::DurationTranslator>::toCpp(std::forward(value)); })); return std::move(retValue); } diff --git a/test-suite/generated-src/c/test_helpers.cpp b/test-suite/generated-src/c/test_helpers.cpp index d32ba0a4..58559b5d 100644 --- a/test-suite/generated-src/c/test_helpers.cpp +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -2,11 +2,11 @@ // This file was generated by Djinni from test.djinni #include "test_helpers.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "Future.hpp" +#include "Future_c_translator.hpp" #include "assorted_primitives.hpp" #include "color.hpp" -#include "djinni_c_helpers.hpp" #include "map_list_record.hpp" #include "nested_collection.hpp" #include "primitive_list.hpp" @@ -23,18 +23,18 @@ struct TestHelpers_Proxy: public Proxy_Parent, public ::testsuite::TestHelpers }; testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** Method with documentation */ testsuite_set_record_ref testsuite_test_helpers_get_set_record() { auto retValue = ::testsuite::TestHelpers::get_set_record(); - return ::djinni::c_api::Record<::testsuite::SetRecord>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::fromCpp(std::move(retValue)); } /** @@ -44,164 +44,164 @@ testsuite_set_record_ref testsuite_test_helpers_get_set_record() */ bool testsuite_test_helpers_check_set_record(testsuite_set_record_ref rec) { - auto retValue = ::testsuite::TestHelpers::check_set_record(::djinni::c_api::Record<::testsuite::SetRecord>::toCpp(rec)); + auto retValue = ::testsuite::TestHelpers::check_set_record(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(rec)); return std::move(retValue); } testsuite_primitive_list_ref testsuite_test_helpers_get_primitive_list() { auto retValue = ::testsuite::TestHelpers::get_primitive_list(); - return ::djinni::c_api::Record<::testsuite::PrimitiveList>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::fromCpp(std::move(retValue)); } bool testsuite_test_helpers_check_primitive_list(testsuite_primitive_list_ref pl) { - auto retValue = ::testsuite::TestHelpers::check_primitive_list(::djinni::c_api::Record<::testsuite::PrimitiveList>::toCpp(pl)); + auto retValue = ::testsuite::TestHelpers::check_primitive_list(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(pl)); return std::move(retValue); } testsuite_nested_collection_ref testsuite_test_helpers_get_nested_collection() { auto retValue = ::testsuite::TestHelpers::get_nested_collection(); - return ::djinni::c_api::Record<::testsuite::NestedCollection>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::fromCpp(std::move(retValue)); } bool testsuite_test_helpers_check_nested_collection(testsuite_nested_collection_ref nc) { - auto retValue = ::testsuite::TestHelpers::check_nested_collection(::djinni::c_api::Record<::testsuite::NestedCollection>::toCpp(nc)); + auto retValue = ::testsuite::TestHelpers::check_nested_collection(::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(nc)); return std::move(retValue); } djinni_keyval_array_ref testsuite_test_helpers_get_map() { auto retValue = ::testsuite::TestHelpers::get_map(); - return ::djinni::c_api::Map::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); } bool testsuite_test_helpers_check_map(djinni_keyval_array_ref m) { - auto retValue = ::testsuite::TestHelpers::check_map(::djinni::c_api::Map::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); + auto retValue = ::testsuite::TestHelpers::check_map(::djinni::c_api::MapTranslator::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); return std::move(retValue); } djinni_keyval_array_ref testsuite_test_helpers_get_empty_map() { auto retValue = ::testsuite::TestHelpers::get_empty_map(); - return ::djinni::c_api::Map::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::fromCpp(key), ::djinni::c_api::Number::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); } bool testsuite_test_helpers_check_empty_map(djinni_keyval_array_ref m) { - auto retValue = ::testsuite::TestHelpers::check_empty_map(::djinni::c_api::Map::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::String::toCpp(key), ::djinni::c_api::Number::toCpp(value)); })); + auto retValue = ::testsuite::TestHelpers::check_empty_map(::djinni::c_api::MapTranslator::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); return std::move(retValue); } testsuite_map_list_record_ref testsuite_test_helpers_get_map_list_record() { auto retValue = ::testsuite::TestHelpers::get_map_list_record(); - return ::djinni::c_api::Record<::testsuite::MapListRecord>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::fromCpp(std::move(retValue)); } bool testsuite_test_helpers_check_map_list_record(testsuite_map_list_record_ref m) { - auto retValue = ::testsuite::TestHelpers::check_map_list_record(::djinni::c_api::Record<::testsuite::MapListRecord>::toCpp(m)); + auto retValue = ::testsuite::TestHelpers::check_map_list_record(::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(m)); return std::move(retValue); } void testsuite_test_helpers_check_client_interface_ascii(testsuite_client_interface_ref i) { - ::testsuite::TestHelpers::check_client_interface_ascii(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); + ::testsuite::TestHelpers::check_client_interface_ascii(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); } void testsuite_test_helpers_check_client_interface_nonascii(testsuite_client_interface_ref i) { - ::testsuite::TestHelpers::check_client_interface_nonascii(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); + ::testsuite::TestHelpers::check_client_interface_nonascii(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); } void testsuite_test_helpers_check_client_interface_args(testsuite_client_interface_ref i) { - ::testsuite::TestHelpers::check_client_interface_args(::djinni::c_api::Interface<::testsuite::ClientInterface>::toCpp(i)); + ::testsuite::TestHelpers::check_client_interface_args(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); } void testsuite_test_helpers_check_enum_map(djinni_keyval_array_ref m) { - ::testsuite::TestHelpers::check_enum_map(::djinni::c_api::Map<::testsuite::color, std::string>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::String::toCpp(value)); })); + ::testsuite::TestHelpers::check_enum_map(::djinni::c_api::MapTranslator<::testsuite::color, std::string>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::StringTranslator::toCpp(value)); })); } void testsuite_test_helpers_check_enum(testsuite_color c) { - ::testsuite::TestHelpers::check_enum(::djinni::c_api::Enum<::testsuite::color, testsuite_color>::toCpp(c)); + ::testsuite::TestHelpers::check_enum(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(c)); } testsuite_user_token_ref testsuite_test_helpers_token_id(testsuite_user_token_ref t) { - auto retValue = ::testsuite::TestHelpers::token_id(::djinni::c_api::Optional::toSharedPtrCpp>(t, [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(std::forward(value)); })); - return ::djinni::c_api::Optional::fromSharedPtrCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Interface<::testsuite::UserToken>::fromCpp(std::forward(value)); }); + auto retValue = ::testsuite::TestHelpers::token_id(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(t, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(std::forward(value)); })); + return ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::fromCpp(std::forward(value)); }); } testsuite_user_token_ref testsuite_test_helpers_create_cpp_token() { auto retValue = ::testsuite::TestHelpers::create_cpp_token(); - return ::djinni::c_api::Interface<::testsuite::UserToken>::fromCpp(std::move(retValue)); + return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::fromCpp(std::move(retValue)); } void testsuite_test_helpers_check_cpp_token(testsuite_user_token_ref t) { - ::testsuite::TestHelpers::check_cpp_token(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t)); + ::testsuite::TestHelpers::check_cpp_token(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t)); } int64_t testsuite_test_helpers_cpp_token_id(testsuite_user_token_ref t) { - auto retValue = ::testsuite::TestHelpers::cpp_token_id(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t)); + auto retValue = ::testsuite::TestHelpers::cpp_token_id(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t)); return std::move(retValue); } void testsuite_test_helpers_check_token_type(testsuite_user_token_ref t, djinni_string_ref type) { - ::testsuite::TestHelpers::check_token_type(::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(t), ::djinni::c_api::String::toCpp(type)); + ::testsuite::TestHelpers::check_token_type(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t), ::djinni::c_api::StringTranslator::toCpp(type)); } djinni_optional_int32_t testsuite_test_helpers_return_none() { auto retValue = ::testsuite::TestHelpers::return_none(); - return ::djinni::c_api::Optional::fromCppPrimitive, djinni_optional_int32_t>(std::move(retValue)); + return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int32_t>(std::move(retValue)); } /** Ensures that we generate integer translation code */ testsuite_assorted_primitives_ref testsuite_test_helpers_assorted_primitives_id(testsuite_assorted_primitives_ref i) { - auto retValue = ::testsuite::TestHelpers::assorted_primitives_id(::djinni::c_api::Record<::testsuite::AssortedPrimitives>::toCpp(i)); - return ::djinni::c_api::Record<::testsuite::AssortedPrimitives>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::assorted_primitives_id(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(i)); + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::fromCpp(std::move(retValue)); } djinni_binary_ref testsuite_test_helpers_id_binary(djinni_binary_ref b) { - auto retValue = ::testsuite::TestHelpers::id_binary(::djinni::c_api::Binary::toCpp(b)); - return ::djinni::c_api::Binary::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::id_binary(::djinni::c_api::BinaryTranslator::toCpp(b)); + return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_get_async_result() { auto retValue = ::testsuite::TestHelpers::get_async_result(); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_future_roundtrip(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::Future::toCpp(f)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_async_early_throw() { auto retValue = ::testsuite::TestHelpers::async_early_throw(); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::Future::toCpp(f)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::FutureTranslator::toCpp(f)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } /** @@ -210,62 +210,62 @@ djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) */ djinni_future_ref testsuite_test_helpers_add_one_if_present(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::Future>::toCpp(f)); - return ::djinni::c_api::Future>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::FutureTranslator>::toCpp(f)); + return ::djinni::c_api::FutureTranslator>::fromCpp(std::move(retValue)); } /** try-catches the future f, and accesses the error message, and returns as a string. */ djinni_future_ref testsuite_test_helpers_return_exception_string(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::Future::toCpp(f)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::FutureTranslator::toCpp(f)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_check_async_interface(testsuite_async_interface_ref i) { - auto retValue = ::testsuite::TestHelpers::check_async_interface(::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::check_async_interface(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_future_ref testsuite_test_helpers_check_async_composition(testsuite_async_interface_ref i) { - auto retValue = ::testsuite::TestHelpers::check_async_composition(::djinni::c_api::Interface<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::Future::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::check_async_composition(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); } djinni_array_ref testsuite_test_helpers_get_optional_list() { auto retValue = ::testsuite::TestHelpers::get_optional_list(); - return ::djinni::c_api::List>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::ListTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); } bool testsuite_test_helpers_check_optional_list(djinni_array_ref ol) { - auto retValue = ::testsuite::TestHelpers::check_optional_list(::djinni::c_api::List>::toCpp(ol, [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); + auto retValue = ::testsuite::TestHelpers::check_optional_list(::djinni::c_api::ListTranslator>::toCpp(ol, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); return std::move(retValue); } djinni_array_ref testsuite_test_helpers_get_optional_set() { auto retValue = ::testsuite::TestHelpers::get_optional_set(); - return ::djinni::c_api::Set>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::Optional::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::SetTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); } bool testsuite_test_helpers_check_optional_set(djinni_array_ref os) { - auto retValue = ::testsuite::TestHelpers::check_optional_set(::djinni::c_api::Set>::toCpp(os, [](auto&& value) { return ::djinni::c_api::Optional::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }); })); + auto retValue = ::testsuite::TestHelpers::check_optional_set(::djinni::c_api::SetTranslator>::toCpp(os, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); return std::move(retValue); } djinni_keyval_array_ref testsuite_test_helpers_get_optional_map() { auto retValue = ::testsuite::TestHelpers::get_optional_map(); - return ::djinni::c_api::Map, std::experimental::optional>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::Optional::fromCpp>(key, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); }), ::djinni::c_api::Optional::fromCpp>(value, [](auto&& value) { return ::djinni::c_api::String::fromCpp(std::forward(value)); })); }); + return ::djinni::c_api::MapTranslator, std::experimental::optional>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::OptionalTranslator::fromCpp>(key, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::fromCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); })); }); } bool testsuite_test_helpers_check_optional_map(djinni_keyval_array_ref om) { - auto retValue = ::testsuite::TestHelpers::check_optional_map(::djinni::c_api::Map, std::experimental::optional>::toCpp(om, [](auto key, auto value) { return std::make_pair(::djinni::c_api::Optional::toCpp>(key, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); }), ::djinni::c_api::Optional::toCpp>(value, [](auto&& value) { return ::djinni::c_api::String::toCpp(std::forward(value)); })); })); + auto retValue = ::testsuite::TestHelpers::check_optional_map(::djinni::c_api::MapTranslator, std::experimental::optional>::toCpp(om, [](auto key, auto value) { return std::make_pair(::djinni::c_api::OptionalTranslator::toCpp>(key, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); })); return std::move(retValue); } diff --git a/test-suite/generated-src/c/test_helpers.h b/test-suite/generated-src/c/test_helpers.h index 0b7e6aef..ddaef091 100644 --- a/test-suite/generated-src/c/test_helpers.h +++ b/test-suite/generated-src/c/test_helpers.h @@ -4,11 +4,11 @@ #pragma once #include "djinni_c.h" +#include "Future_c.h" #include "assorted_primitives.h" #include "async_interface.h" #include "client_interface.h" #include "color.h" -#include "djinni_c.h" #include "map_list_record.h" #include "nested_collection.h" #include "primitive_list.h" diff --git a/test-suite/generated-src/c/test_outcome.cpp b/test-suite/generated-src/c/test_outcome.cpp index 175f302b..7ff81411 100644 --- a/test-suite/generated-src/c/test_outcome.cpp +++ b/test-suite/generated-src/c/test_outcome.cpp @@ -2,8 +2,8 @@ // This file was generated by Djinni from outcome.djinni #include "test_outcome.h" -#include "djinni_c_helpers.hpp" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" +#include "Outcome_c_translator.hpp" #include "expected.hpp" #include "nested_outcome.hpp" #include "test_outcome.hpp" @@ -17,59 +17,59 @@ struct TestOutcome_Proxy: public Proxy_Parent, public ::testsuite::TestOutcome }; testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() { auto retValue = ::testsuite::TestOutcome::getSuccessOutcome(); - return ::djinni::c_api::Outcome::fromCpp(std::move(retValue)); + return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue)); } djinni_outcome_ref testsuite_test_outcome_getErrorOutcome() { auto retValue = ::testsuite::TestOutcome::getErrorOutcome(); - return ::djinni::c_api::Outcome::fromCpp(std::move(retValue)); + return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue)); } djinni_string_ref testsuite_test_outcome_putSuccessOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::Outcome::toCpp(x)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } int32_t testsuite_test_outcome_putErrorOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::Outcome::toCpp(x)); + auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x)); return std::move(retValue); } testsuite_nested_outcome_ref testsuite_test_outcome_getNestedSuccessOutcome() { auto retValue = ::testsuite::TestOutcome::getNestedSuccessOutcome(); - return ::djinni::c_api::Record<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); } testsuite_nested_outcome_ref testsuite_test_outcome_getNestedErrorOutcome() { auto retValue = ::testsuite::TestOutcome::getNestedErrorOutcome(); - return ::djinni::c_api::Record<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); } int32_t testsuite_test_outcome_putNestedSuccessOutcome(testsuite_nested_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putNestedSuccessOutcome(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(x)); + auto retValue = ::testsuite::TestOutcome::putNestedSuccessOutcome(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(x)); return std::move(retValue); } djinni_string_ref testsuite_test_outcome_putNestedErrorOutcome(testsuite_nested_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putNestedErrorOutcome(::djinni::c_api::Record<::testsuite::NestedOutcome>::toCpp(x)); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestOutcome::putNestedErrorOutcome(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(x)); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/test_outcome.h b/test-suite/generated-src/c/test_outcome.h index 641276d2..5d3c329b 100644 --- a/test-suite/generated-src/c/test_outcome.h +++ b/test-suite/generated-src/c/test_outcome.h @@ -4,7 +4,7 @@ #pragma once #include "djinni_c.h" -#include "djinni_c.h" +#include "Outcome_c.h" #include "nested_outcome.h" #ifdef __cplusplus diff --git a/test-suite/generated-src/c/test_static_method_language.cpp b/test-suite/generated-src/c/test_static_method_language.cpp index edbd8f85..437ddea8 100644 --- a/test-suite/generated-src/c/test_static_method_language.cpp +++ b/test-suite/generated-src/c/test_static_method_language.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from static_method_language.djinni #include "test_static_method_language.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "test_static_method_language.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,11 +14,11 @@ struct TestStaticMethodLanguage_Proxy: public Proxy_Parent, public ::testsuite:: }; testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** diff --git a/test-suite/generated-src/c/throwing_interface.cpp b/test-suite/generated-src/c/throwing_interface.cpp index 99091500..c7c1f525 100644 --- a/test-suite/generated-src/c/throwing_interface.cpp +++ b/test-suite/generated-src/c/throwing_interface.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from exception.djinni #include "throwing_interface.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "throwing_interface.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -18,16 +18,16 @@ struct ThrowingInterface_Proxy: public Proxy_Parent, public ::testsuite::Throwin }; testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance) { - ::djinni::c_api::Interface<::testsuite::ThrowingInterface>::toCpp(instance)->throw_exception(); + ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(instance)->throw_exception(); } diff --git a/test-suite/generated-src/c/user_token.cpp b/test-suite/generated-src/c/user_token.cpp index d243226e..0a05f56d 100644 --- a/test-suite/generated-src/c/user_token.cpp +++ b/test-suite/generated-src/c/user_token.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from user_token.djinni #include "user_token.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "user_token.hpp" using Proxy_Parent = ::djinni::Proxy; @@ -14,7 +14,7 @@ struct UserToken_Proxy: public Proxy_Parent, public ::testsuite::UserToken { std::string whoami() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().whoami(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::String::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -22,17 +22,17 @@ struct UserToken_Proxy: public Proxy_Parent, public ::testsuite::UserToken { }; testsuite_user_token_proxy_class_ref testsuite_user_token_proxy_class_new(const testsuite_user_token_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_user_token_ref testsuite_user_token_new(testsuite_user_token_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_user_token_whoami(testsuite_user_token_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::UserToken>::toCpp(instance)->whoami(); - return ::djinni::c_api::String::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(instance)->whoami(); + return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/uses_single_language_listeners.cpp b/test-suite/generated-src/c/uses_single_language_listeners.cpp index 2e8c41c2..a18c9aa2 100644 --- a/test-suite/generated-src/c/uses_single_language_listeners.cpp +++ b/test-suite/generated-src/c/uses_single_language_listeners.cpp @@ -2,7 +2,7 @@ // This file was generated by Djinni from single_language_interfaces.djinni #include "uses_single_language_listeners.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "uses_single_language_listeners.hpp" #include @@ -13,7 +13,7 @@ struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuit ~UsesSingleLanguageListeners_Proxy() override = default; void callForObjC(const /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override { - auto l_c = ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::fromCpp(l); + auto l_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::fromCpp(l); Proxy_Parent::getProxyClass().methodDefs().callForObjC(Proxy_Parent::getOpaque(), l_c); djinni_ref_release(l_c); } @@ -21,13 +21,13 @@ struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuit /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForObjC(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } void callForJava(const /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> & l) override { - auto l_c = ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::fromCpp(l); + auto l_c = ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::fromCpp(l); Proxy_Parent::getProxyClass().methodDefs().callForJava(Proxy_Parent::getOpaque(), l_c); djinni_ref_release(l_c); } @@ -35,7 +35,7 @@ struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuit /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override { auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForJava(Proxy_Parent::getOpaque()); - auto returnValue_cpp = ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::toCpp(returnValue); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -43,33 +43,33 @@ struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuit }; testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyClass::make(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::Proxy::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l) { - ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForObjC(::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::toCpp(l)); + ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForObjC(::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::toCpp(l)); } testsuite_objc_only_listener_ref testsuite_uses_single_language_listeners_returnForObjC(testsuite_uses_single_language_listeners_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForObjC(); - return ::djinni::c_api::Interface<::testsuite::ObjcOnlyListener>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForObjC(); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::fromCpp(std::move(retValue)); } void testsuite_uses_single_language_listeners_callForJava(testsuite_uses_single_language_listeners_ref instance, testsuite_java_only_listener_ref l) { - ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForJava(::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::toCpp(l)); + ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForJava(::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::toCpp(l)); } testsuite_java_only_listener_ref testsuite_uses_single_language_listeners_returnForJava(testsuite_uses_single_language_listeners_ref instance) { - auto retValue = ::djinni::c_api::Interface<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForJava(); - return ::djinni::c_api::Interface<::testsuite::JavaOnlyListener>::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForJava(); + return ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::fromCpp(std::move(retValue)); } diff --git a/test-suite/generated-src/c/vec2.cpp b/test-suite/generated-src/c/vec2.cpp index 966c8632..ba42b7b9 100644 --- a/test-suite/generated-src/c/vec2.cpp +++ b/test-suite/generated-src/c/vec2.cpp @@ -2,32 +2,32 @@ // This file was generated by Djinni from array.djinni #include "vec2.h" -#include "djinni_c_helpers.hpp" +#include "djinni_c_translators.hpp" #include "vec2.hpp" testsuite_vec2_ref testsuite_vec2_new(int32_t x, int32_t y) { - return ::djinni::c_api::Record<::testsuite::Vec2>::make(x, y); + return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::make(x, y); } int32_t testsuite_vec2_get_x(testsuite_vec2_ref instance) { - return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).x; + return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(instance).x; } void testsuite_vec2_set_x(testsuite_vec2_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).x = value; + ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(instance).x = value; } int32_t testsuite_vec2_get_y(testsuite_vec2_ref instance) { - return ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).y; + return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(instance).y; } void testsuite_vec2_set_y(testsuite_vec2_ref instance, int32_t value) { - ::djinni::c_api::Record<::testsuite::Vec2>::toCpp(instance).y = value; + ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(instance).y = value; } diff --git a/test-suite/handwritten-src/cpp/Duration_c_translator.hpp b/test-suite/handwritten-src/cpp/Duration_c_translator.hpp new file mode 100644 index 00000000..f464b78c --- /dev/null +++ b/test-suite/handwritten-src/cpp/Duration_c_translator.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace djinni::c_api { + +template class DurationTranslator { +public: + static std::chrono::duration toCpp(djinni_number_ref value); + static djinni_number_ref + fromCpp(const std::chrono::duration &value); +}; + +} // namespace djinni::c_api From 4d50110d870f7cee29b93995951e152bdf50825e Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 20 Aug 2025 14:32:35 -0500 Subject: [PATCH 25/42] added support for outcome --- src/source/CTypeResolver.scala | 46 ++++++++++---- src/source/YamlGenerator.scala | 3 +- src/source/meta.scala | 3 +- support-lib/cpp/Future_c_translator.hpp | 6 +- support-lib/cpp/Outcome_c.cpp | 60 +++++++++++++++++++ support-lib/cpp/Outcome_c.h | 20 ++++++- support-lib/cpp/Outcome_c_translator.hpp | 48 +++++++++++++-- support-lib/cpp/djinni_c.cpp | 6 -- support-lib/cpp/djinni_c.h | 10 +++- support-lib/cpp/djinni_c_translators.hpp | 22 ++++--- support-lib/cpp/djinni_c_types.hpp | 8 +++ support-lib/cpp/future_c.h | 8 +++ test-suite/djinni/test.djinni | 2 +- .../djinni/vendor/third-party/duration.yaml | 1 + .../generated-src/c/async_interface.cpp | 8 +-- test-suite/generated-src/c/nested_outcome.cpp | 6 +- test-suite/generated-src/c/proto_tests.cpp | 2 +- test-suite/generated-src/c/test_helpers.cpp | 24 ++++---- test-suite/generated-src/c/test_outcome.cpp | 8 +-- .../c/tests/DjinniCAPI_tests.cpp | 28 ++++++++- 20 files changed, 248 insertions(+), 71 deletions(-) create mode 100644 support-lib/cpp/Outcome_c.cpp diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index c0215761..468ee082 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -71,17 +71,22 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } - private def makeNestedTranslator(inner: CTypeTranslator, typename: String, toCppTranslator: String, fromCppTranslator: String): CTypeTranslator = { + private def makeNestedTranslatorFunctionPairs(inner: CTypeTranslator): (String, String) = { val innerValueParamName = s"std::forward(value)" + val innerToCpp = inner.toCppTranslatorFn(innerValueParamName) + val innerFromCpp = inner.fromCppTranslatorFn(innerValueParamName) + (s"[](auto&& value) { return ${innerToCpp}; }", s"[](auto&& value) { return ${innerFromCpp}; }") + } + + private def makeNestedTranslator(inner: CTypeTranslator, typename: String, toCppTranslator: String, fromCppTranslator: String): CTypeTranslator = { + val (toCppFn, fromCppFn) = makeNestedTranslatorFunctionPairs(inner) new CTypeTranslator(typename, true, (p) => { - val innerToCpp = inner.toCppTranslatorFn(innerValueParamName) - s"${toCppTranslator}(${p}, [](auto&& value) { return ${innerToCpp}; })" + s"${toCppTranslator}(${p}, ${toCppFn})" }, (p) => { - val innerFromCpp = inner.fromCppTranslatorFn(innerValueParamName) - s"$fromCppTranslator(${p}, [](auto&& value) { return ${innerFromCpp}; })" + s"$fromCppTranslator(${p}, ${fromCppFn})" } ) } @@ -193,13 +198,28 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal addPublicImport(cppMarshal.resolveExtCppHdr(c.publicHeader)) privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) - val resolvedTranslator: String = if (expr.args.isEmpty) { - c.translator - } else { - // Resolve to get the includes - expr.args.foreach(a => resolve(a)) + if (expr.args.nonEmpty) { + val argsTranslators = expr.args.map(a => resolve(a, asBoxed = true)) val templateArgs = expr.args.map(a => cppMarshal.fqTypename(a)).mkString(", ") - s"${c.translator}<${templateArgs}>" + val translator = s"${c.translator}<${templateArgs}>" + + if (c.ignoreTypeParams) { + return new CTypeTranslator(c.typename, + true, + (p) => s"${translator}::toCpp(${p})", + (p) => s"${translator}::fromCpp(${p})" + ) + } else { + val translatorFnPairs = argsTranslators.map(t => makeNestedTranslatorFunctionPairs(t)) + val toCppFns = translatorFnPairs.map(p => p._1).mkString(", ") + val fromCppFns = translatorFnPairs.map(p => p._2).mkString(", ") + + return new CTypeTranslator(c.typename, + true, + (p) => s"${translator}::toCpp(${p}, ${toCppFns})", + (p) => s"${translator}::fromCpp(${p}, ${fromCppFns})" + ) + } } val isEnum = defType match { @@ -208,9 +228,9 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } if (isEnum) { - doResolveEnum(c.typename, resolvedTranslator, asBoxed) + doResolveEnum(c.typename, c.translator, asBoxed) } else { - makeTranslator(c.typename, isRefType = true, resolvedTranslator) + makeTranslator(c.typename, isRefType = true, c.translator) } } diff --git a/src/source/YamlGenerator.scala b/src/source/YamlGenerator.scala index c2515e6b..d907cf2f 100644 --- a/src/source/YamlGenerator.scala +++ b/src/source/YamlGenerator.scala @@ -341,7 +341,8 @@ object YamlGenerator { getOptionalField(td, "c", "typename"), getOptionalField(td, "c", "public_header"), getOptionalField(td, "c", "private_header"), - getOptionalField(td, "c", "translator") + getOptionalField(td, "c", "translator"), + getOptionalField(td, "c", "ignore_type_params", false) ) ) diff --git a/src/source/meta.scala b/src/source/meta.scala index e1e657f6..e4288f41 100644 --- a/src/source/meta.scala +++ b/src/source/meta.scala @@ -102,7 +102,8 @@ object MExtern { typename: String, publicHeader: String, privateHeader: String, - translator: String + translator: String, + ignoreTypeParams: Boolean ) } case class MProtobuf(name: String, override val numParams: Int, body: ProtobufMessage) extends Meta diff --git a/support-lib/cpp/Future_c_translator.hpp b/support-lib/cpp/Future_c_translator.hpp index 502e94b2..2fd20e5c 100644 --- a/support-lib/cpp/Future_c_translator.hpp +++ b/support-lib/cpp/Future_c_translator.hpp @@ -21,7 +21,8 @@ namespace djinni::c_api { template class FutureTranslator { public: - static ::djinni::Future toCpp(djinni_future_ref future) { + template + static ::djinni::Future toCpp(djinni_future_ref future, F &&toCpp) { auto *futureHolder = static_cast<::djinni::FutureHolder *>( reinterpret_cast(future)); @@ -31,7 +32,8 @@ template class FutureTranslator { [](::djinni::Future value) { return value.get(); }); } - static djinni_future_ref fromCpp(::djinni::Future &&future) { + template + static djinni_future_ref fromCpp(::djinni::Future &&future, F &&fromCpp) { Object *futureHolder = new ::djinni::FutureHolder(std::move(future)); return reinterpret_cast(futureHolder); diff --git a/support-lib/cpp/Outcome_c.cpp b/support-lib/cpp/Outcome_c.cpp new file mode 100644 index 00000000..ab1f095e --- /dev/null +++ b/support-lib/cpp/Outcome_c.cpp @@ -0,0 +1,60 @@ +#include "Outcome_c.h" +#include "djinni_c_types.hpp" + +namespace djinni { + +class Outcome : public Object { +public: + Outcome(djinni_ref value, bool success) : _value(value), _success(success) { + djinni_ref_retain(value); + } + ~Outcome() override { djinni_ref_release(_value); } + + bool success() const { return _success; } + + const djinni_ref &value() const { return _value; } + +private: + djinni_ref _value; + bool _success; +}; + +} // namespace djinni + +using namespace djinni; + +djinni_outcome_ref djinni_outcome_make_success(djinni_ref success_val) { + return toC(new Outcome(success_val, true)); +} + +djinni_outcome_ref djinni_outcome_make_error(djinni_ref error_val) { + return toC(new Outcome(error_val, false)); +} + +bool djinni_outcome_is_success(djinni_outcome_ref outcome) { + return fromC(outcome)->success(); +} + +bool djinni_outcome_is_error(djinni_outcome_ref outcome) { + return !djinni_outcome_is_success(outcome); +} + +djinni_ref djinni_outcome_get_value(djinni_outcome_ref outcome) { + auto *cpp = fromC(outcome); + if (!cpp->success()) { + return nullptr; + } + + djinni_ref_retain(cpp->value()); + return cpp->value(); +} + +djinni_ref djinni_outcome_get_error(djinni_outcome_ref outcome) { + auto *cpp = fromC(outcome); + if (cpp->success()) { + return nullptr; + } + + djinni_ref_retain(cpp->value()); + return cpp->value(); +} \ No newline at end of file diff --git a/support-lib/cpp/Outcome_c.h b/support-lib/cpp/Outcome_c.h index fb20932b..2972bf4d 100644 --- a/support-lib/cpp/Outcome_c.h +++ b/support-lib/cpp/Outcome_c.h @@ -1,4 +1,22 @@ #pragma once -typedef void *djinni_outcome_ref; +#include "djinni_c.h" +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_ref djinni_outcome_ref; + +djinni_outcome_ref djinni_outcome_make_success(djinni_ref success_val); +djinni_outcome_ref djinni_outcome_make_error(djinni_ref error_val); + +bool djinni_outcome_is_success(djinni_outcome_ref outcome); +bool djinni_outcome_is_error(djinni_outcome_ref outcome); + +djinni_ref djinni_outcome_get_value(djinni_outcome_ref outcome); +djinni_ref djinni_outcome_get_error(djinni_outcome_ref outcome); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus \ No newline at end of file diff --git a/support-lib/cpp/Outcome_c_translator.hpp b/support-lib/cpp/Outcome_c_translator.hpp index 507f95b2..7d91cac2 100644 --- a/support-lib/cpp/Outcome_c_translator.hpp +++ b/support-lib/cpp/Outcome_c_translator.hpp @@ -7,16 +7,52 @@ namespace djinni::c_api { template class OutcomeTranslator { public: - static ::djinni::expected toCpp(djinni_outcome_ref future) { - std::abort(); + template + static ::djinni::expected toCpp(djinni_outcome_ref outcome, F1 &&toCpp1, + F2 &&toCpp2) { + if (djinni_outcome_is_success(outcome)) { + auto success = djinni_outcome_get_value(outcome); + auto out = ::djinni::expected(toCpp1(success)); + djinni_ref_release(success); + return out; + } else { + auto error = djinni_outcome_get_error(outcome); + auto out = ::djinni::make_unexpected(toCpp2(error)); + djinni_ref_release(error); + return out; + } } - static djinni_outcome_ref fromCpp(::djinni::expected &&outcome) { - std::abort(); + template + static djinni_outcome_ref fromCpp(::djinni::expected &&outcome, + F1 &&fromCpp1, F2 &&fromCpp2) { + if (outcome) { + auto success = fromCpp1(std::move(outcome.value())); + djinni_outcome_ref result = djinni_outcome_make_success(success); + djinni_ref_release(success); + return result; + } else { + auto error = fromCpp2(std::move(outcome.error())); + djinni_outcome_ref result = djinni_outcome_make_error(error); + djinni_ref_release(error); + return result; + } } - static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome) { - std::abort(); + template + static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome, + F1 &&fromCpp1, F2 &&fromCpp2) { + if (outcome) { + auto success = fromCpp1(outcome.value()); + djinni_outcome_ref result = djinni_outcome_make_success(success); + djinni_ref_release(success); + return result; + } else { + auto error = fromCpp2(outcome.error()); + djinni_outcome_ref result = djinni_outcome_make_error(error); + djinni_ref_release(error); + return result; + } } }; diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index 28d5e3ae..b3cfd573 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -3,12 +3,6 @@ using namespace djinni; -static djinni_ref toC(Object *obj) { return reinterpret_cast(obj); } - -template static T *fromC(djinni_ref ref) { - return static_cast(reinterpret_cast(ref)); -} - void djinni_ref_retain(djinni_ref ref) { Object::retain(fromC(ref)); } void djinni_ref_release(djinni_ref ref) { Object::release(fromC(ref)); } diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index bdc09748..c7931c4b 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -3,6 +3,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + typedef void *djinni_ref; typedef djinni_ref djinni_string_ref; @@ -95,4 +99,8 @@ DJINNI_OPTIONAL_PRIMITIVE(int16_t); DJINNI_OPTIONAL_PRIMITIVE(int32_t); DJINNI_OPTIONAL_PRIMITIVE(int64_t); DJINNI_OPTIONAL_PRIMITIVE(float); -DJINNI_OPTIONAL_PRIMITIVE(double); \ No newline at end of file +DJINNI_OPTIONAL_PRIMITIVE(double); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index b824843a..f0899779 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -310,13 +310,12 @@ template class MapTranslator { template class RecordTranslator { public: template static djinni_record_ref make(Args &&...args) { - Object *obj = new RecordHolder(T(std::forward(args)...)); - return reinterpret_cast(obj); + auto *obj = new RecordHolder(T(std::forward(args)...)); + return toC(obj); } static T &toCpp(djinni_record_ref ref) { - auto *record = - static_cast *>(reinterpret_cast(ref)); + auto *record = fromC>(ref); if (record == nullptr) { std::abort(); } @@ -329,15 +328,14 @@ template class RecordTranslator { static djinni_record_ref fromCpp(const T &value) { return make(value); } static void release(djinni_record_ref ptr) { - Object::release(reinterpret_cast(ptr)); + Object::release(fromC(ptr)); } }; template class InterfaceTranslator { public: static const std::shared_ptr &toCpp(djinni_interface_ref ref) { - auto *i = - static_cast *>(reinterpret_cast(ref)); + auto *i = fromC>(ref); if (i == nullptr) { std::abort(); } @@ -347,7 +345,7 @@ template class InterfaceTranslator { static djinni_interface_ref fromCpp(std::shared_ptr value) { Object *obj = new InterfaceHolder(std::move(value)); - return reinterpret_cast(obj); + return toC(obj); } }; @@ -355,14 +353,14 @@ template class ProxyTranslator { public: static djinni_proxy_class_ref makeClass(const PT *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { - Object *obj = new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); - return reinterpret_cast(obj); + auto *proxyClass = + new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); + return toC(proxyClass); } static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, void *opaque) { - auto *proxyClass = static_cast<::djinni::ProxyClass *>( - reinterpret_cast(proxyClassRef)); + auto *proxyClass = fromC<::djinni::ProxyClass>(proxyClassRef); return ::djinni::c_api::InterfaceTranslator::fromCpp( std::make_shared(proxyClass, opaque)); diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 0cbaede1..2cdc2334 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -168,4 +168,12 @@ template class Proxy { void *_opaque; }; +inline void *toC(Object *obj) { + return reinterpret_cast(obj); +} + +template static T *fromC(void *ref) { + return static_cast(reinterpret_cast(ref)); +} + } // namespace djinni \ No newline at end of file diff --git a/support-lib/cpp/future_c.h b/support-lib/cpp/future_c.h index 978baa39..66639932 100644 --- a/support-lib/cpp/future_c.h +++ b/support-lib/cpp/future_c.h @@ -1,3 +1,11 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + typedef void *djinni_future_ref; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus \ No newline at end of file diff --git a/test-suite/djinni/test.djinni b/test-suite/djinni/test.djinni index 0c914681..fe45d5fc 100644 --- a/test-suite/djinni/test.djinni +++ b/test-suite/djinni/test.djinni @@ -73,7 +73,7 @@ test_helpers = interface +c { # (Second line of multi-line documentation. # Indented third line of multi-line documentation.) empty_record = record { - + } # Test for conflict of method name with an interface name. diff --git a/test-suite/djinni/vendor/third-party/duration.yaml b/test-suite/djinni/vendor/third-party/duration.yaml index 935c1f30..82de4ab7 100644 --- a/test-suite/djinni/vendor/third-party/duration.yaml +++ b/test-suite/djinni/vendor/third-party/duration.yaml @@ -50,6 +50,7 @@ c: translator: '::djinni::c_api::DurationTranslator' public_header: '"djinni_c.h"' private_header: '"$duration_c_translator.hpp"' + ignore_type_params: true --- name: h typedef: 'record' diff --git a/test-suite/generated-src/c/async_interface.cpp b/test-suite/generated-src/c/async_interface.cpp index 1baea922..66cf8133 100644 --- a/test-suite/generated-src/c/async_interface.cpp +++ b/test-suite/generated-src/c/async_interface.cpp @@ -14,11 +14,11 @@ struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInter ~AsyncInterface_Proxy() override = default; ::djinni::Future future_roundtrip(::djinni::Future f) override { - auto f_c = ::djinni::c_api::FutureTranslator::fromCpp(std::move(f)); + auto f_c = ::djinni::c_api::FutureTranslator::fromCpp(std::move(f), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); auto returnValue = Proxy_Parent::getProxyClass().methodDefs().future_roundtrip(Proxy_Parent::getOpaque(), f_c); djinni_ref_release(f_c); - auto returnValue_cpp = ::djinni::c_api::FutureTranslator::toCpp(returnValue); + auto returnValue_cpp = ::djinni::c_api::FutureTranslator::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); djinni_ref_release(returnValue); return returnValue_cpp; } @@ -35,8 +35,8 @@ testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_inte djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/nested_outcome.cpp b/test-suite/generated-src/c/nested_outcome.cpp index 440d75b0..865c9e18 100644 --- a/test-suite/generated-src/c/nested_outcome.cpp +++ b/test-suite/generated-src/c/nested_outcome.cpp @@ -9,17 +9,17 @@ testsuite_nested_outcome_ref testsuite_nested_outcome_new(djinni_outcome_ref o) { - return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::make(::djinni::c_api::OutcomeTranslator::toCpp(o)); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::make(::djinni::c_api::OutcomeTranslator::toCpp(o, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); } djinni_outcome_ref testsuite_nested_outcome_get_o(testsuite_nested_outcome_ref instance) { - return ::djinni::c_api::OutcomeTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o); + return ::djinni::c_api::OutcomeTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } void testsuite_nested_outcome_set_o(testsuite_nested_outcome_ref instance, djinni_outcome_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::OutcomeTranslator::toCpp(value); + ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::OutcomeTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/proto_tests.cpp b/test-suite/generated-src/c/proto_tests.cpp index 0b761a69..0afba3c4 100644 --- a/test-suite/generated-src/c/proto_tests.cpp +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -102,7 +102,7 @@ djinni_binary_ref testsuite_proto_tests_stringToOptionalProto(djinni_string_ref djinni_outcome_ref testsuite_proto_tests_stringToProtoOutcome(djinni_string_ref x) { auto retValue = ::testsuite::ProtoTests::stringToProtoOutcome(::djinni::c_api::StringTranslator::toCpp(x)); - return ::djinni::c_api::OutcomeTranslator<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue)); + return ::djinni::c_api::OutcomeTranslator<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } diff --git a/test-suite/generated-src/c/test_helpers.cpp b/test-suite/generated-src/c/test_helpers.cpp index 58559b5d..74b29f0b 100644 --- a/test-suite/generated-src/c/test_helpers.cpp +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -183,25 +183,25 @@ djinni_binary_ref testsuite_test_helpers_id_binary(djinni_binary_ref b) djinni_future_ref testsuite_test_helpers_get_async_result() { auto retValue = ::testsuite::TestHelpers::get_async_result(); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } djinni_future_ref testsuite_test_helpers_future_roundtrip(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_future_ref testsuite_test_helpers_async_early_throw() { auto retValue = ::testsuite::TestHelpers::async_early_throw(); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::FutureTranslator::toCpp(f)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return std::forward(value); })); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return std::forward(value); }); } /** @@ -210,27 +210,27 @@ djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) */ djinni_future_ref testsuite_test_helpers_add_one_if_present(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::FutureTranslator>::toCpp(f)); - return ::djinni::c_api::FutureTranslator>::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::FutureTranslator>::toCpp(f, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); })); + return ::djinni::c_api::FutureTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); } /** try-catches the future f, and accesses the error message, and returns as a string. */ djinni_future_ref testsuite_test_helpers_return_exception_string(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::FutureTranslator::toCpp(f)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_future_ref testsuite_test_helpers_check_async_interface(testsuite_async_interface_ref i) { auto retValue = ::testsuite::TestHelpers::check_async_interface(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_future_ref testsuite_test_helpers_check_async_composition(testsuite_async_interface_ref i) { auto retValue = ::testsuite::TestHelpers::check_async_composition(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); } djinni_array_ref testsuite_test_helpers_get_optional_list() diff --git a/test-suite/generated-src/c/test_outcome.cpp b/test-suite/generated-src/c/test_outcome.cpp index 7ff81411..7734d76e 100644 --- a/test-suite/generated-src/c/test_outcome.cpp +++ b/test-suite/generated-src/c/test_outcome.cpp @@ -27,24 +27,24 @@ testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_pro djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() { auto retValue = ::testsuite::TestOutcome::getSuccessOutcome(); - return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } djinni_outcome_ref testsuite_test_outcome_getErrorOutcome() { auto retValue = ::testsuite::TestOutcome::getErrorOutcome(); - return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue)); + return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); } djinni_string_ref testsuite_test_outcome_putSuccessOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x)); + auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); } int32_t testsuite_test_outcome_putErrorOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x)); + auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); return std::move(retValue); } diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index c480b51b..a33a84df 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -8,6 +8,7 @@ #include "proto/cpp/test.pb.h" #include "proto_tests.h" #include "test_helpers.h" +#include "test_outcome.h" #include "gtest/gtest.h" #include @@ -413,9 +414,9 @@ TEST(DjinniCAPI, supportsBinaryRef) { dataHolder->data[2] = 100; { - auto input = - CRef(djinni_binary_new_with_bytes(dataHolder->data.data(), dataHolder->data.size(), - dataHolder.get(), &data_holder_free_callback)); + auto input = CRef(djinni_binary_new_with_bytes( + dataHolder->data.data(), dataHolder->data.size(), dataHolder.get(), + &data_holder_free_callback)); auto received = CRef(testsuite_DataRefTest_sendDataView(ref.value, input.value)); @@ -523,4 +524,25 @@ TEST(DjinniCAPI, supportsProto) { std::string(djinni_string_get_data(retrievedName2.value))); } +TEST(DjinniCAPI, supportsOutcome) { + auto result = CRef(testsuite_test_outcome_getSuccessOutcome()); + + ASSERT_TRUE(djinni_outcome_is_success(result.value)); + ASSERT_FALSE(djinni_outcome_is_error(result.value)); + + auto value = CRef(djinni_outcome_get_value(result.value)); + + ASSERT_EQ(std::string("hello"), + std::string(djinni_string_get_data(value.value))); + + auto failure = CRef(testsuite_test_outcome_getErrorOutcome()); + + ASSERT_FALSE(djinni_outcome_is_success(failure.value)); + ASSERT_TRUE(djinni_outcome_is_error(failure.value)); + + auto error = CRef(djinni_outcome_get_error(failure.value)); + + ASSERT_EQ(42, djinni_number_get_int64(error.value)); +} + } // namespace djinni \ No newline at end of file From 82577d154a41c11f2bfe42099b0cd89b15684453 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 20 Aug 2025 15:55:36 -0500 Subject: [PATCH 26/42] added cast check on debug builds --- src/source/CGenerator.scala | 4 +-- support-lib/cpp/djinni_c_translators.hpp | 5 ++-- support-lib/cpp/djinni_c_types.cpp | 7 ++++++ support-lib/cpp/djinni_c_types.hpp | 31 ++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 268b5f13..466bf5f3 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -338,13 +338,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${proxyClassNameCpp}, ${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") + w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") } w.wl w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${proxyClassNameCpp}, ${methodDefsStructName}>::make(proxy_class, opaque);") + w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::make<${proxyClassNameCpp}, ${selfCpp}>(proxy_class, opaque);") } w.wl diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index f0899779..c93dc26a 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -349,7 +349,7 @@ template class InterfaceTranslator { } }; -template class ProxyTranslator { +template class ProxyTranslator { public: static djinni_proxy_class_ref makeClass(const PT *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { @@ -358,12 +358,13 @@ template class ProxyTranslator { return toC(proxyClass); } + template static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, void *opaque) { auto *proxyClass = fromC<::djinni::ProxyClass>(proxyClassRef); return ::djinni::c_api::InterfaceTranslator::fromCpp( - std::make_shared(proxyClass, opaque)); + std::make_shared

(proxyClass, opaque)); } }; diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp index 25a41571..a09bb31b 100644 --- a/support-lib/cpp/djinni_c_types.cpp +++ b/support-lib/cpp/djinni_c_types.cpp @@ -1,4 +1,5 @@ #include "djinni_c_types.hpp" +#include namespace djinni { @@ -187,4 +188,10 @@ Number *Number::make(Number::Value value, Number::ValueType type) { return new Number(value, type); } +void crashForInvalidCast(const char *str) { + std::fprintf(stderr, "Attempting to cast an invalid pointer to type: %s!", + str); + std::abort(); +} + } // namespace djinni \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_types.hpp b/support-lib/cpp/djinni_c_types.hpp index 2cdc2334..6a31c416 100644 --- a/support-lib/cpp/djinni_c_types.hpp +++ b/support-lib/cpp/djinni_c_types.hpp @@ -3,6 +3,14 @@ #include #include +#ifndef DJINNI_CHECKED_C_API +#if DEBUG +#define DJINNI_CHECKED_C_API 1 +#else +#define DJINNI_CHECKED_C_API 0 +#endif +#endif + namespace djinni { class Object { @@ -168,12 +176,31 @@ template class Proxy { void *_opaque; }; -inline void *toC(Object *obj) { - return reinterpret_cast(obj); +inline void *toC(Object *obj) { return reinterpret_cast(obj); } + +void crashForInvalidCast(const char *str); + +template +static void onInvalidCast() { + crashForInvalidCast(typeid(T).name()); } +#if DJINNI_CHECKED_C_API +template static T *fromC(void *ref) { + if (ref == nullptr) { + return nullptr; + } + auto *ptr = dynamic_cast(reinterpret_cast(ref)); + if (ptr == nullptr) { + onInvalidCast(); + } + + return ptr; +} +#else template static T *fromC(void *ref) { return static_cast(reinterpret_cast(ref)); } +#endif } // namespace djinni \ No newline at end of file From 0e58294b50bcf7606ad1c6c5bcd542af583d1be0 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Wed, 20 Aug 2025 15:55:50 -0500 Subject: [PATCH 27/42] regen --- test-suite/generated-src/c/Conflict.cpp | 4 ++-- test-suite/generated-src/c/DataRefTest.cpp | 4 ++-- test-suite/generated-src/c/_varname_interface_.cpp | 4 ++-- test-suite/generated-src/c/async_interface.cpp | 4 ++-- test-suite/generated-src/c/client_interface.cpp | 4 ++-- test-suite/generated-src/c/conflict_user.cpp | 4 ++-- test-suite/generated-src/c/constant_interface_with_enum.cpp | 4 ++-- test-suite/generated-src/c/constants_interface.cpp | 4 ++-- test-suite/generated-src/c/cpp_exception.cpp | 4 ++-- test-suite/generated-src/c/enum_usage_interface.cpp | 4 ++-- test-suite/generated-src/c/first_listener.cpp | 4 ++-- test-suite/generated-src/c/flag_roundtrip.cpp | 4 ++-- .../generated-src/c/interface_using_extended_record.cpp | 4 ++-- test-suite/generated-src/c/java_only_listener.cpp | 4 ++-- test-suite/generated-src/c/listener_caller.cpp | 4 ++-- test-suite/generated-src/c/objc_only_listener.cpp | 4 ++-- test-suite/generated-src/c/proto_tests.cpp | 4 ++-- test-suite/generated-src/c/return_one.cpp | 4 ++-- test-suite/generated-src/c/return_two.cpp | 4 ++-- test-suite/generated-src/c/reverse_client_interface.cpp | 4 ++-- test-suite/generated-src/c/sample_interface.cpp | 4 ++-- test-suite/generated-src/c/second_listener.cpp | 4 ++-- test-suite/generated-src/c/test_array.cpp | 4 ++-- test-suite/generated-src/c/test_duration.cpp | 4 ++-- test-suite/generated-src/c/test_helpers.cpp | 4 ++-- test-suite/generated-src/c/test_outcome.cpp | 4 ++-- test-suite/generated-src/c/test_static_method_language.cpp | 4 ++-- test-suite/generated-src/c/throwing_interface.cpp | 4 ++-- test-suite/generated-src/c/user_token.cpp | 4 ++-- test-suite/generated-src/c/uses_single_language_listeners.cpp | 4 ++-- 30 files changed, 60 insertions(+), 60 deletions(-) diff --git a/test-suite/generated-src/c/Conflict.cpp b/test-suite/generated-src/c/Conflict.cpp index 5adb066d..eae91fe7 100644 --- a/test-suite/generated-src/c/Conflict.cpp +++ b/test-suite/generated-src/c/Conflict.cpp @@ -14,11 +14,11 @@ struct Conflict_Proxy: public Proxy_Parent, public ::testsuite::Conflict { }; testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/DataRefTest.cpp b/test-suite/generated-src/c/DataRefTest.cpp index 08d5059f..4be80487 100644 --- a/test-suite/generated-src/c/DataRefTest.cpp +++ b/test-suite/generated-src/c/DataRefTest.cpp @@ -81,11 +81,11 @@ struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest }; testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) diff --git a/test-suite/generated-src/c/_varname_interface_.cpp b/test-suite/generated-src/c/_varname_interface_.cpp index c91f5280..266843b1 100644 --- a/test-suite/generated-src/c/_varname_interface_.cpp +++ b/test-suite/generated-src/c/_varname_interface_.cpp @@ -36,11 +36,11 @@ struct VarnameInterface_Proxy: public Proxy_Parent, public ::testsuite::VarnameI }; testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** diff --git a/test-suite/generated-src/c/async_interface.cpp b/test-suite/generated-src/c/async_interface.cpp index 66cf8133..383ee1dc 100644 --- a/test-suite/generated-src/c/async_interface.cpp +++ b/test-suite/generated-src/c/async_interface.cpp @@ -26,11 +26,11 @@ struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInter }; testsuite_async_interface_proxy_class_ref testsuite_async_interface_proxy_class_new(const testsuite_async_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) diff --git a/test-suite/generated-src/c/client_interface.cpp b/test-suite/generated-src/c/client_interface.cpp index fbba88b6..2a577480 100644 --- a/test-suite/generated-src/c/client_interface.cpp +++ b/test-suite/generated-src/c/client_interface.cpp @@ -68,11 +68,11 @@ struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInt }; testsuite_client_interface_proxy_class_ref testsuite_client_interface_proxy_class_new(const testsuite_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_client_interface_ref testsuite_client_interface_new(testsuite_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** Returns record of given string */ diff --git a/test-suite/generated-src/c/conflict_user.cpp b/test-suite/generated-src/c/conflict_user.cpp index a29e0526..78e51920 100644 --- a/test-suite/generated-src/c/conflict_user.cpp +++ b/test-suite/generated-src/c/conflict_user.cpp @@ -32,11 +32,11 @@ struct ConflictUser_Proxy: public Proxy_Parent, public ::testsuite::ConflictUser }; testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance) diff --git a/test-suite/generated-src/c/constant_interface_with_enum.cpp b/test-suite/generated-src/c/constant_interface_with_enum.cpp index a6676597..70d809e2 100644 --- a/test-suite/generated-src/c/constant_interface_with_enum.cpp +++ b/test-suite/generated-src/c/constant_interface_with_enum.cpp @@ -14,11 +14,11 @@ struct ConstantInterfaceWithEnum_Proxy: public Proxy_Parent, public ::testsuite: }; testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/constants_interface.cpp b/test-suite/generated-src/c/constants_interface.cpp index 5587fdb3..df135646 100644 --- a/test-suite/generated-src/c/constants_interface.cpp +++ b/test-suite/generated-src/c/constants_interface.cpp @@ -18,11 +18,11 @@ struct ConstantsInterface_Proxy: public Proxy_Parent, public ::testsuite::Consta }; testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** diff --git a/test-suite/generated-src/c/cpp_exception.cpp b/test-suite/generated-src/c/cpp_exception.cpp index 5cded102..d0c1a0f3 100644 --- a/test-suite/generated-src/c/cpp_exception.cpp +++ b/test-suite/generated-src/c/cpp_exception.cpp @@ -41,11 +41,11 @@ struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException }; testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance) diff --git a/test-suite/generated-src/c/enum_usage_interface.cpp b/test-suite/generated-src/c/enum_usage_interface.cpp index 203b6e93..1badbfd7 100644 --- a/test-suite/generated-src/c/enum_usage_interface.cpp +++ b/test-suite/generated-src/c/enum_usage_interface.cpp @@ -63,11 +63,11 @@ struct EnumUsageInterface_Proxy: public Proxy_Parent, public ::testsuite::EnumUs }; testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e) diff --git a/test-suite/generated-src/c/first_listener.cpp b/test-suite/generated-src/c/first_listener.cpp index 1a92e3e1..c7d2429e 100644 --- a/test-suite/generated-src/c/first_listener.cpp +++ b/test-suite/generated-src/c/first_listener.cpp @@ -18,11 +18,11 @@ struct FirstListener_Proxy: public Proxy_Parent, public ::testsuite::FirstListen }; testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_first_listener_first(testsuite_first_listener_ref instance) diff --git a/test-suite/generated-src/c/flag_roundtrip.cpp b/test-suite/generated-src/c/flag_roundtrip.cpp index 94e95839..884ca841 100644 --- a/test-suite/generated-src/c/flag_roundtrip.cpp +++ b/test-suite/generated-src/c/flag_roundtrip.cpp @@ -16,11 +16,11 @@ struct FlagRoundtrip_Proxy: public Proxy_Parent, public ::testsuite::FlagRoundtr }; testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag) diff --git a/test-suite/generated-src/c/interface_using_extended_record.cpp b/test-suite/generated-src/c/interface_using_extended_record.cpp index 7bbb8f5d..21aad5e2 100644 --- a/test-suite/generated-src/c/interface_using_extended_record.cpp +++ b/test-suite/generated-src/c/interface_using_extended_record.cpp @@ -25,11 +25,11 @@ struct InterfaceUsingExtendedRecord_Proxy: public Proxy_Parent, public ::testsui }; testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er) diff --git a/test-suite/generated-src/c/java_only_listener.cpp b/test-suite/generated-src/c/java_only_listener.cpp index 72093744..9bc1c1b8 100644 --- a/test-suite/generated-src/c/java_only_listener.cpp +++ b/test-suite/generated-src/c/java_only_listener.cpp @@ -14,11 +14,11 @@ struct JavaOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::JavaOnly }; testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/listener_caller.cpp b/test-suite/generated-src/c/listener_caller.cpp index 21d8dca0..4c376313 100644 --- a/test-suite/generated-src/c/listener_caller.cpp +++ b/test-suite/generated-src/c/listener_caller.cpp @@ -23,11 +23,11 @@ struct ListenerCaller_Proxy: public Proxy_Parent, public ::testsuite::ListenerCa }; testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l) diff --git a/test-suite/generated-src/c/objc_only_listener.cpp b/test-suite/generated-src/c/objc_only_listener.cpp index 9b772e09..d542c53d 100644 --- a/test-suite/generated-src/c/objc_only_listener.cpp +++ b/test-suite/generated-src/c/objc_only_listener.cpp @@ -14,11 +14,11 @@ struct ObjcOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::ObjcOnly }; testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/proto_tests.cpp b/test-suite/generated-src/c/proto_tests.cpp index 0afba3c4..38d4417c 100644 --- a/test-suite/generated-src/c/proto_tests.cpp +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -20,11 +20,11 @@ struct ProtoTests_Proxy: public Proxy_Parent, public ::testsuite::ProtoTests { }; testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x) diff --git a/test-suite/generated-src/c/return_one.cpp b/test-suite/generated-src/c/return_one.cpp index 4bcf9c76..1c31940f 100644 --- a/test-suite/generated-src/c/return_one.cpp +++ b/test-suite/generated-src/c/return_one.cpp @@ -22,11 +22,11 @@ struct ReturnOne_Proxy: public Proxy_Parent, public ::testsuite::ReturnOne { }; testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_return_one_ref testsuite_return_one_get_instance() diff --git a/test-suite/generated-src/c/return_two.cpp b/test-suite/generated-src/c/return_two.cpp index be23753b..07389381 100644 --- a/test-suite/generated-src/c/return_two.cpp +++ b/test-suite/generated-src/c/return_two.cpp @@ -22,11 +22,11 @@ struct ReturnTwo_Proxy: public Proxy_Parent, public ::testsuite::ReturnTwo { }; testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } testsuite_return_two_ref testsuite_return_two_get_instance() diff --git a/test-suite/generated-src/c/reverse_client_interface.cpp b/test-suite/generated-src/c/reverse_client_interface.cpp index 1e9e2d35..6d1f0dbb 100644 --- a/test-suite/generated-src/c/reverse_client_interface.cpp +++ b/test-suite/generated-src/c/reverse_client_interface.cpp @@ -43,11 +43,11 @@ struct ReverseClientInterface_Proxy: public Proxy_Parent, public ::testsuite::Re }; testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance) diff --git a/test-suite/generated-src/c/sample_interface.cpp b/test-suite/generated-src/c/sample_interface.cpp index 92d9feb8..1cc3bdae 100644 --- a/test-suite/generated-src/c/sample_interface.cpp +++ b/test-suite/generated-src/c/sample_interface.cpp @@ -14,11 +14,11 @@ struct SampleInterface_Proxy: public Proxy_Parent, public ::testsuite::SampleInt }; testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } diff --git a/test-suite/generated-src/c/second_listener.cpp b/test-suite/generated-src/c/second_listener.cpp index db28cd81..7113ca08 100644 --- a/test-suite/generated-src/c/second_listener.cpp +++ b/test-suite/generated-src/c/second_listener.cpp @@ -18,11 +18,11 @@ struct SecondListener_Proxy: public Proxy_Parent, public ::testsuite::SecondList }; testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_second_listener_second(testsuite_second_listener_ref instance) diff --git a/test-suite/generated-src/c/test_array.cpp b/test-suite/generated-src/c/test_array.cpp index 1e4d2fc3..d1543d91 100644 --- a/test-suite/generated-src/c/test_array.cpp +++ b/test-suite/generated-src/c/test_array.cpp @@ -15,11 +15,11 @@ struct TestArray_Proxy: public Proxy_Parent, public ::testsuite::TestArray { }; testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a) diff --git a/test-suite/generated-src/c/test_duration.cpp b/test-suite/generated-src/c/test_duration.cpp index 6ed65fe2..a8312e78 100644 --- a/test-suite/generated-src/c/test_duration.cpp +++ b/test-suite/generated-src/c/test_duration.cpp @@ -16,11 +16,11 @@ struct TestDuration_Proxy: public Proxy_Parent, public ::testsuite::TestDuration }; testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt) diff --git a/test-suite/generated-src/c/test_helpers.cpp b/test-suite/generated-src/c/test_helpers.cpp index 74b29f0b..9c11d6f7 100644 --- a/test-suite/generated-src/c/test_helpers.cpp +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -23,11 +23,11 @@ struct TestHelpers_Proxy: public Proxy_Parent, public ::testsuite::TestHelpers }; testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** Method with documentation */ diff --git a/test-suite/generated-src/c/test_outcome.cpp b/test-suite/generated-src/c/test_outcome.cpp index 7734d76e..abcd0bcb 100644 --- a/test-suite/generated-src/c/test_outcome.cpp +++ b/test-suite/generated-src/c/test_outcome.cpp @@ -17,11 +17,11 @@ struct TestOutcome_Proxy: public Proxy_Parent, public ::testsuite::TestOutcome }; testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() diff --git a/test-suite/generated-src/c/test_static_method_language.cpp b/test-suite/generated-src/c/test_static_method_language.cpp index 437ddea8..10b665a1 100644 --- a/test-suite/generated-src/c/test_static_method_language.cpp +++ b/test-suite/generated-src/c/test_static_method_language.cpp @@ -14,11 +14,11 @@ struct TestStaticMethodLanguage_Proxy: public Proxy_Parent, public ::testsuite:: }; testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } /** diff --git a/test-suite/generated-src/c/throwing_interface.cpp b/test-suite/generated-src/c/throwing_interface.cpp index c7c1f525..82ac9db6 100644 --- a/test-suite/generated-src/c/throwing_interface.cpp +++ b/test-suite/generated-src/c/throwing_interface.cpp @@ -18,11 +18,11 @@ struct ThrowingInterface_Proxy: public Proxy_Parent, public ::testsuite::Throwin }; testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance) diff --git a/test-suite/generated-src/c/user_token.cpp b/test-suite/generated-src/c/user_token.cpp index 0a05f56d..08208556 100644 --- a/test-suite/generated-src/c/user_token.cpp +++ b/test-suite/generated-src/c/user_token.cpp @@ -22,11 +22,11 @@ struct UserToken_Proxy: public Proxy_Parent, public ::testsuite::UserToken { }; testsuite_user_token_proxy_class_ref testsuite_user_token_proxy_class_new(const testsuite_user_token_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_user_token_ref testsuite_user_token_new(testsuite_user_token_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } djinni_string_ref testsuite_user_token_whoami(testsuite_user_token_ref instance) diff --git a/test-suite/generated-src/c/uses_single_language_listeners.cpp b/test-suite/generated-src/c/uses_single_language_listeners.cpp index a18c9aa2..e8add5c8 100644 --- a/test-suite/generated-src/c/uses_single_language_listeners.cpp +++ b/test-suite/generated-src/c/uses_single_language_listeners.cpp @@ -43,11 +43,11 @@ struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuit }; testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); } testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); } void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l) From db80abbe0b248ae2e357ce2095f4a6bffc72675a Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 08:08:33 -0500 Subject: [PATCH 28/42] don't generate c proxy unless +cc is passed --- src/source/CGenerator.scala | 64 ++++++++++++++++++---------------- src/source/YamlGenerator.scala | 2 +- src/source/parser.scala | 1 + 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 466bf5f3..fee78c7a 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -296,28 +296,33 @@ class CGenerator(spec: Spec) extends Generator(spec) { writeCFilePair(origin, ident, typeResolver.publicImports.toSeq, typeResolver.privateImports.toSeq)((w: IndentWriter) => { writeDoc(w, doc) w.wl(s"""typedef djinni_interface_ref ${typeName};""") - w.wl(s"""typedef djinni_proxy_class_ref ${proxyClassName};""") - w.wl - w.wl(s"""typedef struct """) - w.bracedEnd(s" ${methodDefsStructName};") { + if (i.ext.cc) { + w.wl(s"""typedef djinni_proxy_class_ref ${proxyClassName};""") + w.wl + + w.wl(s"""typedef struct """) + w.bracedEnd(s" ${methodDefsStructName};") { - if (resolvedMethods.isEmpty) { - w.wl("void *reserved[1];") - } else { - for (resolvedMethod <- resolvedMethods) { - w.w(s"""${resolvedMethod.retTypename} (*${resolvedMethod.method.ident.name})(""") - writeDelimited(w, "void *" +: resolvedMethod.parameters.map(p => p.translator.typename), ", ")(s => w.w(s)) - w.wl(");") + if (resolvedMethods.isEmpty) { + w.wl("void *reserved[1];") + } else { + for (resolvedMethod <- resolvedMethods) { + w.w(s"""${resolvedMethod.retTypename} (*${resolvedMethod.method.ident.name})(""") + writeDelimited(w, "void *" +: resolvedMethod.parameters.map(p => p.translator.typename), ", ")(s => w.w(s)) + w.wl(");") + } } } - } - w.wl + w.wl - w.wl(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator);") - w.wl - w.wl(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque);") - w.wl("") + w.wl(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator);") + w.wl + w.wl(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque);") + w.wl("") + } else { + w.wl + } for (resolvedMethod <- resolvedMethods) { writeDoc(w, resolvedMethod.method.doc) @@ -335,21 +340,20 @@ class CGenerator(spec: Spec) extends Generator(spec) { } }, (w: IndentWriter) => { - val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) - w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") - w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") - } - w.wl + if (i.ext.cc) { + val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) + w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") + w.braced { + w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") + } + w.wl - w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") - w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::make<${proxyClassNameCpp}, ${selfCpp}>(proxy_class, opaque);") + w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") + w.braced { + w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::make<${proxyClassNameCpp}, ${selfCpp}>(proxy_class, opaque);") + } + w.wl } - w.wl - - - for (resolvedMethod <- resolvedMethods) { writeDoc(w, resolvedMethod.method.doc) diff --git a/src/source/YamlGenerator.scala b/src/source/YamlGenerator.scala index d907cf2f..657bf37b 100644 --- a/src/source/YamlGenerator.scala +++ b/src/source/YamlGenerator.scala @@ -136,7 +136,7 @@ class YamlGenerator(spec: Spec) extends Generator(spec) { ) private def typeDef(td: TypeDecl) = { - def ext(e: Ext): String = (if(e.cpp) " +c" else "") + (if(e.objc) " +o" else "") + (if(e.java) " +j" else "") + (if(e.js) " +w" else "") + (if(e.swift) " +sw" else "") + def ext(e: Ext): String = (if(e.cpp) " +c" else "") + (if(e.objc) " +o" else "") + (if(e.java) " +j" else "") + (if(e.js) " +w" else "") + (if(e.swift) " +sw" else "") + (if(e.cc) " +cc" else "") def deriving(r: Record) = { if(r.derivingTypes.isEmpty) { "" diff --git a/src/source/parser.scala b/src/source/parser.scala index db38c8d3..4e614fce 100644 --- a/src/source/parser.scala +++ b/src/source/parser.scala @@ -105,6 +105,7 @@ private object IdlParser extends RegexParsers { foundObjc = true foundJavascript = true foundSwift = true + foundC = true } case "c" => { if (foundCpp) return err("Found multiple \"c\" modifiers.") From 74ae7cb2ebc717a4db0a2f16e40ac8b8d2cb5ec6 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 08:12:51 -0500 Subject: [PATCH 29/42] removed ProxyTranslator and moved its methods into InterfaceTranslator --- src/source/CGenerator.scala | 4 ++-- support-lib/cpp/djinni_c_translators.hpp | 16 +++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index fee78c7a..4814bc58 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -344,13 +344,13 @@ class CGenerator(spec: Spec) extends Generator(spec) { val proxyClassNameCpp = writeProxyClass(w, ident, methodDefsStructName, resolvedMethods) w.w(s"${proxyClassName} ${prefix}_proxy_class_new(const ${methodDefsStructName} *method_defs, djinni_opaque_deallocator opaque_deallocator)") w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::makeClass(method_defs, opaque_deallocator);") + w.wl(s"return ::djinni::c_api::InterfaceTranslator<${selfCpp}>::makeProxyClass<${methodDefsStructName}>(method_defs, opaque_deallocator);") } w.wl w.w(s"${typeName} ${prefix}_new(${proxyClassName} proxy_class, void *opaque)") w.braced { - w.wl(s"return ::djinni::c_api::ProxyTranslator<${methodDefsStructName}>::make<${proxyClassNameCpp}, ${selfCpp}>(proxy_class, opaque);") + w.wl(s"return ::djinni::c_api::InterfaceTranslator<${selfCpp}>::makeProxy<${methodDefsStructName}, ${proxyClassNameCpp}>(proxy_class, opaque);") } w.wl } diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index c93dc26a..a90ecd3f 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -347,24 +347,22 @@ template class InterfaceTranslator { Object *obj = new InterfaceHolder(std::move(value)); return toC(obj); } -}; -template class ProxyTranslator { -public: + template static djinni_proxy_class_ref - makeClass(const PT *methodDefs, djinni_opaque_deallocator opaqueDeallocator) { + makeProxyClass(const PT *methodDefs, + djinni_opaque_deallocator opaqueDeallocator) { auto *proxyClass = new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); return toC(proxyClass); } - template - static djinni_interface_ref make(djinni_proxy_class_ref proxyClassRef, - void *opaque) { + template + static djinni_interface_ref makeProxy(djinni_proxy_class_ref proxyClassRef, + void *opaque) { auto *proxyClass = fromC<::djinni::ProxyClass>(proxyClassRef); - return ::djinni::c_api::InterfaceTranslator::fromCpp( - std::make_shared

(proxyClass, opaque)); + return fromCpp(std::make_shared

(proxyClass, opaque)); } }; From ee81409783e4050ed2fb66248701a06a93fbe36d Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 12:12:43 -0500 Subject: [PATCH 30/42] cleaner code gen --- src/source/CGenerator.scala | 14 +- src/source/CTypeResolver.scala | 166 +++++------ support-lib/cpp/Future_c_translator.hpp | 24 +- support-lib/cpp/Outcome_c_translator.hpp | 32 +- support-lib/cpp/djinni_c_translators.hpp | 357 +++++++++++------------ 5 files changed, 270 insertions(+), 323 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 4814bc58..6b743d7c 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -166,7 +166,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.w(s"""return ::djinni::c_api::RecordTranslator<${selfCpp}>::make(""") writeDelimited(w, resolvedFields, ", ")(t => { - w.w(t.translator.toCppTranslatorFn(t.field.ident.name)) + w.w(t.translator.toCpp(t.field.ident.name)) }) w.wl(");") @@ -181,12 +181,12 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(s"""${fieldTypename} ${prefix}_get_${fieldName}(${typeName} instance)""") w.braced { val param = s"${toCppExpr}.${idCpp.field(resolvedField.field.ident)}" - w.wl(s"return ${resolvedField.translator.fromCppTranslatorFn(param)};") + w.wl(s"return ${resolvedField.translator.fromCpp(param)};") } w.wl w.wl(s"""void ${prefix}_set_${fieldName}(${typeName} instance, ${fieldTypename} value)""") w.braced { - val toCppValue = resolvedField.translator.toCppTranslatorFn("value") + val toCppValue = resolvedField.translator.toCpp("value") w.wl(s"${toCppExpr}.${idCpp.field(resolvedField.field.ident)} = ${toCppValue};") } w.wl @@ -232,7 +232,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.braced { for (param <- resolvedMethod.parameters) { val resolvedExpr = cppMarshal.maybeMove(param.field.ident.name, param.field.ty) - w.wl(s"auto ${getConvertedParamName(param)} = ${param.translator.fromCppTranslatorFn(resolvedExpr)};") + w.wl(s"auto ${getConvertedParamName(param)} = ${param.translator.fromCpp(resolvedExpr)};") } val retValueName = "returnValue" @@ -256,7 +256,7 @@ class CGenerator(spec: Spec) extends Generator(spec) { if (needsReturnValue) { w.wl - w.wl(s"auto ${getReturnNameCpp(retValueName)} = ${resolvedMethod.returnType.get.toCppTranslatorFn(retValueName)};") + w.wl(s"auto ${getReturnNameCpp(retValueName)} = ${resolvedMethod.returnType.get.toCpp(retValueName)};") if (resolvedMethod.returnType.get.isRefType) { w.wl(s"djinni_ref_release(${retValueName});") } @@ -380,14 +380,14 @@ class CGenerator(spec: Spec) extends Generator(spec) { } writeDelimited(w, resolvedMethod.parameters, ", ")(p => { - w.w(p.translator.toCppTranslatorFn(p.field.ident.name)) + w.w(p.translator.toCpp(p.field.ident.name)) }) w.w(")") w.wl(";") if (needsReturnValue) { - w.wl(s"""return ${resolvedMethod.returnType.get.fromCppTranslatorFn("std::move(retValue)")};""") + w.wl(s"""return ${resolvedMethod.returnType.get.fromCpp("std::move(retValue)")};""") } } diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 468ee082..6c1f839f 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -8,9 +8,21 @@ import scala.collection.mutable class CTypeTranslator(val typename: String, val isRefType: Boolean, - val toCppTranslatorFn: (String) => String, - val fromCppTranslatorFn: (String) => String) { + val translator: String) { + def toCpp(value: String): String = + if (translator.nonEmpty) { + s"${translator}::toCpp(${value})" + } else { + value + } + + def fromCpp(value: String): String = + if (translator.nonEmpty) { + s"${translator}::fromCpp(${value})" + } else { + value + } } class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal) { @@ -33,14 +45,6 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal spec.cNamespace + str + "_ref" } - private def makeTranslator(typename: String, isRefType: Boolean, translator: String): CTypeTranslator = { - new CTypeTranslator(typename, - isRefType, - (p) => s"${translator}::toCpp(${p})", - (p) => s"${translator}::fromCpp(${p})" - ) - } - private def getPrimitiveOrNull(expr: MExpr): meta.MPrimitive = { expr.base match { case opaque: meta.MOpaque => @@ -71,26 +75,6 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } } - private def makeNestedTranslatorFunctionPairs(inner: CTypeTranslator): (String, String) = { - val innerValueParamName = s"std::forward(value)" - val innerToCpp = inner.toCppTranslatorFn(innerValueParamName) - val innerFromCpp = inner.fromCppTranslatorFn(innerValueParamName) - (s"[](auto&& value) { return ${innerToCpp}; }", s"[](auto&& value) { return ${innerFromCpp}; }") - } - - private def makeNestedTranslator(inner: CTypeTranslator, typename: String, toCppTranslator: String, fromCppTranslator: String): CTypeTranslator = { - val (toCppFn, fromCppFn) = makeNestedTranslatorFunctionPairs(inner) - new CTypeTranslator(typename, - true, - (p) => { - s"${toCppTranslator}(${p}, ${toCppFn})" - }, - (p) => { - s"$fromCppTranslator(${p}, ${fromCppFn})" - } - ) - } - private def resolveOptional(expr: MExpr, asBoxed: Boolean, parent: MExpr): CTypeTranslator = { val resolved = resolve(expr, asBoxed || isEnum(expr)) val primitive = getPrimitiveOrNull(expr) @@ -99,60 +83,59 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal if (primitive != null && !asBoxed) { val typename = s"djinni_optional_${resolved.typename}" - new CTypeTranslator(typename, + + new CTypeTranslator( + typename, false, - (p) => s"::djinni::c_api::OptionalTranslator::toCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.toCppTranslatorFn(p)})", - (p) => s"::djinni::c_api::OptionalTranslator::fromCppPrimitive<${cppOptionalTemplate}, ${typename}>(${resolved.fromCppTranslatorFn(p)})" + s"::djinni::c_api::PrimitiveOptionalTranslator<${cppOptionalTemplate}, ${typename}>" ) } else { val sharedPtr = cppMarshal.bySharedPtr(expr) - val toCppMethodName = if (sharedPtr) "toSharedPtrCpp" else "toCpp" - val fromCppMethodName = if (sharedPtr) "fromSharedPtrCpp" else "fromCpp" - makeNestedTranslator(resolved, - resolved.typename, - s"::djinni::c_api::OptionalTranslator::${toCppMethodName}<${cppOptionalTemplate}>", - s"::djinni::c_api::OptionalTranslator::${fromCppMethodName}<${cppOptionalTemplate}>") + + if (sharedPtr) { + new CTypeTranslator(resolved.typename, true, s"::djinni::c_api::OptionalPtrTranslator<${resolved.translator}>") + } else { + new CTypeTranslator(resolved.typename, true, s"::djinni::c_api::OptionalTranslator<${cppOptionalTemplate}, ${resolved.translator}>") + } } } private def resolveListLike(expr: MExpr, translator: String): CTypeTranslator = { - val resolved = resolve(expr, true) + val resolved = resolve(expr, asBoxed = true) - val cppType = cppMarshal.fqTypename(expr) - makeNestedTranslator(resolved, "djinni_array_ref", s"$translator<${cppType}>::toCpp", s"$translator<${cppType}>::fromCpp") + new CTypeTranslator("djinni_array_ref", true, s"$translator<${resolved.translator}>") } private def resolveMap(keyExpr: MExpr, valueExpr: MExpr): CTypeTranslator = { - val resolvedKey = resolve(keyExpr, true) - val resolvedValue = resolve(valueExpr, true) - val cppTypeKey = cppMarshal.fqTypename(keyExpr) - val cppTypeValue = cppMarshal.fqTypename(valueExpr) - - new CTypeTranslator("djinni_keyval_array_ref", - true, - (p) => { - val innerToCppKey = resolvedKey.toCppTranslatorFn("key") - val innerToCppValue = resolvedValue.toCppTranslatorFn("value") - s"::djinni::c_api::MapTranslator<${cppTypeKey}, ${cppTypeValue}>::toCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerToCppKey}, ${innerToCppValue}); })" - }, - (p) => { - val innerFromCppKey = resolvedKey.fromCppTranslatorFn("key") - val innerFromCppValue = resolvedValue.fromCppTranslatorFn("value") - s"::djinni::c_api::MapTranslator<${cppTypeKey}, ${cppTypeValue}>::fromCpp(${p}, [](auto key, auto value) { return std::make_pair(${innerFromCppKey}, ${innerFromCppValue}); })" - }) + val resolvedKey = resolve(keyExpr, asBoxed = true) + val resolvedValue = resolve(valueExpr, asBoxed = true) + new CTypeTranslator("djinni_keyval_array_ref", true, s"::djinni::c_api::MapTranslator<${resolvedKey.translator}, ${resolvedValue.translator}>") } private def resolvePrimitive(cName: String, asBoxed: Boolean): CTypeTranslator = { if (asBoxed) { - new CTypeTranslator("djinni_number_ref", true, (p) => { - s"::djinni::c_api::NumberTranslator::toCpp<${cName}>(${p})" - }, - (p) => { - s"::djinni::c_api::NumberTranslator::fromCpp<${cName}>(${p})" - }) + val translatorName = cName match { + case "bool" => "BoolTranslator" + + case "uint8_t" => "UInt8Translator" + case "uint16_t" => "UInt16Translator" + case "uint32_t" => "UInt32Translator" + case "uint64_t" => "UInt64Translator" + + case "int8_t" => "Int8Translator" + case "int16_t" => "Int16Translator" + case "int32_t" => "Int32Translator" + case "int64_t" => "Int64Translator" + + case "float" => "FloatTranslator" + case "double" => "DoubleTranslator" + case _ => throw new AssertionError(s"Recognized primitive type '${cName}'") + } + + new CTypeTranslator("djinni_number_ref", true, s"::djinni::c_api::${translatorName}") } else { - new CTypeTranslator(cName, false, p => p, p => p) + new CTypeTranslator(cName, false, "") } } @@ -172,24 +155,16 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal } private def resolveEnum(name: String, body: ast.TypeDef, asBoxed: Boolean): CTypeTranslator = { - val translator = getTranslatorNameForType(name, body) + val cppTypename = cppMarshal.fqTypename(name, body) val typename = valueTypeName(name) - doResolveEnum(typename, translator, asBoxed) + doResolveEnum(typename, cppTypename, asBoxed) } - private def doResolveEnum(typename: String, translator: String, asBoxed: Boolean): CTypeTranslator = { + private def doResolveEnum(typename: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { if (asBoxed) { - new CTypeTranslator("djinni_number_ref", - true, - (p) => s"${translator}::toCppBoxed(${p})", - (p) => s"${translator}::fromCppBoxed(${p})" - ) + new CTypeTranslator("djinni_number_ref", true, s"::djinni::c_api::BoxedEnumTranslator<${cppTypename}>") } else { - new CTypeTranslator(typename, - false, - (p) => s"${translator}::toCpp(${p})", - (p) => s"${translator}::fromCpp(${p})" - ) + new CTypeTranslator(typename, false, s"::djinni::c_api::EnumTranslator<${cppTypename}, ${typename}>") } } @@ -199,26 +174,19 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal privateImports.add("#include " + cppMarshal.resolveExtCppHdr(c.privateHeader)) if (expr.args.nonEmpty) { - val argsTranslators = expr.args.map(a => resolve(a, asBoxed = true)) val templateArgs = expr.args.map(a => cppMarshal.fqTypename(a)).mkString(", ") val translator = s"${c.translator}<${templateArgs}>" if (c.ignoreTypeParams) { return new CTypeTranslator(c.typename, true, - (p) => s"${translator}::toCpp(${p})", - (p) => s"${translator}::fromCpp(${p})" + translator ) } else { - val translatorFnPairs = argsTranslators.map(t => makeNestedTranslatorFunctionPairs(t)) - val toCppFns = translatorFnPairs.map(p => p._1).mkString(", ") - val fromCppFns = translatorFnPairs.map(p => p._2).mkString(", ") + val argsTranslators = expr.args.map(a => resolve(a, asBoxed = true).translator).mkString(", ") + val translator = s"${c.translator}<${argsTranslators}>" - return new CTypeTranslator(c.typename, - true, - (p) => s"${translator}::toCpp(${p}, ${toCppFns})", - (p) => s"${translator}::fromCpp(${p}, ${fromCppFns})" - ) + return new CTypeTranslator(c.typename, true, translator) } } @@ -230,7 +198,7 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal if (isEnum) { doResolveEnum(c.typename, c.translator, asBoxed) } else { - makeTranslator(c.typename, isRefType = true, c.translator) + new CTypeTranslator(c.typename, true, c.translator) } } @@ -261,17 +229,13 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal addPublicImportFromDef(name) body match { case ast.Enum(_, _) => resolveEnum(name, body, asBoxed) - case _ => makeTranslator( - ptrTypeName(name), - isRefType = true, - getTranslatorNameForType(name, body) - ) + case _ => new CTypeTranslator(ptrTypeName(name), true, getTranslatorNameForType(name, body)) } } case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, c) => resolveExtern(expr, defType, c, asBoxed) case meta.MProtobuf(_, _, _) => updatePrivateImports(expr.base) - makeTranslator( + new CTypeTranslator( "djinni_binary_ref", isRefType = true, s"::djinni::c_api::ProtobufTranslator<${cppMarshal.fqTypename(expr)}>" @@ -279,15 +243,15 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal case opaque: meta.MOpaque => opaque match { case meta.MPrimitive(_, _, _, cName, _, _, _, _) => resolvePrimitive(cName, asBoxed) - case meta.MString => makeTranslator("djinni_string_ref", isRefType = true, "::djinni::c_api::StringTranslator") - case meta.MDate => makeTranslator("djinni_date_ref", isRefType = true, "::djinni::c_api::DateTranslator") - case meta.MBinary => makeTranslator("djinni_binary_ref", isRefType = true, "::djinni::c_api::BinaryTranslator") + case meta.MString => new CTypeTranslator("djinni_string_ref", isRefType = true, "::djinni::c_api::StringTranslator") + case meta.MDate => new CTypeTranslator("djinni_date_ref", isRefType = true, "::djinni::c_api::DateTranslator") + case meta.MBinary => new CTypeTranslator("djinni_binary_ref", isRefType = true, "::djinni::c_api::BinaryTranslator") case meta.MOptional => resolveOptional(expr.args.head, asBoxed, expr) case meta.MList => resolveListLike(expr.args.head, "::djinni::c_api::ListTranslator") case meta.MSet => resolveListLike(expr.args.head, "::djinni::c_api::SetTranslator") case meta.MMap => resolveMap(expr.args.head, expr.args(1)) case meta.MArray => resolveListLike(expr.args.head, "::djinni::c_api::ListTranslator") - case meta.MVoid => new CTypeTranslator("void", false, p => p, p => p) + case meta.MVoid => new CTypeTranslator("void", false, "::djinni::c_api::VoidTranslator") } } } diff --git a/support-lib/cpp/Future_c_translator.hpp b/support-lib/cpp/Future_c_translator.hpp index 2fd20e5c..1e47f61e 100644 --- a/support-lib/cpp/Future_c_translator.hpp +++ b/support-lib/cpp/Future_c_translator.hpp @@ -1,8 +1,8 @@ #pragma once #include "Future.hpp" -#include "djinni_c.h" #include "djinni_c_types.hpp" +#include "future_c.h" namespace djinni { template class FutureHolder : public Object { @@ -19,24 +19,24 @@ template class FutureHolder : public Object { namespace djinni::c_api { -template class FutureTranslator { -public: - template - static ::djinni::Future toCpp(djinni_future_ref future, F &&toCpp) { - auto *futureHolder = static_cast<::djinni::FutureHolder *>( - reinterpret_cast(future)); +template struct FutureTranslator { + using CppType = ::djinni::Future; + using CType = djinni_future_ref; + + static CppType toCpp(CType future) { + auto *futureHolder = + fromC<::djinni::FutureHolder>(future); // Any way to make this better? return futureHolder->getFuture().then( - [](::djinni::Future value) { return value.get(); }); + [](CppType value) { return value.get(); }); } - template - static djinni_future_ref fromCpp(::djinni::Future &&future, F &&fromCpp) { - Object *futureHolder = new ::djinni::FutureHolder(std::move(future)); + static CType fromCpp(CppType &&future) { + auto *futureHolder = new ::djinni::FutureHolder(std::move(future)); - return reinterpret_cast(futureHolder); + return toC(futureHolder); } }; diff --git a/support-lib/cpp/Outcome_c_translator.hpp b/support-lib/cpp/Outcome_c_translator.hpp index 7d91cac2..d66b6c81 100644 --- a/support-lib/cpp/Outcome_c_translator.hpp +++ b/support-lib/cpp/Outcome_c_translator.hpp @@ -5,50 +5,48 @@ namespace djinni::c_api { -template class OutcomeTranslator { -public: - template - static ::djinni::expected toCpp(djinni_outcome_ref outcome, F1 &&toCpp1, - F2 &&toCpp2) { +template struct OutcomeTranslator { + using CppType = + ::djinni::expected; + using CType = djinni_outcome_ref; + + static CppType toCpp(djinni_outcome_ref outcome) { if (djinni_outcome_is_success(outcome)) { auto success = djinni_outcome_get_value(outcome); - auto out = ::djinni::expected(toCpp1(success)); + auto out = CppType(Tr1::toCpp(success)); djinni_ref_release(success); return out; } else { auto error = djinni_outcome_get_error(outcome); - auto out = ::djinni::make_unexpected(toCpp2(error)); + auto out = + ::djinni::make_unexpected(Tr2::toCpp(error)); djinni_ref_release(error); return out; } } - template - static djinni_outcome_ref fromCpp(::djinni::expected &&outcome, - F1 &&fromCpp1, F2 &&fromCpp2) { + static CType fromCpp(CppType &&outcome) { if (outcome) { - auto success = fromCpp1(std::move(outcome.value())); + auto success = Tr1::fromCpp(std::move(outcome.value())); djinni_outcome_ref result = djinni_outcome_make_success(success); djinni_ref_release(success); return result; } else { - auto error = fromCpp2(std::move(outcome.error())); + auto error = Tr2::fromCpp(std::move(outcome.error())); djinni_outcome_ref result = djinni_outcome_make_error(error); djinni_ref_release(error); return result; } } - template - static djinni_outcome_ref fromCpp(const ::djinni::expected &outcome, - F1 &&fromCpp1, F2 &&fromCpp2) { + static CType fromCpp(const CppType &outcome) { if (outcome) { - auto success = fromCpp1(outcome.value()); + auto success = Tr1::fromCpp(outcome.value()); djinni_outcome_ref result = djinni_outcome_make_success(success); djinni_ref_release(success); return result; } else { - auto error = fromCpp2(outcome.error()); + auto error = Tr2::fromCpp(outcome.error()); djinni_outcome_ref result = djinni_outcome_make_error(error); djinni_ref_release(error); return result; diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index a90ecd3f..be154de1 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -12,121 +12,87 @@ namespace djinni::c_api { -class StringTranslator { -public: - static djinni_string_ref fromCpp(std::string &&str); - static djinni_string_ref fromCpp(const std::string &str); - static std::string toCpp(djinni_string_ref str); +struct VoidTranslator { + using CppType = void; + using CType = void; + + static CType fromCpp() {} + static CppType toCpp() {} }; -class DateTranslator { -public: - static djinni_date_ref - fromCpp(const std::chrono::system_clock::time_point &date); - static std::chrono::system_clock::time_point toCpp(djinni_date_ref date); +struct StringTranslator { + using CppType = std::string; + using CType = djinni_string_ref; + + static CType fromCpp(CppType &&str); + static CType fromCpp(const CppType &str); + static CppType toCpp(CType str); }; -class NumberTranslator { -public: - template static djinni_number_ref fromCpp(T value) = delete; - template static T toCpp(djinni_number_ref value) = delete; +struct DateTranslator { + using CppType = std::chrono::system_clock::time_point; + using CType = djinni_date_ref; + static CType fromCpp(const CppType &date); + static CppType toCpp(CType date); +}; - template <> djinni_number_ref fromCpp(uint8_t value) { - return fromCppUnsignedInt(value); - } - template <> djinni_number_ref fromCpp(uint16_t value) { - return fromCppUnsignedInt(value); - } - template <> djinni_number_ref fromCpp(uint32_t value) { - return fromCppUnsignedInt(value); - } - template <> djinni_number_ref fromCpp(uint64_t value) { - return fromCppUnsignedInt(value); - } - template <> djinni_number_ref fromCpp(bool value) { - return fromCppUnsignedInt(value); - } +template struct UIntTranslator { + using CppType = T; + using CType = djinni_number_ref; - template <> uint8_t toCpp(djinni_number_ref value) { - return toCppUnsignedInt(value); - } - template <> uint16_t toCpp(djinni_number_ref value) { - return toCppUnsignedInt(value); - } - template <> uint32_t toCpp(djinni_number_ref value) { - return toCppUnsignedInt(value); - } - template <> uint64_t toCpp(djinni_number_ref value) { - return toCppUnsignedInt(value); + static CType fromCpp(CppType value) { + return djinni_number_uint64_new(static_cast(value)); } - template <> bool toCpp(djinni_number_ref value) { - return toCppUnsignedInt(value); + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_uint64(value)); } +}; - template <> djinni_number_ref fromCpp(int8_t value) { - return fromCppSignedInt(value); - } - template <> djinni_number_ref fromCpp(int16_t value) { - return fromCppSignedInt(value); - } - template <> djinni_number_ref fromCpp(int32_t value) { - return fromCppSignedInt(value); - } - template <> djinni_number_ref fromCpp(int64_t value) { - return fromCppSignedInt(value); - } +template struct SignedIntTranslator { + using CppType = T; + using CType = djinni_number_ref; - template <> int8_t toCpp(djinni_number_ref value) { - return toCppSignedInt(value); - } - template <> int16_t toCpp(djinni_number_ref value) { - return toCppSignedInt(value); - } - template <> int32_t toCpp(djinni_number_ref value) { - return toCppSignedInt(value); - } - template <> int64_t toCpp(djinni_number_ref value) { - return toCppSignedInt(value); + static CType fromCpp(CppType value) { + return djinni_number_int64_new(static_cast(value)); } - template <> djinni_number_ref fromCpp(float value) { - return djinni_number_double_new(value); + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_int64(value)); } +}; - template <> djinni_number_ref fromCpp(double value) { - return djinni_number_double_new(value); - } +template struct FloatingPointTranslator { + using CppType = T; + using CType = djinni_number_ref; - template <> float toCpp(djinni_number_ref value) { - return static_cast(djinni_number_get_double(value)); + static CType fromCpp(CppType value) { + return djinni_number_double_new(static_cast(value)); } - template <> double toCpp(djinni_number_ref value) { - return djinni_number_get_double(value); + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_double(value)); } +}; -private: - template static djinni_number_ref fromCppUnsignedInt(T value) { - return djinni_number_uint64_new(static_cast(value)); - } +struct UInt8Translator : public UIntTranslator {}; +struct UInt16Translator : public UIntTranslator {}; +struct UInt32Translator : public UIntTranslator {}; +struct UInt64Translator : public UIntTranslator {}; - template static T toCppUnsignedInt(djinni_number_ref value) { - return static_cast(djinni_number_get_uint64(value)); - } +struct Int8Translator : public SignedIntTranslator {}; +struct Int16Translator : public SignedIntTranslator {}; +struct Int32Translator : public SignedIntTranslator {}; +struct Int64Translator : public SignedIntTranslator {}; - template static djinni_number_ref fromCppSignedInt(T value) { - return djinni_number_int64_new(static_cast(value)); - } +struct FloatTranslator : public FloatingPointTranslator {}; +struct DoubleTranslator : public FloatingPointTranslator {}; - template static T toCppSignedInt(djinni_number_ref value) { - return static_cast(djinni_number_get_int64(value)); - } -}; +template struct PrimitiveOptionalTranslator { + using CppType = CppOpt; + using CType = COpt; -class OptionalTranslator { -public: - template static T fromCppPrimitive(Opt value) { - T out; + static CType fromCpp(CppType value) { + CType out; if (value) { out.has_value = true; @@ -139,95 +105,97 @@ class OptionalTranslator { return out; } - template static Opt toCppPrimitive(T value) { + static CppType toCpp(CType value) { if (value.has_value) { - return Opt(value.value); + return CppType(value.value); } else { - return Opt(); + return CppType(); } } +}; - template - static djinni_ref fromSharedPtrCpp(const T &value, F &&convert) { - if (value == nullptr) { +template struct OptionalTranslator { + using CppType = Opt; + using CType = djinni_ref; + + static CType fromCpp(const CppType &value) { + if (!value) { return nullptr; } else { - return convert(value); + return Tr::fromCpp(value.value()); } } - template - static djinni_ref fromSharedPtrCpp(T &&value, F &&convert) { - if (value == nullptr) { + static CType fromCpp(CppType &&value) { + if (!value) { return nullptr; } else { - return convert(std::move(value)); + return Tr::fromCpp(std::move(value.value())); } } - template - static djinni_ref fromCpp(const Opt &value, F &&convert) { - if (!value) { - return nullptr; + static CppType toCpp(djinni_ref ptr) { + if (ptr == nullptr) { + return CppType(); } else { - return convert(value.value()); + return CppType(Tr::toCpp(ptr)); } } +}; - template - static djinni_ref fromCpp(Opt &&value, F &&convert) { - if (!value) { +template struct OptionalPtrTranslator { + using CppType = typename Tr::CppType; + using CType = djinni_ref; + + static CType fromCpp(const CppType &value) { + if (value == nullptr) { return nullptr; } else { - return convert(std::move(value.value())); + return Tr::fromCpp(value); } } - template - static Opt toCpp(djinni_ref ptr, F &&convert) { - if (ptr == nullptr) { - return Opt(); + static CType fromCpp(CppType &&value) { + if (value == nullptr) { + return nullptr; } else { - return Opt(convert(ptr)); + return Tr::fromCpp(std::move(value)); } } - template - static T toSharedPtrCpp(djinni_ref ptr, F &&convert) { - if (ptr == nullptr) { - return T(); + static CppType toCpp(CType value) { + if (value == nullptr) { + return nullptr; } else { - return convert(ptr); + return Tr::toCpp(value); } } - -private: }; -template class ListTranslator { -public: - template - static std::vector toCpp(djinni_array_ref value, F &&convert) { - std::vector output; +template struct ListTranslator { + using CppType = std::vector; + using CType = djinni_array_ref; + + static CppType toCpp(CType value) { + CppType output; auto length = djinni_array_get_length(value); output.reserve(length); for (size_t i = 0; i < length; i++) { auto item = djinni_array_get_value(value, i); - output.emplace_back(convert(item)); + output.emplace_back(Tr::toCpp(item)); djinni_ref_release(item); } return output; } - template - static djinni_array_ref fromCpp(const std::vector &values, F &&convert) { + static CType fromCpp(const CppType &values) { djinni_array_ref output = djinni_array_new(values.size()); size_t index = 0; for (const auto &value : values) { - auto converted = convert(value); + auto converted = Tr::fromCpp(value); djinni_array_set_value(output, index++, converted); djinni_ref_release(converted); } @@ -236,31 +204,30 @@ template class ListTranslator { } }; -template class SetTranslator { -public: - template - static std::unordered_set toCpp(djinni_array_ref value, F &&convert) { - std::unordered_set output; +template struct SetTranslator { + using CppType = std::unordered_set; + using CType = djinni_array_ref; + + static CppType toCpp(CType value) { + CppType output; auto length = djinni_array_get_length(value); output.reserve(length); for (size_t i = 0; i < length; i++) { auto item = djinni_array_get_value(value, i); - output.emplace(convert(item)); + output.emplace(Tr::toCpp(item)); djinni_ref_release(item); } return output; } - template - static djinni_array_ref fromCpp(const std::unordered_set &values, - F &&convert) { + static CType fromCpp(const CppType &values) { djinni_array_ref output = djinni_array_new(values.size()); size_t index = 0; for (const auto &value : values) { - auto converted = convert(value); + auto converted = Tr::fromCpp(value); djinni_array_set_value(output, index++, converted); djinni_ref_release(converted); } @@ -269,20 +236,20 @@ template class SetTranslator { } }; -template class MapTranslator { -public: - template - static std::unordered_map toCpp(djinni_keyval_array_ref key_values, - F &&convert) { - std::unordered_map output; +template struct MapTranslator { + using CppType = + std::unordered_map; + using CType = djinni_keyval_array_ref; + + static CppType toCpp(djinni_keyval_array_ref key_values) { + CppType output; auto length = djinni_keyval_array_get_length(key_values); output.reserve(length); for (size_t i = 0; i < length; i++) { auto key = djinni_keyval_array_get_key(key_values, i); auto value = djinni_keyval_array_get_value(key_values, i); - auto pair = convert(key, value); - output.try_emplace(std::move(pair.first), std::move(pair.second)); + output.try_emplace(TrK::toCpp(key), TrV::toCpp(value)); djinni_ref_release(key); djinni_ref_release(value); } @@ -290,31 +257,32 @@ template class MapTranslator { return output; } - template - static djinni_keyval_array_ref fromCpp(const std::unordered_map &map, - F &&convert) { + static CType fromCpp(const CppType &map) { djinni_keyval_array_ref output = djinni_keyval_array_new(map.size()); size_t index = 0; for (const auto &it : map) { - auto pair = convert(it.first, it.second); + auto key = TrK::fromCpp(it.first); + auto value = TrV::fromCpp(it.second); - djinni_keyval_array_set_entry(output, index++, pair.first, pair.second); + djinni_keyval_array_set_entry(output, index++, key, value); - djinni_ref_release(pair.first); - djinni_ref_release(pair.second); + djinni_ref_release(key); + djinni_ref_release(value); } return output; } }; -template class RecordTranslator { -public: +template struct RecordTranslator { + using CppType = T; + using CType = djinni_record_ref; + template static djinni_record_ref make(Args &&...args) { auto *obj = new RecordHolder(T(std::forward(args)...)); return toC(obj); } - static T &toCpp(djinni_record_ref ref) { + static CppType &toCpp(djinni_record_ref ref) { auto *record = fromC>(ref); if (record == nullptr) { std::abort(); @@ -323,18 +291,16 @@ template class RecordTranslator { return record->data(); } - static djinni_record_ref fromCpp(T &&value) { return make(std::move(value)); } - - static djinni_record_ref fromCpp(const T &value) { return make(value); } + static CType fromCpp(CppType &&value) { return make(std::move(value)); } - static void release(djinni_record_ref ptr) { - Object::release(fromC(ptr)); - } + static CType fromCpp(const CppType &value) { return make(value); } }; -template class InterfaceTranslator { -public: - static const std::shared_ptr &toCpp(djinni_interface_ref ref) { +template struct InterfaceTranslator { + using CppType = std::shared_ptr; + using CType = djinni_interface_ref; + + static const CppType &toCpp(CType ref) { auto *i = fromC>(ref); if (i == nullptr) { std::abort(); @@ -343,7 +309,7 @@ template class InterfaceTranslator { return i->data(); } - static djinni_interface_ref fromCpp(std::shared_ptr value) { + static CType fromCpp(CppType value) { Object *obj = new InterfaceHolder(std::move(value)); return toC(obj); } @@ -366,37 +332,56 @@ template class InterfaceTranslator { } }; -template class EnumTranslator { -public: - static Cpp toCpp(C value) { return static_cast(value); } - static C fromCpp(Cpp value) { return static_cast(value); } +template struct EnumTranslator { + using CppType = Cpp; + using CType = C; + + static CppType toCpp(CType value) { return static_cast(value); } + static CType fromCpp(CppType value) { return static_cast(value); } static Cpp toCppBoxed(djinni_number_ref value) { return static_cast(djinni_number_get_int64(value)); } static djinni_number_ref fromCppBoxed(Cpp value) { - return NumberTranslator::fromCpp(static_cast(value)); + return djinni_number_int64_new(static_cast(value)); } }; -class BinaryTranslator { -public: - static std::vector toCpp(djinni_binary_ref binary); - static djinni_binary_ref fromCpp(std::vector &&binary); - static djinni_binary_ref fromCpp(const std::vector &binary); +template struct BoxedEnumTranslator { + using CppType = Cpp; + using CType = djinni_number_ref; + + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_int64(value)); + } + + static CType fromCpp(CppType value) { + return djinni_number_int64_new(static_cast(value)); + } }; -template class ProtobufTranslator { -public: - static T toCpp(djinni_binary_ref binary) { - T output; +struct BinaryTranslator { + using CppType = std::vector; + using CType = djinni_binary_ref; + + static CppType toCpp(CType binary); + static CType fromCpp(CppType &&binary); + static CType fromCpp(const CppType &binary); +}; + +template struct ProtobufTranslator { + using CppType = T; + using CType = djinni_binary_ref; + + static CppType toCpp(CType binary) { + CppType output; output.ParseFromArray(djinni_binary_get_data(binary), djinni_binary_get_length(binary)); return output; } - static djinni_binary_ref fromCpp(const T &proto) { + static CType fromCpp(const CppType &proto) { auto length = proto.ByteSizeLong(); auto output = djinni_binary_new(static_cast(length)); From d79eeb3fd8b04d1f39437614c9b100a95a2e701f Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 13:50:43 -0500 Subject: [PATCH 31/42] support for future --- support-lib/cpp/Future_c.cpp | 108 ++++++++++++++++++ support-lib/cpp/Future_c_translator.cpp | 12 ++ support-lib/cpp/Future_c_translator.hpp | 68 ++++++++--- support-lib/cpp/djinni_c_ref.hpp | 50 ++++++++ support-lib/cpp/djinni_c_translators.hpp | 4 +- support-lib/cpp/future_c.h | 18 ++- .../c/tests/DjinniCAPI_tests.cpp | 106 +++++++++++++++++ 7 files changed, 347 insertions(+), 19 deletions(-) create mode 100644 support-lib/cpp/Future_c.cpp create mode 100644 support-lib/cpp/Future_c_translator.cpp create mode 100644 support-lib/cpp/djinni_c_ref.hpp diff --git a/support-lib/cpp/Future_c.cpp b/support-lib/cpp/Future_c.cpp new file mode 100644 index 00000000..1afa63e6 --- /dev/null +++ b/support-lib/cpp/Future_c.cpp @@ -0,0 +1,108 @@ +#include "future_c.h" +#include "Future.hpp" +#include "Future_c_translator.hpp" +#include "djinni_c_ref.hpp" +#include "djinni_c_types.hpp" + +namespace djinni::c_api { + +class PromiseHolder : public Object { +public: + PromiseHolder() = default; + ~PromiseHolder() override = default; + + Promise> &getPromise() { return _promise; } + +private: + Promise> _promise; +}; + +class FutureHolder : public Object { +public: + FutureHolder(Future> future) : _future(std::move(future)) {} + ~FutureHolder() override = default; + + Future> &getFuture() { return _future; } + +private: + Future> _future; +}; + +class FutureOpaqueHolder { +public: + FutureOpaqueHolder(void *opaque, djinni_opaque_deallocator opaqueDeallocator) + : _opaque(opaque), _opaqueDeallocator(opaqueDeallocator) {} + + FutureOpaqueHolder(const FutureOpaqueHolder &other) = delete; + + FutureOpaqueHolder(FutureOpaqueHolder &&other) + : _opaque(other._opaque), _opaqueDeallocator(other._opaqueDeallocator) { + other._opaque = nullptr; + other._opaqueDeallocator = nullptr; + } + + ~FutureOpaqueHolder() { + if (_opaqueDeallocator) { + _opaqueDeallocator(_opaque); + } + } + + FutureOpaqueHolder &operator=(const FutureOpaqueHolder &other) = delete; + FutureOpaqueHolder &operator=(FutureOpaqueHolder &&other) { + if (_opaqueDeallocator) { + _opaqueDeallocator(_opaque); + } + + _opaque = other._opaque; + _opaqueDeallocator = other._opaqueDeallocator; + + other._opaque = nullptr; + other._opaqueDeallocator = nullptr; + + return *this; + } + + void *getOpaque() const { return _opaque; } + +private: + void *_opaque; + djinni_opaque_deallocator _opaqueDeallocator; +}; + +} // namespace djinni::c_api + +using namespace djinni; +using namespace djinni::c_api; + +djinni_promise_ref djinni_promise_new() { return toC(new PromiseHolder()); } + +void djinni_promise_resolve(djinni_promise_ref promise, djinni_ref value) { + fromC(promise)->getPromise().setValue(Ref(value)); +} + +void djinni_promise_reject(djinni_promise_ref promise, djinni_ref error) { + fromC(promise)->getPromise().setException( + FutureException(error)); +} + +djinni_future_ref djinni_promise_get_future(djinni_promise_ref promise) { + return toC(new FutureHolder( + fromC(promise)->getPromise().getFuture())); +} + +void djinni_future_on_complete(djinni_future_ref future, void *opaque, + djinni_opaque_deallocator opaque_deallocator, + djinni_future_callback callback) { + fromC(future)->getFuture().then( + [opaqueHolder = FutureOpaqueHolder(opaque, opaque_deallocator), + callback](auto completedFuture) { + try { + auto ref = completedFuture.get(); + callback(opaqueHolder.getOpaque(), ref.get(), nullptr); + } catch (const std::exception &exc) { + const auto *what = exc.what(); + auto errorMessage = Ref(djinni_string_new(what, strlen(what))); + callback(opaqueHolder.getOpaque(), nullptr, errorMessage.get()); + } + }); +} diff --git a/support-lib/cpp/Future_c_translator.cpp b/support-lib/cpp/Future_c_translator.cpp new file mode 100644 index 00000000..f9914e18 --- /dev/null +++ b/support-lib/cpp/Future_c_translator.cpp @@ -0,0 +1,12 @@ +#include "Future_c_translator.hpp" + +namespace djinni::c_api { + +FutureException::FutureException(djinni_string_ref error) : _error(error) {} +FutureException::~FutureException() = default; + +const char *FutureException::what() const noexcept { + return djinni_string_get_data(_error.get()); +} + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/Future_c_translator.hpp b/support-lib/cpp/Future_c_translator.hpp index 1e47f61e..f4328e9b 100644 --- a/support-lib/cpp/Future_c_translator.hpp +++ b/support-lib/cpp/Future_c_translator.hpp @@ -1,42 +1,78 @@ #pragma once #include "Future.hpp" +#include "djinni_c_ref.hpp" #include "djinni_c_types.hpp" #include "future_c.h" -namespace djinni { -template class FutureHolder : public Object { +namespace djinni::c_api { + +class FutureException : public std::exception { public: - FutureHolder(Future future) : _future(std::move(future)) {} - ~FutureHolder() override = default; + FutureException(djinni_string_ref error); + ~FutureException() override; - Future &getFuture() { return _future; } + const char *what() const noexcept override; private: - Future _future; + Ref _error; }; -} // namespace djinni - -namespace djinni::c_api { template struct FutureTranslator { using CppType = ::djinni::Future; using CType = djinni_future_ref; + static void deallocatePromise(void *opaque) { + delete reinterpret_cast<::djinni::Promise *>(opaque); + } + + static void promiseCallback(void *opaque, djinni_ref value, + djinni_string_ref error) { + auto *promise = + reinterpret_cast<::djinni::Promise *>(opaque); + + if (error) { + promise->setException(FutureException(error)); + } else { + if constexpr (std::is_void_v) { + promise->setValue(); + } else { + promise->setValue(Tr::toCpp(value)); + } + } + } + static CppType toCpp(CType future) { - auto *futureHolder = - fromC<::djinni::FutureHolder>(future); + auto promise = new ::djinni::Promise(); - // Any way to make this better? + djinni_future_on_complete(future, promise, &deallocatePromise, + &promiseCallback); - return futureHolder->getFuture().then( - [](CppType value) { return value.get(); }); + return promise->getFuture(); } static CType fromCpp(CppType &&future) { - auto *futureHolder = new ::djinni::FutureHolder(std::move(future)); + auto promise = Ref(djinni_promise_new()); + + auto outputFuture = djinni_promise_get_future(promise.get()); + future.then([promise = std::move(promise)](auto future) { + try { + if constexpr (std::is_void_v) { + future.get(); + djinni_promise_resolve(promise.get(), nullptr); + } else { + auto convertedResult = Ref(Tr::fromCpp(future.get())); + djinni_promise_resolve(promise.get(), convertedResult.get()); + } + + } catch (const std::exception &exc) { + const auto *what = exc.what(); + auto errorMessage = Ref(djinni_string_new(what, strlen(what))); + djinni_promise_reject(promise.get(), errorMessage.get()); + } + }); - return toC(futureHolder); + return outputFuture; } }; diff --git a/support-lib/cpp/djinni_c_ref.hpp b/support-lib/cpp/djinni_c_ref.hpp new file mode 100644 index 00000000..662b07c2 --- /dev/null +++ b/support-lib/cpp/djinni_c_ref.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "djinni_c.h" + +namespace djinni::c_api { + +template class Ref { +public: + struct AdoptRef {}; + + Ref(T ref, AdoptRef adoptRef) : _ref(ref) {} + + Ref(T &&ref) : _ref(ref) {} + Ref(const T &ref) : _ref(ref) { djinni_ref_retain(_ref); } + + Ref(const Ref &other) : _ref(other._ref) { djinni_ref_retain(other._ref); } + + Ref(Ref &&other) : _ref(other._ref) { other._ref = nullptr; } + + ~Ref() { djinni_ref_release(_ref); } + + Ref &operator=(const Ref &other) { + if (&other != this) { + auto old = _ref; + _ref = other._ref; + + djinni_ref_retain(_ref); + djinni_ref_release(old); + } + return *this; + } + + Ref &operator=(Ref &&other) { + if (&other != this) { + auto old = _ref; + _ref = other._ref; + other._ref = nullptr; + + djinni_ref_release(old); + } + return *this; + } + + T get() const { return _ref; } + +private: + T _ref; +}; + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index be154de1..803b6326 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -114,8 +114,8 @@ template struct PrimitiveOptionalTranslator { } }; -template struct OptionalTranslator { - using CppType = Opt; +template struct OptionalTranslator { + using CppType = CppOpt; using CType = djinni_ref; static CType fromCpp(const CppType &value) { diff --git a/support-lib/cpp/future_c.h b/support-lib/cpp/future_c.h index 66639932..3af09015 100644 --- a/support-lib/cpp/future_c.h +++ b/support-lib/cpp/future_c.h @@ -1,10 +1,26 @@ #pragma once +#include "djinni_c.h" + #ifdef __cplusplus extern "C" { #endif // __cplusplus -typedef void *djinni_future_ref; +typedef djinni_ref djinni_future_ref; +typedef djinni_ref djinni_promise_ref; + +typedef void (*djinni_future_callback)(void *opaque, djinni_ref value, + djinni_string_ref error); + +djinni_promise_ref djinni_promise_new(); +void djinni_promise_resolve(djinni_promise_ref promise, djinni_ref value); +void djinni_promise_reject(djinni_promise_ref promise, djinni_string_ref error); + +djinni_future_ref djinni_promise_get_future(djinni_promise_ref promise); + +void djinni_future_on_complete(djinni_future_ref future, void *opaque, + djinni_opaque_deallocator opaque_deallocator, + djinni_future_callback callback); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index a33a84df..6d29beaf 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -1,4 +1,5 @@ #include "DataRefTest.h" +#include "Future.hpp" #include "assorted_primitives.h" #include "client_interface.h" #include "client_returned_record.h" @@ -545,4 +546,109 @@ TEST(DjinniCAPI, supportsOutcome) { ASSERT_EQ(42, djinni_number_get_int64(error.value)); } +static void futureIntCallback(void *opaque, djinni_ref value, + djinni_ref error) { + auto result = djinni_number_get_int64(value); + reinterpret_cast<::djinni::Promise *>(opaque)->setValue( + static_cast(result)); +} + +TEST(DjinniCAPI, supportsFuture) { + auto future = CRef(testsuite_test_helpers_get_async_result()); + + ::djinni::Promise promise; + + djinni_future_on_complete(future.value, reinterpret_cast(&promise), + nullptr, &futureIntCallback); + + auto cppFuture = promise.getFuture(); + auto result = cppFuture.get(); + + ASSERT_EQ(42, result); +} + +struct FutureCallbackResult { + djinni_ref value = nullptr; + djinni_string_ref error = nullptr; + bool completed = false; + + ~FutureCallbackResult() { + djinni_ref_release(value); + djinni_ref_release(error); + } +}; + +static void futureCallback(void *opaque, djinni_ref value, djinni_ref error) { + auto result = reinterpret_cast(opaque); + result->value = value; + result->error = error; + result->completed = true; + djinni_ref_retain(value); + djinni_ref_retain(error); +} + +TEST(DjinniCAPI, supportsFutureCreatedFromC) { + auto promise = CRef(djinni_promise_new()); + auto future = CRef(djinni_promise_get_future(promise.value)); + + auto newFuture = CRef(testsuite_test_helpers_future_roundtrip(future.value)); + + FutureCallbackResult result; + djinni_future_on_complete(newFuture.value, &result, nullptr, &futureCallback); + + ASSERT_FALSE(result.completed); + ASSERT_FALSE(result.value != nullptr); + + auto intResult = CRef(djinni_number_int64_new(42)); + + djinni_promise_resolve(promise.value, intResult.value); + + ASSERT_TRUE(result.completed); + ASSERT_TRUE(result.value != nullptr); + + ASSERT_EQ(std::string("42"), + std::string(djinni_string_get_data(result.value))); +} + +TEST(DjinniCAPI, supportsVoidFuture) { + auto promise = CRef(djinni_promise_new()); + auto future = CRef(djinni_promise_get_future(promise.value)); + + auto newFuture = CRef(testsuite_test_helpers_void_async_method(future.value)); + + FutureCallbackResult result; + djinni_future_on_complete(newFuture.value, &result, nullptr, &futureCallback); + + ASSERT_FALSE(result.completed); + + djinni_promise_resolve(promise.value, nullptr); + + ASSERT_TRUE(result.completed); + ASSERT_TRUE(result.value == nullptr); + ASSERT_TRUE(result.error == nullptr); +} + +TEST(DjinniCAPI, supportsPropagatingErrorInFuture) { + auto promise = CRef(djinni_promise_new()); + auto future = CRef(djinni_promise_get_future(promise.value)); + + auto newFuture = CRef(testsuite_test_helpers_void_async_method(future.value)); + + FutureCallbackResult result; + djinni_future_on_complete(newFuture.value, &result, nullptr, &futureCallback); + + ASSERT_FALSE(result.completed); + + auto errorString = CRef(djinni_string_new("Error", 5)); + + djinni_promise_reject(promise.value, errorString.value); + + ASSERT_TRUE(result.completed); + ASSERT_TRUE(result.value == nullptr); + ASSERT_TRUE(result.error != nullptr); + + ASSERT_EQ(std::string("Error"), + std::string(djinni_string_get_data(result.error))); +} + } // namespace djinni \ No newline at end of file From de7d185ed12869acab92b944960afdb13f82b825 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 14:06:10 -0500 Subject: [PATCH 32/42] address comments --- support-lib/cpp/djinni_c_types.cpp | 33 ++++++++++++------------------ 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp index a09bb31b..71923c61 100644 --- a/support-lib/cpp/djinni_c_types.cpp +++ b/support-lib/cpp/djinni_c_types.cpp @@ -8,26 +8,25 @@ constexpr size_t alignUp(size_t size, size_t alignment) { } template struct ArrayAllocator { - template T *allocate(size_t size, Args &&...args) { - std::allocator allocator; - + template static T *allocate(size_t size, Args &&...args) { auto allocSize = alignUp(sizeof(T), alignof(ValueType)) + (sizeof(ValueType) * size); - auto *arrayRegion = allocator.allocate(allocSize); + auto *arrayRegion = ::operator new(allocSize); new (arrayRegion)(T)(std::forward(args)...); return reinterpret_cast(arrayRegion); } - constexpr inline ValueType *getContainerStartPtr(T *object) { + constexpr inline static ValueType *getContainerStartPtr(T *object) { return reinterpret_cast( reinterpret_cast(object) + alignUp(sizeof(T), alignof(ValueType))); } - constexpr inline const ValueType *getContainerStartPtr(const T *object) { + constexpr inline static const ValueType * + getContainerStartPtr(const T *object) { return reinterpret_cast( reinterpret_cast(object) + alignUp(sizeof(T), alignof(ValueType))); @@ -64,16 +63,14 @@ String::String(size_t length) : _length(length) {} String::~String() = default; const char *String::data() const { - StringAllocator allocator; - return allocator.getContainerStartPtr(this); + return StringAllocator::getContainerStartPtr(this); } size_t String::String::length() const { return _length; } String *String::make(const char *str, size_t length) { - StringAllocator allocator; - auto *output = allocator.allocate(length, length); - auto *data = allocator.getContainerStartPtr(output); + auto *output = StringAllocator::allocate(length, length); + auto *data = StringAllocator::getContainerStartPtr(output); for (size_t i = 0; i < length; i++) { data[i] = str[i]; } @@ -87,8 +84,7 @@ using ObjectArrayAllocator = ArrayAllocator; ObjectArray::ObjectArray(size_t length) : _length(length) {} ObjectArray::~ObjectArray() { - ObjectArrayAllocator allocator; - auto **data = allocator.getContainerStartPtr(this); + auto **data = ObjectArrayAllocator::getContainerStartPtr(this); for (size_t i = 0; i < _length; i++) { Object::release(data[i]); } @@ -97,16 +93,14 @@ ObjectArray::~ObjectArray() { size_t ObjectArray::length() const { return _length; } Object *ObjectArray::getObjectAtIndex(size_t index) const { - ObjectArrayAllocator allocator; - Object *const *data = allocator.getContainerStartPtr(this); + Object *const *data = ObjectArrayAllocator::getContainerStartPtr(this); auto *object = data[index]; Object::retain(object); return object; } void ObjectArray::setObjectAtIndex(size_t index, Object *object) { - ObjectArrayAllocator allocator; - Object **data = allocator.getContainerStartPtr(this); + Object **data = ObjectArrayAllocator::getContainerStartPtr(this); Object::retain(object); Object::release(data[index]); @@ -114,10 +108,9 @@ void ObjectArray::setObjectAtIndex(size_t index, Object *object) { } ObjectArray *ObjectArray::make(size_t length) { - ObjectArrayAllocator allocator; - auto *output = allocator.allocate(length, length); + auto *output = ObjectArrayAllocator::allocate(length, length); - std::memset(allocator.getContainerStartPtr(output), 0, length); + std::memset(ObjectArrayAllocator::getContainerStartPtr(output), 0, length); return output; } From c3eb7d7b346d5623235c152a653ab242c586ba0d Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 14:44:17 -0500 Subject: [PATCH 33/42] using ref to make it exception safe --- src/source/CGenerator.scala | 38 ++++++++++++++---------- support-lib/cpp/djinni_c_translators.hpp | 1 + 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index 6b743d7c..ebe80069 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -203,10 +203,6 @@ class CGenerator(spec: Spec) extends Generator(spec) { return resolvedField.field.ident.name + "_c" } - private def getReturnNameCpp(name: String): String = { - return name + "_cpp" - } - private def writeProxyClass(w: IndentWriter, ident: Ident, methodDefsStructName: String, resolvedMethods: Seq[ResolvedMethod]): String = { val baseProxyClassName = "Proxy_Parent" w.wl(s"using ${baseProxyClassName} = ::djinni::Proxy<${methodDefsStructName}>;") @@ -232,35 +228,45 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.braced { for (param <- resolvedMethod.parameters) { val resolvedExpr = cppMarshal.maybeMove(param.field.ident.name, param.field.ty) - w.wl(s"auto ${getConvertedParamName(param)} = ${param.translator.fromCpp(resolvedExpr)};") + + if (param.translator.isRefType) { + w.wl(s"auto ${getConvertedParamName(param)} = ::djinni::c_api::Ref(${param.translator.fromCpp(resolvedExpr)});") + } else { + w.wl(s"auto ${getConvertedParamName(param)} = ${param.translator.fromCpp(resolvedExpr)};") + } } val retValueName = "returnValue" val needsReturnValue = resolvedMethod.retTypename != "void" if (needsReturnValue) { w.w(s"auto ${retValueName} = ") + + if (resolvedMethod.returnType.get.isRefType) { + w.w("::djinni::c_api::Ref(") + } } w.w(s"${baseProxyClassName}::getProxyClass().methodDefs().${resolvedMethod.method.ident.name}(${baseProxyClassName}::getOpaque()") if (resolvedMethod.parameters.nonEmpty) { w.w(", ") - w.w(resolvedMethod.parameters.map(p => getConvertedParamName(p)).mkString(", ")) - } - w.wl(");") - - for (param <- resolvedMethod.parameters) { - if (param.translator.isRefType) { - w.wl(s"djinni_ref_release(${getConvertedParamName(param)});") - } + w.w(resolvedMethod.parameters.map(p => if (p.translator.isRefType) getConvertedParamName(p) + ".get()" else getConvertedParamName(p)).mkString(", ")) } if (needsReturnValue) { + if (resolvedMethod.returnType.get.isRefType) { + w.w("));") + } else { + w.wl(");") + } w.wl - w.wl(s"auto ${getReturnNameCpp(retValueName)} = ${resolvedMethod.returnType.get.toCpp(retValueName)};") + if (resolvedMethod.returnType.get.isRefType) { - w.wl(s"djinni_ref_release(${retValueName});") + w.wl(s"return ${resolvedMethod.returnType.get.toCpp(retValueName + ".get()")};") + } else { + w.wl(s"return ${resolvedMethod.returnType.get.toCpp(retValueName)};") } - w.wl(s"return ${getReturnNameCpp(retValueName)};") + } else { + w.wl(");") } } diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index 803b6326..0fa6c241 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -2,6 +2,7 @@ #include "djinni_c.h" #include "djinni_c_types.hpp" +#include "djinni_c_ref.hpp" #include #include #include From 0ac7191eff71a5de3b16d45d494795b6fe0bb5e1 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 15:27:05 -0500 Subject: [PATCH 34/42] support for handlong c++ exceptions at the c level --- src/source/CGenerator.scala | 6 +- src/source/CTypeResolver.scala | 3 +- support-lib/cpp/djinni_c.cpp | 55 +++++++++++++++++++ support-lib/cpp/djinni_c.h | 34 +++++++----- support-lib/cpp/djinni_c_translators.hpp | 14 ++++- .../c/tests/DjinniCAPI_tests.cpp | 46 ++++++++++------ 6 files changed, 126 insertions(+), 32 deletions(-) diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala index ebe80069..e7002e48 100644 --- a/src/source/CGenerator.scala +++ b/src/source/CGenerator.scala @@ -373,7 +373,8 @@ class CGenerator(spec: Spec) extends Generator(spec) { w.wl(")") w.braced { - val needsReturnValue = resolvedMethod.retTypename != "void" + w.wl("DJINNI_HANDLE_EXCEPTION_PROLOGUE") + val needsReturnValue = resolvedMethod.retTypename != "void" if (needsReturnValue) { w.w(s"auto retValue = ") @@ -395,6 +396,9 @@ class CGenerator(spec: Spec) extends Generator(spec) { if (needsReturnValue) { w.wl(s"""return ${resolvedMethod.returnType.get.fromCpp("std::move(retValue)")};""") } + + w.wl(s"DJINNI_HANDLE_EXCEPTION_EPILOGUE(${resolvedMethod.retTypename})") + } w.wl diff --git a/src/source/CTypeResolver.scala b/src/source/CTypeResolver.scala index 6c1f839f..2bcc41c2 100644 --- a/src/source/CTypeResolver.scala +++ b/src/source/CTypeResolver.scala @@ -82,7 +82,8 @@ class CTypeResolver(val ident: Ident, val spec: Spec, val cppMarshal: CppMarshal val cppOptionalTemplate = cppMarshal.fqTypename(parent) if (primitive != null && !asBoxed) { - val typename = s"djinni_optional_${resolved.typename}" + val resolvedTypename = if (resolved.typename.endsWith("_t")) resolved.typename.substring(0, resolved.typename.length - 2) else resolved.typename + val typename = s"djinni_optional_${resolvedTypename}" new CTypeTranslator( typename, diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index b3cfd573..a4564022 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -1,5 +1,6 @@ #include "djinni_c.h" #include "djinni_c_types.hpp" +#include using namespace djinni; @@ -139,4 +140,58 @@ djinni_date_ref djinni_date_new(uint64_t epoch_time_ms) { uint64_t djinni_date_get_epoch(djinni_date_ref date) { return djinni_number_get_uint64(date); +} + +namespace djinni::c_api { + +struct ExceptionHandler { + void *opaque; + djinni_exception_handler handler; + + ExceptionHandler(void *opaque, djinni_exception_handler handler) + : opaque(opaque), handler(handler) {} + + static void push(void *opaque, djinni_exception_handler handler) { + exceptionHandlers.emplace_back(opaque, handler); + } + + static void pop() { + if (exceptionHandlers.empty()) { + std::fprintf(stderr, "Unbalanced djinni_exception_handler_push and " + "djinni_exception_handler_pop calls"); + std::abort(); + } + + exceptionHandlers.pop_back(); + } + + static void notify(const char *error) { + if (exceptionHandlers.empty()) { + std::fprintf(stderr, + "No exception handler registered with " + "djinni_exception_handler_push to handle error: %s", + error); + std::abort(); + } + + auto handler = exceptionHandlers.back(); + handler.handler(handler.opaque, error); + } + +private: + static thread_local std::vector exceptionHandlers; +}; + +thread_local std::vector ExceptionHandler::exceptionHandlers; + +} // namespace djinni::c_api + +void djinni_exception_handler_push(void *opaque, + djinni_exception_handler handler) { + djinni::c_api::ExceptionHandler::push(opaque, handler); +} +void djinni_exception_handler_pop() { djinni::c_api::ExceptionHandler::pop(); } + +void djinni_exception_notify(const char *error) { + djinni::c_api::ExceptionHandler::notify(error); } \ No newline at end of file diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index c7931c4b..35d48cd7 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -23,6 +23,8 @@ typedef djinni_ref djinni_proxy_class_ref; typedef void (*djinni_binary_deallocator)(uint8_t *, size_t, void *); typedef void (*djinni_opaque_deallocator)(void *); +typedef void (*djinni_exception_handler)(void *, const char *); + void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); @@ -73,33 +75,39 @@ void djinni_array_set_value(djinni_array_ref array, size_t index, djinni_date_ref djinni_date_new(uint64_t epoch_time_ms); uint64_t djinni_date_get_epoch(djinni_date_ref date); -#define DJINNI_OPTIONAL_PRIMITIVE(__type__) \ +void djinni_exception_handler_push(void *opaque, + djinni_exception_handler handler); +void djinni_exception_handler_pop(); + +void djinni_exception_notify(const char *error); + +#define DJINNI_OPTIONAL_PRIMITIVE(__name__, __type__) \ typedef struct { \ __type__ value; \ bool has_value; \ - } djinni_optional_##__type__; \ + } djinni_optional_##__name__; \ \ - inline djinni_optional_##__type__ djinni_optional_##__type__##_make( \ + inline djinni_optional_##__name__ djinni_optional_##__name__##_make( \ __type__ value) { \ - djinni_optional_##__type__ output; \ + djinni_optional_##__name__ output; \ output.value = value; \ output.has_value = true; \ return output; \ } \ - inline djinni_optional_##__type__ djinni_optional_##__type__##_empty() { \ - djinni_optional_##__type__ output; \ + inline djinni_optional_##__name__ djinni_optional_##__name__##_empty() { \ + djinni_optional_##__name__ output; \ output.value = 0; \ output.has_value = false; \ return output; \ } -DJINNI_OPTIONAL_PRIMITIVE(bool); -DJINNI_OPTIONAL_PRIMITIVE(int8_t); -DJINNI_OPTIONAL_PRIMITIVE(int16_t); -DJINNI_OPTIONAL_PRIMITIVE(int32_t); -DJINNI_OPTIONAL_PRIMITIVE(int64_t); -DJINNI_OPTIONAL_PRIMITIVE(float); -DJINNI_OPTIONAL_PRIMITIVE(double); +DJINNI_OPTIONAL_PRIMITIVE(bool, bool); +DJINNI_OPTIONAL_PRIMITIVE(int8, int8_t); +DJINNI_OPTIONAL_PRIMITIVE(int16, int16_t); +DJINNI_OPTIONAL_PRIMITIVE(int32, int32_t); +DJINNI_OPTIONAL_PRIMITIVE(int64, int64_t); +DJINNI_OPTIONAL_PRIMITIVE(float, float); +DJINNI_OPTIONAL_PRIMITIVE(double, double); #ifdef __cplusplus } // extern "C" diff --git a/support-lib/cpp/djinni_c_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp index 0fa6c241..b6ad7b7b 100644 --- a/support-lib/cpp/djinni_c_translators.hpp +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -1,8 +1,8 @@ #pragma once #include "djinni_c.h" -#include "djinni_c_types.hpp" #include "djinni_c_ref.hpp" +#include "djinni_c_types.hpp" #include #include #include @@ -392,4 +392,16 @@ template struct ProtobufTranslator { } }; +template T getNullValue() { return T{}; } + +#define DJINNI_HANDLE_EXCEPTION_PROLOGUE try { +#define DJINNI_HANDLE_EXCEPTION_EPILOGUE(__ret_type__) \ + } \ + catch (const std::exception &exc) { \ + djinni_exception_notify(exc.what()); \ + if constexpr (!std::is_void_v<__ret_type__>) { \ + return ::djinni::c_api::getNullValue<__ret_type__>(); \ + } \ + } + } // namespace djinni::c_api \ No newline at end of file diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 6d29beaf..58384da4 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -25,9 +25,9 @@ template struct CRef { TEST(DjinniCAPI, supportsPrimitiveValues) { auto primitives = CRef(testsuite_assorted_primitives_new( true, 8, 4242, 3000000, 99999999999, 32.5f, 6482000.5, - djinni_optional_bool_empty(), djinni_optional_int8_t_empty(), - djinni_optional_int16_t_empty(), djinni_optional_int32_t_empty(), - djinni_optional_int64_t_empty(), djinni_optional_float_empty(), + djinni_optional_bool_empty(), djinni_optional_int8_empty(), + djinni_optional_int16_empty(), djinni_optional_int32_empty(), + djinni_optional_int64_empty(), djinni_optional_float_empty(), djinni_optional_double_empty())); ASSERT_TRUE(testsuite_assorted_primitives_get_b(primitives.value)); @@ -70,8 +70,8 @@ TEST(DjinniCAPI, supportsPrimitiveValues) { TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { auto primitives = CRef(testsuite_assorted_primitives_new( false, 0, 0, 0, 0, 0.0f, 0.0, djinni_optional_bool_make(true), - djinni_optional_int8_t_make(8), djinni_optional_int16_t_make(16), - djinni_optional_int32_t_make(4242), djinni_optional_int64_t_make(3000000), + djinni_optional_int8_make(8), djinni_optional_int16_make(16), + djinni_optional_int32_make(4242), djinni_optional_int64_make(3000000), djinni_optional_float_make(32.5f), djinni_optional_double_make(6482000.5))); @@ -98,14 +98,14 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { testsuite_assorted_primitives_get_o_eight(primitives.value).value); testsuite_assorted_primitives_set_o_eight(primitives.value, - djinni_optional_int8_t_make(16)); + djinni_optional_int8_make(16)); ASSERT_TRUE( testsuite_assorted_primitives_get_o_eight(primitives.value).has_value); ASSERT_EQ(16, testsuite_assorted_primitives_get_o_eight(primitives.value).value); testsuite_assorted_primitives_set_o_eight(primitives.value, - djinni_optional_int8_t_empty()); + djinni_optional_int8_empty()); ASSERT_FALSE( testsuite_assorted_primitives_get_o_eight(primitives.value).has_value); ASSERT_EQ(0, @@ -117,8 +117,8 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { ASSERT_EQ( 16, testsuite_assorted_primitives_get_o_sixteen(primitives.value).value); - testsuite_assorted_primitives_set_o_sixteen( - primitives.value, djinni_optional_int16_t_make(4343)); + testsuite_assorted_primitives_set_o_sixteen(primitives.value, + djinni_optional_int16_make(4343)); ASSERT_TRUE( testsuite_assorted_primitives_get_o_sixteen(primitives.value).has_value); ASSERT_EQ( @@ -126,7 +126,7 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { testsuite_assorted_primitives_get_o_sixteen(primitives.value).value); testsuite_assorted_primitives_set_o_sixteen(primitives.value, - djinni_optional_int16_t_empty()); + djinni_optional_int16_empty()); ASSERT_FALSE( testsuite_assorted_primitives_get_o_sixteen(primitives.value).has_value); @@ -138,15 +138,15 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { testsuite_assorted_primitives_get_o_thirtytwo(primitives.value).value); testsuite_assorted_primitives_set_o_thirtytwo( - primitives.value, djinni_optional_int32_t_make(6000000)); + primitives.value, djinni_optional_int32_make(6000000)); ASSERT_TRUE(testsuite_assorted_primitives_get_o_thirtytwo(primitives.value) .has_value); ASSERT_EQ( 6000000, testsuite_assorted_primitives_get_o_thirtytwo(primitives.value).value); - testsuite_assorted_primitives_set_o_thirtytwo( - primitives.value, djinni_optional_int32_t_empty()); + testsuite_assorted_primitives_set_o_thirtytwo(primitives.value, + djinni_optional_int32_empty()); ASSERT_FALSE(testsuite_assorted_primitives_get_o_thirtytwo(primitives.value) .has_value); @@ -158,15 +158,15 @@ TEST(DjinniCAPI, supportsOptionalPrimitiveValues) { testsuite_assorted_primitives_get_o_sixtyfour(primitives.value).value); testsuite_assorted_primitives_set_o_sixtyfour( - primitives.value, djinni_optional_int64_t_make(999999999990)); + primitives.value, djinni_optional_int64_make(999999999990)); ASSERT_TRUE(testsuite_assorted_primitives_get_o_sixtyfour(primitives.value) .has_value); ASSERT_EQ( 999999999990, testsuite_assorted_primitives_get_o_sixtyfour(primitives.value).value); - testsuite_assorted_primitives_set_o_sixtyfour( - primitives.value, djinni_optional_int64_t_empty()); + testsuite_assorted_primitives_set_o_sixtyfour(primitives.value, + djinni_optional_int64_empty()); ASSERT_FALSE(testsuite_assorted_primitives_get_o_sixtyfour(primitives.value) .has_value); @@ -546,6 +546,20 @@ TEST(DjinniCAPI, supportsOutcome) { ASSERT_EQ(42, djinni_number_get_int64(error.value)); } +static void handleException(void *opaque, const char *message) { + *reinterpret_cast(opaque) = std::string(message); +} + +TEST(DjinniCAPI, canCatchExceptions) { + std::string errorMessage; + + djinni_exception_handler_push(&errorMessage, &handleException); + auto result = CRef(testsuite_test_helpers_async_early_throw()); + djinni_exception_handler_pop(); + + ASSERT_EQ(std::string("error"), errorMessage); +} + static void futureIntCallback(void *opaque, djinni_ref value, djinni_ref error) { auto result = djinni_number_get_int64(value); From 0ccae62208d4c780d0e5cae691f564e10a5cfb53 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 15:29:36 -0500 Subject: [PATCH 35/42] regen --- test-suite/generated-src/c/Conflict.cpp | 16 -- test-suite/generated-src/c/Conflict.h | 10 -- test-suite/generated-src/c/DataRefTest.cpp | 96 +++--------- test-suite/generated-src/c/DataRefTest.h | 18 --- .../generated-src/c/_varname_interface_.cpp | 40 +---- .../generated-src/c/_varname_interface_.h | 11 -- .../generated-src/c/assorted_primitives.cpp | 48 +++--- .../generated-src/c/assorted_primitives.h | 18 +-- .../generated-src/c/async_interface.cpp | 20 ++- .../generated-src/c/client_interface.cpp | 66 ++++---- .../c/client_returned_record.cpp | 6 +- test-suite/generated-src/c/conflict_user.cpp | 39 +---- test-suite/generated-src/c/conflict_user.h | 11 -- .../c/constant_interface_with_enum.cpp | 16 -- .../c/constant_interface_with_enum.h | 10 -- .../generated-src/c/constants_interface.cpp | 22 +-- .../generated-src/c/constants_interface.h | 10 -- test-suite/generated-src/c/cpp_exception.cpp | 50 +----- test-suite/generated-src/c/cpp_exception.h | 13 -- .../generated-src/c/enum_usage_interface.cpp | 90 +++-------- .../generated-src/c/enum_usage_interface.h | 14 -- .../generated-src/c/enum_usage_record.cpp | 18 +-- test-suite/generated-src/c/first_listener.cpp | 22 +-- test-suite/generated-src/c/first_listener.h | 10 -- test-suite/generated-src/c/flag_roundtrip.cpp | 32 ++-- test-suite/generated-src/c/flag_roundtrip.h | 13 -- .../c/interface_using_extended_record.cpp | 28 +--- .../c/interface_using_extended_record.h | 10 -- .../generated-src/c/java_only_listener.cpp | 16 -- .../generated-src/c/java_only_listener.h | 10 -- .../generated-src/c/listener_caller.cpp | 30 +--- test-suite/generated-src/c/listener_caller.h | 12 -- .../generated-src/c/map_date_record.cpp | 6 +- .../generated-src/c/map_list_record.cpp | 6 +- test-suite/generated-src/c/map_record.cpp | 10 +- .../generated-src/c/nested_collection.cpp | 6 +- test-suite/generated-src/c/nested_outcome.cpp | 6 +- .../generated-src/c/objc_only_listener.cpp | 16 -- .../generated-src/c/objc_only_listener.h | 10 -- test-suite/generated-src/c/primitive_list.cpp | 10 +- test-suite/generated-src/c/proto_tests.cpp | 60 ++++--- test-suite/generated-src/c/proto_tests.h | 22 --- test-suite/generated-src/c/return_one.cpp | 27 +--- test-suite/generated-src/c/return_one.h | 11 -- test-suite/generated-src/c/return_two.cpp | 27 +--- test-suite/generated-src/c/return_two.h | 11 -- .../c/reverse_client_interface.cpp | 54 ++----- .../c/reverse_client_interface.h | 13 -- .../generated-src/c/sample_interface.cpp | 16 -- test-suite/generated-src/c/sample_interface.h | 10 -- .../generated-src/c/second_listener.cpp | 22 +-- test-suite/generated-src/c/second_listener.h | 10 -- test-suite/generated-src/c/set_record.cpp | 10 +- test-suite/generated-src/c/test_array.cpp | 40 ++--- test-suite/generated-src/c/test_array.h | 13 -- test-suite/generated-src/c/test_duration.cpp | 60 ++++--- test-suite/generated-src/c/test_duration.h | 29 ---- test-suite/generated-src/c/test_helpers.cpp | 148 +++++++++++++----- test-suite/generated-src/c/test_helpers.h | 50 +----- test-suite/generated-src/c/test_outcome.cpp | 40 ++--- test-suite/generated-src/c/test_outcome.h | 17 -- .../c/test_static_method_language.cpp | 18 +-- .../c/test_static_method_language.h | 10 -- .../generated-src/c/throwing_interface.cpp | 22 +-- .../generated-src/c/throwing_interface.h | 10 -- test-suite/generated-src/c/user_token.cpp | 13 +- .../c/uses_single_language_listeners.cpp | 52 +----- .../c/uses_single_language_listeners.h | 13 -- 68 files changed, 443 insertions(+), 1280 deletions(-) diff --git a/test-suite/generated-src/c/Conflict.cpp b/test-suite/generated-src/c/Conflict.cpp index eae91fe7..6de03fc4 100644 --- a/test-suite/generated-src/c/Conflict.cpp +++ b/test-suite/generated-src/c/Conflict.cpp @@ -5,20 +5,4 @@ #include "djinni_c_translators.hpp" #include "Conflict.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct Conflict_Proxy: public Proxy_Parent, public ::testsuite::Conflict { - Conflict_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~Conflict_Proxy() override = default; - -}; - -testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - diff --git a/test-suite/generated-src/c/Conflict.h b/test-suite/generated-src/c/Conflict.h index f7b185a9..c4a20586 100644 --- a/test-suite/generated-src/c/Conflict.h +++ b/test-suite/generated-src/c/Conflict.h @@ -14,16 +14,6 @@ extern "C" { * See the comments about scopeSymbols in CppMarshal.scala for more info. */ typedef djinni_interface_ref testsuite_Conflict_ref; -typedef djinni_proxy_class_ref testsuite_Conflict_proxy_class_ref; - -typedef struct -{ - void *reserved[1]; -} testsuite_Conflict_method_defs; - -testsuite_Conflict_proxy_class_ref testsuite_Conflict_proxy_class_new(const testsuite_Conflict_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_Conflict_ref testsuite_Conflict_new(testsuite_Conflict_proxy_class_ref proxy_class, void *opaque); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/generated-src/c/DataRefTest.cpp b/test-suite/generated-src/c/DataRefTest.cpp index 4be80487..d59e4174 100644 --- a/test-suite/generated-src/c/DataRefTest.cpp +++ b/test-suite/generated-src/c/DataRefTest.cpp @@ -10,134 +10,74 @@ #include "DataView_c_translator.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct DataRefTest_Proxy: public Proxy_Parent, public ::testsuite::DataRefTest { - DataRefTest_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~DataRefTest_Proxy() override = default; - - void sendData(const ::djinni::DataRef & data) override { - auto data_c = ::djinni::c_api::DataRefTranslator::fromCpp(data); - Proxy_Parent::getProxyClass().methodDefs().sendData(Proxy_Parent::getOpaque(), data_c); - djinni_ref_release(data_c); - } - - std::vector retriveAsBin() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().retriveAsBin(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::BinaryTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - void sendMutableData(const ::djinni::DataRef & data) override { - auto data_c = ::djinni::c_api::DataRefTranslator::fromCpp(data); - Proxy_Parent::getProxyClass().methodDefs().sendMutableData(Proxy_Parent::getOpaque(), data_c); - djinni_ref_release(data_c); - } - - ::djinni::DataRef generateData() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().generateData(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - ::djinni::DataRef dataFromVec() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromVec(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - ::djinni::DataRef dataFromStr() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().dataFromStr(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::DataRefTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::vector sendDataView(const ::djinni::DataView & data) override { - auto data_c = ::djinni::c_api::DataViewTranslator::fromCpp(data); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().sendDataView(Proxy_Parent::getOpaque(), data_c); - djinni_ref_release(data_c); - - auto returnValue_cpp = ::djinni::c_api::BinaryTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - ::djinni::DataView recvDataView() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().recvDataView(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::DataViewTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendData(::djinni::c_api::DataRefTranslator::toCpp(data)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } djinni_binary_ref testsuite_DataRefTest_retriveAsBin(testsuite_DataRefTest_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->retriveAsBin(); return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } void testsuite_DataRefTest_sendMutableData(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendMutableData(::djinni::c_api::DataRefTranslator::toCpp(data)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } djinni_binary_ref testsuite_DataRefTest_generateData(testsuite_DataRefTest_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->generateData(); return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_binary_ref testsuite_DataRefTest_dataFromVec(testsuite_DataRefTest_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->dataFromVec(); return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_binary_ref testsuite_DataRefTest_dataFromStr(testsuite_DataRefTest_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->dataFromStr(); return ::djinni::c_api::DataRefTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_binary_ref testsuite_DataRefTest_sendDataView(testsuite_DataRefTest_ref instance, djinni_binary_ref data) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->sendDataView(::djinni::c_api::DataViewTranslator::toCpp(data)); return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_binary_ref testsuite_DataRefTest_recvDataView(testsuite_DataRefTest_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::toCpp(instance)->recvDataView(); return ::djinni::c_api::DataViewTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } testsuite_DataRefTest_ref testsuite_DataRefTest_create() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::DataRefTest::create(); return ::djinni::c_api::InterfaceTranslator<::testsuite::DataRefTest>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_DataRefTest_ref) } diff --git a/test-suite/generated-src/c/DataRefTest.h b/test-suite/generated-src/c/DataRefTest.h index 31c8b20c..4078d749 100644 --- a/test-suite/generated-src/c/DataRefTest.h +++ b/test-suite/generated-src/c/DataRefTest.h @@ -12,24 +12,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_DataRefTest_ref; -typedef djinni_proxy_class_ref testsuite_DataRefTest_proxy_class_ref; - -typedef struct -{ - void (*sendData)(void *, djinni_binary_ref); - djinni_binary_ref (*retriveAsBin)(void *); - void (*sendMutableData)(void *, djinni_binary_ref); - djinni_binary_ref (*generateData)(void *); - djinni_binary_ref (*dataFromVec)(void *); - djinni_binary_ref (*dataFromStr)(void *); - djinni_binary_ref (*sendDataView)(void *, djinni_binary_ref); - djinni_binary_ref (*recvDataView)(void *); - testsuite_DataRefTest_ref (*create)(void *); -} testsuite_DataRefTest_method_defs; - -testsuite_DataRefTest_proxy_class_ref testsuite_DataRefTest_proxy_class_new(const testsuite_DataRefTest_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_DataRefTest_ref testsuite_DataRefTest_new(testsuite_DataRefTest_proxy_class_ref proxy_class, void *opaque); void testsuite_DataRefTest_sendData(testsuite_DataRefTest_ref instance, djinni_binary_ref data); diff --git a/test-suite/generated-src/c/_varname_interface_.cpp b/test-suite/generated-src/c/_varname_interface_.cpp index 266843b1..4558ce01 100644 --- a/test-suite/generated-src/c/_varname_interface_.cpp +++ b/test-suite/generated-src/c/_varname_interface_.cpp @@ -7,42 +7,6 @@ #include "_varname_record_.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct VarnameInterface_Proxy: public Proxy_Parent, public ::testsuite::VarnameInterface { - VarnameInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~VarnameInterface_Proxy() override = default; - - ::testsuite::VarnameRecord _rmethod_(const ::testsuite::VarnameRecord & _r_arg_) override { - auto _r_arg__c = ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::fromCpp(_r_arg_); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._rmethod_(Proxy_Parent::getOpaque(), _r_arg__c); - djinni_ref_release(_r_arg__c); - - auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> _imethod_(const /*not-null*/ std::shared_ptr<::testsuite::VarnameInterface> & _i_arg_) override { - auto _i_arg__c = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::fromCpp(_i_arg_); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs()._imethod_(Proxy_Parent::getOpaque(), _i_arg__c); - djinni_ref_release(_i_arg__c); - - auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - /** * We should also rewrite parameter names in docstrings. * _r_arg_ should be rewritten. @@ -50,14 +14,18 @@ testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__v */ testsuite__varname_record__ref testsuite__varname_interface___rmethod_(testsuite__varname_interface__ref instance, testsuite__varname_record__ref _r_arg_) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(instance)->_rmethod_(::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::toCpp(_r_arg_)); return ::djinni::c_api::RecordTranslator<::testsuite::VarnameRecord>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite__varname_record__ref) } testsuite__varname_interface__ref testsuite__varname_interface___imethod_(testsuite__varname_interface__ref instance, testsuite__varname_interface__ref _i_arg_) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(instance)->_imethod_(::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::toCpp(_i_arg_)); return ::djinni::c_api::InterfaceTranslator<::testsuite::VarnameInterface>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite__varname_interface__ref) } diff --git a/test-suite/generated-src/c/_varname_interface_.h b/test-suite/generated-src/c/_varname_interface_.h index f7cce2e6..1fa11270 100644 --- a/test-suite/generated-src/c/_varname_interface_.h +++ b/test-suite/generated-src/c/_varname_interface_.h @@ -12,17 +12,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite__varname_interface__ref; -typedef djinni_proxy_class_ref testsuite__varname_interface__proxy_class_ref; - -typedef struct -{ - testsuite__varname_record__ref (*_rmethod_)(void *, testsuite__varname_record__ref); - testsuite__varname_interface__ref (*_imethod_)(void *, testsuite__varname_interface__ref); -} testsuite__varname_interface__method_defs; - -testsuite__varname_interface__proxy_class_ref testsuite__varname_interface__proxy_class_new(const testsuite__varname_interface__method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite__varname_interface__ref testsuite__varname_interface__new(testsuite__varname_interface__proxy_class_ref proxy_class, void *opaque); /** * We should also rewrite parameter names in docstrings. diff --git a/test-suite/generated-src/c/assorted_primitives.cpp b/test-suite/generated-src/c/assorted_primitives.cpp index 3b2e27b7..f76c0692 100644 --- a/test-suite/generated-src/c/assorted_primitives.cpp +++ b/test-suite/generated-src/c/assorted_primitives.cpp @@ -5,9 +5,9 @@ #include "djinni_c_translators.hpp" #include "assorted_primitives.hpp" -testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8_t o_eight, djinni_optional_int16_t o_sixteen, djinni_optional_int32_t o_thirtytwo, djinni_optional_int64_t o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour) +testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8 o_eight, djinni_optional_int16 o_sixteen, djinni_optional_int32 o_thirtytwo, djinni_optional_int64 o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour) { - return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::make(b, eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_bool>(o_b), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int8_t>(o_eight), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int16_t>(o_sixteen), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int32_t>(o_thirtytwo), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int64_t>(o_sixtyfour), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_float>(o_fthirtytwo), ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_double>(o_fsixtyfour)); + return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::make(b, eight, sixteen, thirtytwo, sixtyfour, fthirtytwo, fsixtyfour, ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_bool>::toCpp(o_b), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int8>::toCpp(o_eight), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int16>::toCpp(o_sixteen), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int32>::toCpp(o_thirtytwo), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int64>::toCpp(o_sixtyfour), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_float>::toCpp(o_fthirtytwo), ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_double>::toCpp(o_fsixtyfour)); } bool testsuite_assorted_primitives_get_b(testsuite_assorted_primitives_ref instance) @@ -82,72 +82,72 @@ void testsuite_assorted_primitives_set_fsixtyfour(testsuite_assorted_primitives_ djinni_optional_bool testsuite_assorted_primitives_get_o_b(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_bool>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_bool>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b); } void testsuite_assorted_primitives_set_o_b(testsuite_assorted_primitives_ref instance, djinni_optional_bool value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_bool>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_b = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_bool>::toCpp(value); } -djinni_optional_int8_t testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance) +djinni_optional_int8 testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int8_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int8>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight); } -void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8_t value) +void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8 value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int8_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int8>::toCpp(value); } -djinni_optional_int16_t testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance) +djinni_optional_int16 testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int16_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int16>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen); } -void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16_t value) +void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16 value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int16_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int16>::toCpp(value); } -djinni_optional_int32_t testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance) +djinni_optional_int32 testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int32_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int32>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo); } -void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32_t value) +void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32 value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int32_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int32>::toCpp(value); } -djinni_optional_int64_t testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance) +djinni_optional_int64 testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int64_t>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int64>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour); } -void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64_t value) +void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64 value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_int64_t>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixtyfour = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int64>::toCpp(value); } djinni_optional_float testsuite_assorted_primitives_get_o_fthirtytwo(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_float>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_float>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo); } void testsuite_assorted_primitives_set_o_fthirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_float value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_float>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fthirtytwo = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_float>::toCpp(value); } djinni_optional_double testsuite_assorted_primitives_get_o_fsixtyfour(testsuite_assorted_primitives_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_double>(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_double>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour); } void testsuite_assorted_primitives_set_o_fsixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_double value) { - ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour = ::djinni::c_api::OptionalTranslator::toCppPrimitive, djinni_optional_double>(value); + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_fsixtyfour = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_double>::toCpp(value); } diff --git a/test-suite/generated-src/c/assorted_primitives.h b/test-suite/generated-src/c/assorted_primitives.h index b5122ead..d5882311 100644 --- a/test-suite/generated-src/c/assorted_primitives.h +++ b/test-suite/generated-src/c/assorted_primitives.h @@ -11,7 +11,7 @@ extern "C" { typedef djinni_record_ref testsuite_assorted_primitives_ref; -testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8_t o_eight, djinni_optional_int16_t o_sixteen, djinni_optional_int32_t o_thirtytwo, djinni_optional_int64_t o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour); +testsuite_assorted_primitives_ref testsuite_assorted_primitives_new(bool b, int8_t eight, int16_t sixteen, int32_t thirtytwo, int64_t sixtyfour, float fthirtytwo, double fsixtyfour, djinni_optional_bool o_b, djinni_optional_int8 o_eight, djinni_optional_int16 o_sixteen, djinni_optional_int32 o_thirtytwo, djinni_optional_int64 o_sixtyfour, djinni_optional_float o_fthirtytwo, djinni_optional_double o_fsixtyfour); bool testsuite_assorted_primitives_get_b(testsuite_assorted_primitives_ref instance); void testsuite_assorted_primitives_set_b(testsuite_assorted_primitives_ref instance, bool value); @@ -36,17 +36,17 @@ void testsuite_assorted_primitives_set_fsixtyfour(testsuite_assorted_primitives_ djinni_optional_bool testsuite_assorted_primitives_get_o_b(testsuite_assorted_primitives_ref instance); void testsuite_assorted_primitives_set_o_b(testsuite_assorted_primitives_ref instance, djinni_optional_bool value); -djinni_optional_int8_t testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance); -void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8_t value); +djinni_optional_int8 testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_eight(testsuite_assorted_primitives_ref instance, djinni_optional_int8 value); -djinni_optional_int16_t testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance); -void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16_t value); +djinni_optional_int16 testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_sixteen(testsuite_assorted_primitives_ref instance, djinni_optional_int16 value); -djinni_optional_int32_t testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance); -void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32_t value); +djinni_optional_int32 testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_thirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_int32 value); -djinni_optional_int64_t testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance); -void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64_t value); +djinni_optional_int64 testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance); +void testsuite_assorted_primitives_set_o_sixtyfour(testsuite_assorted_primitives_ref instance, djinni_optional_int64 value); djinni_optional_float testsuite_assorted_primitives_get_o_fthirtytwo(testsuite_assorted_primitives_ref instance); void testsuite_assorted_primitives_set_o_fthirtytwo(testsuite_assorted_primitives_ref instance, djinni_optional_float value); diff --git a/test-suite/generated-src/c/async_interface.cpp b/test-suite/generated-src/c/async_interface.cpp index 383ee1dc..f124dbe1 100644 --- a/test-suite/generated-src/c/async_interface.cpp +++ b/test-suite/generated-src/c/async_interface.cpp @@ -14,29 +14,27 @@ struct AsyncInterface_Proxy: public Proxy_Parent, public ::testsuite::AsyncInter ~AsyncInterface_Proxy() override = default; ::djinni::Future future_roundtrip(::djinni::Future f) override { - auto f_c = ::djinni::c_api::FutureTranslator::fromCpp(std::move(f), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().future_roundtrip(Proxy_Parent::getOpaque(), f_c); - djinni_ref_release(f_c); - - auto returnValue_cpp = ::djinni::c_api::FutureTranslator::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto f_c = ::djinni::c_api::Ref(::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::fromCpp(std::move(f))); + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().future_roundtrip(Proxy_Parent::getOpaque(), f_c.get())); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::toCpp(returnValue.get()); } }; testsuite_async_interface_proxy_class_ref testsuite_async_interface_proxy_class_new(const testsuite_async_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::makeProxyClass(method_defs, opaque_deallocator); } testsuite_async_interface_ref testsuite_async_interface_new(testsuite_async_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::makeProxy(proxy_class, opaque); } djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(instance)->future_roundtrip(::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::toCpp(f)); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } diff --git a/test-suite/generated-src/c/client_interface.cpp b/test-suite/generated-src/c/client_interface.cpp index 2a577480..51367a73 100644 --- a/test-suite/generated-src/c/client_interface.cpp +++ b/test-suite/generated-src/c/client_interface.cpp @@ -15,95 +15,87 @@ struct ClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ClientInt ::testsuite::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional & misc) override { auto record_id_c = record_id; - auto utf8string_c = ::djinni::c_api::StringTranslator::fromCpp(utf8string); - auto misc_c = ::djinni::c_api::OptionalTranslator::fromCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().get_record(Proxy_Parent::getOpaque(), record_id_c, utf8string_c, misc_c); - djinni_ref_release(utf8string_c); - djinni_ref_release(misc_c); - - auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto utf8string_c = ::djinni::c_api::Ref(::djinni::c_api::StringTranslator::fromCpp(utf8string)); + auto misc_c = ::djinni::c_api::Ref(::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>::fromCpp(misc)); + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().get_record(Proxy_Parent::getOpaque(), record_id_c, utf8string_c.get(), misc_c.get())); + return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(returnValue.get()); } double identifier_check(const std::vector & data, int32_t r, int64_t jret) override { - auto data_c = ::djinni::c_api::BinaryTranslator::fromCpp(data); + auto data_c = ::djinni::c_api::Ref(::djinni::c_api::BinaryTranslator::fromCpp(data)); auto r_c = r; auto jret_c = jret; - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().identifier_check(Proxy_Parent::getOpaque(), data_c, r_c, jret_c); - djinni_ref_release(data_c); + auto returnValue = Proxy_Parent::getProxyClass().methodDefs().identifier_check(Proxy_Parent::getOpaque(), data_c.get(), r_c, jret_c); - auto returnValue_cpp = returnValue; - return returnValue_cpp; + return returnValue; } std::string return_str() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque())); + return ::djinni::c_api::StringTranslator::toCpp(returnValue.get()); } std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { - auto i_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::fromCpp(i); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); - djinni_ref_release(i_c); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto i_c = ::djinni::c_api::Ref(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::fromCpp(i)); + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c.get())); + return ::djinni::c_api::StringTranslator::toCpp(returnValue.get()); } std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ClientInterface> & i) override { - auto i_c = ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::fromCpp(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); - djinni_ref_release(i_c); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto i_c = ::djinni::c_api::Ref(::djinni::c_api::OptionalPtrTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>>::fromCpp(i)); + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c.get())); + return ::djinni::c_api::StringTranslator::toCpp(returnValue.get()); } }; testsuite_client_interface_proxy_class_ref testsuite_client_interface_proxy_class_new(const testsuite_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::makeProxyClass(method_defs, opaque_deallocator); } testsuite_client_interface_ref testsuite_client_interface_new(testsuite_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::makeProxy(proxy_class, opaque); } /** Returns record of given string */ testsuite_client_returned_record_ref testsuite_client_interface_get_record(testsuite_client_interface_ref instance, int64_t record_id, djinni_string_ref utf8string, djinni_string_ref misc) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->get_record(record_id, ::djinni::c_api::StringTranslator::toCpp(utf8string), ::djinni::c_api::OptionalTranslator::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->get_record(record_id, ::djinni::c_api::StringTranslator::toCpp(utf8string), ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>::toCpp(misc)); return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_client_returned_record_ref) } double testsuite_client_interface_identifier_check(testsuite_client_interface_ref instance, djinni_binary_ref data, int32_t r, int64_t jret) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->identifier_check(::djinni::c_api::BinaryTranslator::toCpp(data), r, jret); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(double) } djinni_string_ref testsuite_client_interface_return_str(testsuite_client_interface_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->return_str(); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_client_interface_meth_taking_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_client_interface_meth_taking_optional_interface(testsuite_client_interface_ref instance, testsuite_client_interface_ref i) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalPtrTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>>::toCpp(i)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } diff --git a/test-suite/generated-src/c/client_returned_record.cpp b/test-suite/generated-src/c/client_returned_record.cpp index 410b7b53..c47d6c2a 100644 --- a/test-suite/generated-src/c/client_returned_record.cpp +++ b/test-suite/generated-src/c/client_returned_record.cpp @@ -7,7 +7,7 @@ testsuite_client_returned_record_ref testsuite_client_returned_record_new(int64_t record_id, djinni_string_ref content, djinni_string_ref misc) { - return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::make(record_id, ::djinni::c_api::StringTranslator::toCpp(content), ::djinni::c_api::OptionalTranslator::toCpp>(misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::make(record_id, ::djinni::c_api::StringTranslator::toCpp(content), ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>::toCpp(misc)); } int64_t testsuite_client_returned_record_get_record_id(testsuite_client_returned_record_ref instance) @@ -32,12 +32,12 @@ void testsuite_client_returned_record_set_content(testsuite_client_returned_reco djinni_string_ref testsuite_client_returned_record_get_misc(testsuite_client_returned_record_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCpp>(::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc); } void testsuite_client_returned_record_set_misc(testsuite_client_returned_record_ref instance, djinni_string_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc = ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::ClientReturnedRecord>::toCpp(instance).misc = ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>::toCpp(value); } diff --git a/test-suite/generated-src/c/conflict_user.cpp b/test-suite/generated-src/c/conflict_user.cpp index 78e51920..b2708802 100644 --- a/test-suite/generated-src/c/conflict_user.cpp +++ b/test-suite/generated-src/c/conflict_user.cpp @@ -6,49 +6,20 @@ #include "conflict_user.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct ConflictUser_Proxy: public Proxy_Parent, public ::testsuite::ConflictUser { - ConflictUser_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ConflictUser_Proxy() override = default; - - /*not-null*/ std::shared_ptr<::testsuite::Conflict> Conflict() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().Conflict(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - bool conflict_arg(const std::vector> & cs) override { - auto cs_c = ::djinni::c_api::ListTranslator>::fromCpp(cs, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::fromCpp(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().conflict_arg(Proxy_Parent::getOpaque(), cs_c); - djinni_ref_release(cs_c); - - auto returnValue_cpp = returnValue; - return returnValue_cpp; - } - -}; - -testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ConflictUser>::toCpp(instance)->Conflict(); return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_Conflict_ref) } bool testsuite_conflict_user_conflict_arg(testsuite_conflict_user_ref instance, djinni_array_ref cs) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ConflictUser>::toCpp(instance)->conflict_arg(::djinni::c_api::ListTranslator>::toCpp(cs, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ConflictUser>::toCpp(instance)->conflict_arg(::djinni::c_api::ListTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::Conflict>>::toCpp(cs)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } diff --git a/test-suite/generated-src/c/conflict_user.h b/test-suite/generated-src/c/conflict_user.h index 7ccc97fb..d05c0296 100644 --- a/test-suite/generated-src/c/conflict_user.h +++ b/test-suite/generated-src/c/conflict_user.h @@ -11,17 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_conflict_user_ref; -typedef djinni_proxy_class_ref testsuite_conflict_user_proxy_class_ref; - -typedef struct -{ - testsuite_Conflict_ref (*Conflict)(void *); - bool (*conflict_arg)(void *, djinni_array_ref); -} testsuite_conflict_user_method_defs; - -testsuite_conflict_user_proxy_class_ref testsuite_conflict_user_proxy_class_new(const testsuite_conflict_user_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_conflict_user_ref testsuite_conflict_user_new(testsuite_conflict_user_proxy_class_ref proxy_class, void *opaque); testsuite_Conflict_ref testsuite_conflict_user_Conflict(testsuite_conflict_user_ref instance); diff --git a/test-suite/generated-src/c/constant_interface_with_enum.cpp b/test-suite/generated-src/c/constant_interface_with_enum.cpp index 70d809e2..2d39f358 100644 --- a/test-suite/generated-src/c/constant_interface_with_enum.cpp +++ b/test-suite/generated-src/c/constant_interface_with_enum.cpp @@ -5,20 +5,4 @@ #include "djinni_c_translators.hpp" #include "constant_interface_with_enum.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct ConstantInterfaceWithEnum_Proxy: public Proxy_Parent, public ::testsuite::ConstantInterfaceWithEnum { - ConstantInterfaceWithEnum_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ConstantInterfaceWithEnum_Proxy() override = default; - -}; - -testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - diff --git a/test-suite/generated-src/c/constant_interface_with_enum.h b/test-suite/generated-src/c/constant_interface_with_enum.h index 47356332..7b62db0d 100644 --- a/test-suite/generated-src/c/constant_interface_with_enum.h +++ b/test-suite/generated-src/c/constant_interface_with_enum.h @@ -11,16 +11,6 @@ extern "C" { /** Interface containing enum constant */ typedef djinni_interface_ref testsuite_constant_interface_with_enum_ref; -typedef djinni_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_ref; - -typedef struct -{ - void *reserved[1]; -} testsuite_constant_interface_with_enum_method_defs; - -testsuite_constant_interface_with_enum_proxy_class_ref testsuite_constant_interface_with_enum_proxy_class_new(const testsuite_constant_interface_with_enum_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_constant_interface_with_enum_ref testsuite_constant_interface_with_enum_new(testsuite_constant_interface_with_enum_proxy_class_ref proxy_class, void *opaque); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/generated-src/c/constants_interface.cpp b/test-suite/generated-src/c/constants_interface.cpp index df135646..79210674 100644 --- a/test-suite/generated-src/c/constants_interface.cpp +++ b/test-suite/generated-src/c/constants_interface.cpp @@ -5,26 +5,6 @@ #include "djinni_c_translators.hpp" #include "constants_interface.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct ConstantsInterface_Proxy: public Proxy_Parent, public ::testsuite::ConstantsInterface { - ConstantsInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ConstantsInterface_Proxy() override = default; - - void dummy() override { - Proxy_Parent::getProxyClass().methodDefs().dummy(Proxy_Parent::getOpaque()); - } - -}; - -testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - /** * No support for null optional constants * No support for optional constant records @@ -32,7 +12,9 @@ testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_co */ void testsuite_constants_interface_dummy(testsuite_constants_interface_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::ConstantsInterface>::toCpp(instance)->dummy(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/constants_interface.h b/test-suite/generated-src/c/constants_interface.h index b69b0864..08efcd35 100644 --- a/test-suite/generated-src/c/constants_interface.h +++ b/test-suite/generated-src/c/constants_interface.h @@ -11,16 +11,6 @@ extern "C" { /** Interface containing constants */ typedef djinni_interface_ref testsuite_constants_interface_ref; -typedef djinni_proxy_class_ref testsuite_constants_interface_proxy_class_ref; - -typedef struct -{ - void (*dummy)(void *); -} testsuite_constants_interface_method_defs; - -testsuite_constants_interface_proxy_class_ref testsuite_constants_interface_proxy_class_new(const testsuite_constants_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_constants_interface_ref testsuite_constants_interface_new(testsuite_constants_interface_proxy_class_ref proxy_class, void *opaque); /** * No support for null optional constants diff --git a/test-suite/generated-src/c/cpp_exception.cpp b/test-suite/generated-src/c/cpp_exception.cpp index d0c1a0f3..54edf870 100644 --- a/test-suite/generated-src/c/cpp_exception.cpp +++ b/test-suite/generated-src/c/cpp_exception.cpp @@ -6,70 +6,36 @@ #include "cpp_exception.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct CppException_Proxy: public Proxy_Parent, public ::testsuite::CppException { - CppException_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~CppException_Proxy() override = default; - - int32_t throw_an_exception() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().throw_an_exception(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = returnValue; - return returnValue_cpp; - } - - int32_t call_throwing_interface(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { - auto cb_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::fromCpp(cb); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_interface(Proxy_Parent::getOpaque(), cb_c); - djinni_ref_release(cb_c); - - auto returnValue_cpp = returnValue; - return returnValue_cpp; - } - - std::string call_throwing_and_catch(const /*not-null*/ std::shared_ptr<::testsuite::ThrowingInterface> & cb) override { - auto cb_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::fromCpp(cb); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().call_throwing_and_catch(Proxy_Parent::getOpaque(), cb_c); - djinni_ref_release(cb_c); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->throw_an_exception(); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int32_t) } int32_t testsuite_cpp_exception_call_throwing_interface(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->call_throwing_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(cb)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int32_t) } djinni_string_ref testsuite_cpp_exception_call_throwing_and_catch(testsuite_cpp_exception_ref instance, testsuite_throwing_interface_ref cb) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::toCpp(instance)->call_throwing_and_catch(::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(cb)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } testsuite_cpp_exception_ref testsuite_cpp_exception_get() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::CppException::get(); return ::djinni::c_api::InterfaceTranslator<::testsuite::CppException>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_cpp_exception_ref) } diff --git a/test-suite/generated-src/c/cpp_exception.h b/test-suite/generated-src/c/cpp_exception.h index ba879556..d09a0d74 100644 --- a/test-suite/generated-src/c/cpp_exception.h +++ b/test-suite/generated-src/c/cpp_exception.h @@ -12,19 +12,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_cpp_exception_ref; -typedef djinni_proxy_class_ref testsuite_cpp_exception_proxy_class_ref; - -typedef struct -{ - int32_t (*throw_an_exception)(void *); - int32_t (*call_throwing_interface)(void *, testsuite_throwing_interface_ref); - djinni_string_ref (*call_throwing_and_catch)(void *, testsuite_throwing_interface_ref); - testsuite_cpp_exception_ref (*get)(void *); -} testsuite_cpp_exception_method_defs; - -testsuite_cpp_exception_proxy_class_ref testsuite_cpp_exception_proxy_class_new(const testsuite_cpp_exception_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_cpp_exception_ref testsuite_cpp_exception_new(testsuite_cpp_exception_proxy_class_ref proxy_class, void *opaque); int32_t testsuite_cpp_exception_throw_an_exception(testsuite_cpp_exception_ref instance); diff --git a/test-suite/generated-src/c/enum_usage_interface.cpp b/test-suite/generated-src/c/enum_usage_interface.cpp index 1badbfd7..b0010709 100644 --- a/test-suite/generated-src/c/enum_usage_interface.cpp +++ b/test-suite/generated-src/c/enum_usage_interface.cpp @@ -6,98 +6,44 @@ #include "color.hpp" #include "enum_usage_interface.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct EnumUsageInterface_Proxy: public Proxy_Parent, public ::testsuite::EnumUsageInterface { - EnumUsageInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~EnumUsageInterface_Proxy() override = default; - - ::testsuite::color e(::testsuite::color e) override { - auto e_c = ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCpp(e); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().e(Proxy_Parent::getOpaque(), e_c); - - auto returnValue_cpp = ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(returnValue); - return returnValue_cpp; - } - - std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> o) override { - auto o_c = ::djinni::c_api::OptionalTranslator::fromCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().o(Proxy_Parent::getOpaque(), o_c); - djinni_ref_release(o_c); - - auto returnValue_cpp = ::djinni::c_api::OptionalTranslator::toCpp>(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & l) override { - auto l_c = ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().l(Proxy_Parent::getOpaque(), l_c); - djinni_ref_release(l_c); - - auto returnValue_cpp = ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & s) override { - auto s_c = ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().s(Proxy_Parent::getOpaque(), s_c); - djinni_ref_release(s_c); - - auto returnValue_cpp = ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(returnValue, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & m) override { - auto m_c = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().m(Proxy_Parent::getOpaque(), m_c); - djinni_ref_release(m_c); - - auto returnValue_cpp = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(returnValue, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->e(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(e)); return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_color) } djinni_number_ref testsuite_enum_usage_interface_o(testsuite_enum_usage_interface_ref instance, djinni_number_ref o) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->o(::djinni::c_api::OptionalTranslator::toCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->o(::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(o)); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_array_ref testsuite_enum_usage_interface_l(testsuite_enum_usage_interface_ref instance, djinni_array_ref l) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->l(::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->l(::djinni::c_api::ListTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(l)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_array_ref testsuite_enum_usage_interface_s(testsuite_enum_usage_interface_ref instance, djinni_array_ref s) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->s(::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->s(::djinni::c_api::SetTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(s)); + return ::djinni::c_api::SetTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_keyval_array_ref testsuite_enum_usage_interface_m(testsuite_enum_usage_interface_ref instance, djinni_keyval_array_ref m) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->m(::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); - return ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::EnumUsageInterface>::toCpp(instance)->m(::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(m)); + return ::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_keyval_array_ref) } diff --git a/test-suite/generated-src/c/enum_usage_interface.h b/test-suite/generated-src/c/enum_usage_interface.h index 06507271..67a829df 100644 --- a/test-suite/generated-src/c/enum_usage_interface.h +++ b/test-suite/generated-src/c/enum_usage_interface.h @@ -11,20 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_enum_usage_interface_ref; -typedef djinni_proxy_class_ref testsuite_enum_usage_interface_proxy_class_ref; - -typedef struct -{ - testsuite_color (*e)(void *, testsuite_color); - djinni_number_ref (*o)(void *, djinni_number_ref); - djinni_array_ref (*l)(void *, djinni_array_ref); - djinni_array_ref (*s)(void *, djinni_array_ref); - djinni_keyval_array_ref (*m)(void *, djinni_keyval_array_ref); -} testsuite_enum_usage_interface_method_defs; - -testsuite_enum_usage_interface_proxy_class_ref testsuite_enum_usage_interface_proxy_class_new(const testsuite_enum_usage_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_enum_usage_interface_ref testsuite_enum_usage_interface_new(testsuite_enum_usage_interface_proxy_class_ref proxy_class, void *opaque); testsuite_color testsuite_enum_usage_interface_e(testsuite_enum_usage_interface_ref instance, testsuite_color e); diff --git a/test-suite/generated-src/c/enum_usage_record.cpp b/test-suite/generated-src/c/enum_usage_record.cpp index 9db02a7e..e5510ec0 100644 --- a/test-suite/generated-src/c/enum_usage_record.cpp +++ b/test-suite/generated-src/c/enum_usage_record.cpp @@ -8,7 +8,7 @@ testsuite_enum_usage_record_ref testsuite_enum_usage_record_new(testsuite_color e, djinni_number_ref o, djinni_array_ref l, djinni_array_ref s, djinni_keyval_array_ref m) { - return ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::make(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(e), ::djinni::c_api::OptionalTranslator::toCpp>(o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }), ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::make(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(e), ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(o), ::djinni::c_api::ListTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(l), ::djinni::c_api::SetTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(s), ::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(m)); } testsuite_color testsuite_enum_usage_record_get_e(testsuite_enum_usage_record_ref instance) @@ -23,42 +23,42 @@ void testsuite_enum_usage_record_set_e(testsuite_enum_usage_record_ref instance, djinni_number_ref testsuite_enum_usage_record_get_o(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCpp>(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o); } void testsuite_enum_usage_record_set_o(testsuite_enum_usage_record_ref instance, djinni_number_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o = ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).o = ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(value); } djinni_array_ref testsuite_enum_usage_record_get_l(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::ListTranslator<::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l); } void testsuite_enum_usage_record_set_l(testsuite_enum_usage_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l = ::djinni::c_api::ListTranslator<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).l = ::djinni::c_api::ListTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(value); } djinni_array_ref testsuite_enum_usage_record_get_s(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::SetTranslator<::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(std::forward(value)); }); + return ::djinni::c_api::SetTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s); } void testsuite_enum_usage_record_set_s(testsuite_enum_usage_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s = ::djinni::c_api::SetTranslator<::testsuite::color>::toCpp(value, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).s = ::djinni::c_api::SetTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(value); } djinni_keyval_array_ref testsuite_enum_usage_record_get_m(testsuite_enum_usage_record_ref instance) { - return ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::fromCppBoxed(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m); } void testsuite_enum_usage_record_set_m(testsuite_enum_usage_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m = ::djinni::c_api::MapTranslator<::testsuite::color, ::testsuite::color>::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::EnumUsageRecord>::toCpp(instance).m = ::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(value); } diff --git a/test-suite/generated-src/c/first_listener.cpp b/test-suite/generated-src/c/first_listener.cpp index c7d2429e..fdc4331f 100644 --- a/test-suite/generated-src/c/first_listener.cpp +++ b/test-suite/generated-src/c/first_listener.cpp @@ -5,29 +5,11 @@ #include "djinni_c_translators.hpp" #include "first_listener.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct FirstListener_Proxy: public Proxy_Parent, public ::testsuite::FirstListener { - FirstListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~FirstListener_Proxy() override = default; - - void first() override { - Proxy_Parent::getProxyClass().methodDefs().first(Proxy_Parent::getOpaque()); - } - -}; - -testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - void testsuite_first_listener_first(testsuite_first_listener_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::FirstListener>::toCpp(instance)->first(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/first_listener.h b/test-suite/generated-src/c/first_listener.h index a34042ac..7ac2351e 100644 --- a/test-suite/generated-src/c/first_listener.h +++ b/test-suite/generated-src/c/first_listener.h @@ -11,16 +11,6 @@ extern "C" { /** Used for ObjC multiple inheritance tests */ typedef djinni_interface_ref testsuite_first_listener_ref; -typedef djinni_proxy_class_ref testsuite_first_listener_proxy_class_ref; - -typedef struct -{ - void (*first)(void *); -} testsuite_first_listener_method_defs; - -testsuite_first_listener_proxy_class_ref testsuite_first_listener_proxy_class_new(const testsuite_first_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_first_listener_ref testsuite_first_listener_new(testsuite_first_listener_proxy_class_ref proxy_class, void *opaque); void testsuite_first_listener_first(testsuite_first_listener_ref instance); diff --git a/test-suite/generated-src/c/flag_roundtrip.cpp b/test-suite/generated-src/c/flag_roundtrip.cpp index 884ca841..a0bf0699 100644 --- a/test-suite/generated-src/c/flag_roundtrip.cpp +++ b/test-suite/generated-src/c/flag_roundtrip.cpp @@ -7,44 +7,36 @@ #include "empty_flags.hpp" #include "flag_roundtrip.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct FlagRoundtrip_Proxy: public Proxy_Parent, public ::testsuite::FlagRoundtrip { - FlagRoundtrip_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~FlagRoundtrip_Proxy() override = default; - -}; - -testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access(::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCpp(flag)); return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_access_flags) } testsuite_empty_flags testsuite_flag_roundtrip_roundtrip_empty(testsuite_empty_flags flag) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty(::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::toCpp(flag)); return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_empty_flags) } djinni_number_ref testsuite_flag_roundtrip_roundtrip_access_boxed(djinni_number_ref flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access_boxed(::djinni::c_api::OptionalTranslator::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::access_flags, testsuite_access_flags>::fromCppBoxed(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_access_boxed(::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::access_flags>>::toCpp(flag)); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::access_flags>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_flag_roundtrip_roundtrip_empty_boxed(djinni_number_ref flag) { - auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty_boxed(::djinni::c_api::OptionalTranslator::toCpp>(flag, [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::toCppBoxed(std::forward(value)); })); - return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::EnumTranslator<::testsuite::empty_flags, testsuite_empty_flags>::fromCppBoxed(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::FlagRoundtrip::roundtrip_empty_boxed(::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::empty_flags>>::toCpp(flag)); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::BoxedEnumTranslator<::testsuite::empty_flags>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } diff --git a/test-suite/generated-src/c/flag_roundtrip.h b/test-suite/generated-src/c/flag_roundtrip.h index 7331f656..35aec463 100644 --- a/test-suite/generated-src/c/flag_roundtrip.h +++ b/test-suite/generated-src/c/flag_roundtrip.h @@ -12,19 +12,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_flag_roundtrip_ref; -typedef djinni_proxy_class_ref testsuite_flag_roundtrip_proxy_class_ref; - -typedef struct -{ - testsuite_access_flags (*roundtrip_access)(void *, testsuite_access_flags); - testsuite_empty_flags (*roundtrip_empty)(void *, testsuite_empty_flags); - djinni_number_ref (*roundtrip_access_boxed)(void *, djinni_number_ref); - djinni_number_ref (*roundtrip_empty_boxed)(void *, djinni_number_ref); -} testsuite_flag_roundtrip_method_defs; - -testsuite_flag_roundtrip_proxy_class_ref testsuite_flag_roundtrip_proxy_class_new(const testsuite_flag_roundtrip_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_flag_roundtrip_ref testsuite_flag_roundtrip_new(testsuite_flag_roundtrip_proxy_class_ref proxy_class, void *opaque); testsuite_access_flags testsuite_flag_roundtrip_roundtrip_access(testsuite_access_flags flag); diff --git a/test-suite/generated-src/c/interface_using_extended_record.cpp b/test-suite/generated-src/c/interface_using_extended_record.cpp index 21aad5e2..89675fed 100644 --- a/test-suite/generated-src/c/interface_using_extended_record.cpp +++ b/test-suite/generated-src/c/interface_using_extended_record.cpp @@ -6,36 +6,12 @@ #include "../../handwritten-src/cpp/extended_record.hpp" #include "interface_using_extended_record.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct InterfaceUsingExtendedRecord_Proxy: public Proxy_Parent, public ::testsuite::InterfaceUsingExtendedRecord { - InterfaceUsingExtendedRecord_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~InterfaceUsingExtendedRecord_Proxy() override = default; - - ::testsuite::ExtendedRecord meth(const ::testsuite::ExtendedRecord & er) override { - auto er_c = ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::fromCpp(er); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth(Proxy_Parent::getOpaque(), er_c); - djinni_ref_release(er_c); - - auto returnValue_cpp = ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::InterfaceUsingExtendedRecord>::toCpp(instance)->meth(::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(er)); return ::djinni::c_api::RecordTranslator<::testsuite::ExtendedRecord>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_extended_record_ref) } diff --git a/test-suite/generated-src/c/interface_using_extended_record.h b/test-suite/generated-src/c/interface_using_extended_record.h index c5b2dfee..3ce01dc0 100644 --- a/test-suite/generated-src/c/interface_using_extended_record.h +++ b/test-suite/generated-src/c/interface_using_extended_record.h @@ -11,16 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_interface_using_extended_record_ref; -typedef djinni_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_ref; - -typedef struct -{ - testsuite_extended_record_ref (*meth)(void *, testsuite_extended_record_ref); -} testsuite_interface_using_extended_record_method_defs; - -testsuite_interface_using_extended_record_proxy_class_ref testsuite_interface_using_extended_record_proxy_class_new(const testsuite_interface_using_extended_record_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_interface_using_extended_record_ref testsuite_interface_using_extended_record_new(testsuite_interface_using_extended_record_proxy_class_ref proxy_class, void *opaque); testsuite_extended_record_ref testsuite_interface_using_extended_record_meth(testsuite_interface_using_extended_record_ref instance, testsuite_extended_record_ref er); diff --git a/test-suite/generated-src/c/java_only_listener.cpp b/test-suite/generated-src/c/java_only_listener.cpp index 9bc1c1b8..e4f45700 100644 --- a/test-suite/generated-src/c/java_only_listener.cpp +++ b/test-suite/generated-src/c/java_only_listener.cpp @@ -5,20 +5,4 @@ #include "djinni_c_translators.hpp" #include "java_only_listener.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct JavaOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::JavaOnlyListener { - JavaOnlyListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~JavaOnlyListener_Proxy() override = default; - -}; - -testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - diff --git a/test-suite/generated-src/c/java_only_listener.h b/test-suite/generated-src/c/java_only_listener.h index 87fd8c92..b45c77e6 100644 --- a/test-suite/generated-src/c/java_only_listener.h +++ b/test-suite/generated-src/c/java_only_listener.h @@ -10,16 +10,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_java_only_listener_ref; -typedef djinni_proxy_class_ref testsuite_java_only_listener_proxy_class_ref; - -typedef struct -{ - void *reserved[1]; -} testsuite_java_only_listener_method_defs; - -testsuite_java_only_listener_proxy_class_ref testsuite_java_only_listener_proxy_class_new(const testsuite_java_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_java_only_listener_ref testsuite_java_only_listener_new(testsuite_java_only_listener_proxy_class_ref proxy_class, void *opaque); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/generated-src/c/listener_caller.cpp b/test-suite/generated-src/c/listener_caller.cpp index 4c376313..6b990a84 100644 --- a/test-suite/generated-src/c/listener_caller.cpp +++ b/test-suite/generated-src/c/listener_caller.cpp @@ -6,44 +6,26 @@ #include "listener_caller.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct ListenerCaller_Proxy: public Proxy_Parent, public ::testsuite::ListenerCaller { - ListenerCaller_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ListenerCaller_Proxy() override = default; - - void callFirst() override { - Proxy_Parent::getProxyClass().methodDefs().callFirst(Proxy_Parent::getOpaque()); - } - - void callSecond() override { - Proxy_Parent::getProxyClass().methodDefs().callSecond(Proxy_Parent::getOpaque()); - } - -}; - -testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ListenerCaller::init(::djinni::c_api::InterfaceTranslator<::testsuite::FirstListener>::toCpp(first_l), ::djinni::c_api::InterfaceTranslator<::testsuite::SecondListener>::toCpp(second_l)); return ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_listener_caller_ref) } void testsuite_listener_caller_callFirst(testsuite_listener_caller_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::toCpp(instance)->callFirst(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } void testsuite_listener_caller_callSecond(testsuite_listener_caller_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::ListenerCaller>::toCpp(instance)->callSecond(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/listener_caller.h b/test-suite/generated-src/c/listener_caller.h index e65df48a..49700a73 100644 --- a/test-suite/generated-src/c/listener_caller.h +++ b/test-suite/generated-src/c/listener_caller.h @@ -19,18 +19,6 @@ extern "C" { * comparison. */ typedef djinni_interface_ref testsuite_listener_caller_ref; -typedef djinni_proxy_class_ref testsuite_listener_caller_proxy_class_ref; - -typedef struct -{ - testsuite_listener_caller_ref (*init)(void *, testsuite_first_listener_ref, testsuite_second_listener_ref); - void (*callFirst)(void *); - void (*callSecond)(void *); -} testsuite_listener_caller_method_defs; - -testsuite_listener_caller_proxy_class_ref testsuite_listener_caller_proxy_class_new(const testsuite_listener_caller_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_listener_caller_ref testsuite_listener_caller_new(testsuite_listener_caller_proxy_class_ref proxy_class, void *opaque); testsuite_listener_caller_ref testsuite_listener_caller_init(testsuite_first_listener_ref first_l, testsuite_second_listener_ref second_l); diff --git a/test-suite/generated-src/c/map_date_record.cpp b/test-suite/generated-src/c/map_date_record.cpp index b0b3a893..e45495ea 100644 --- a/test-suite/generated-src/c/map_date_record.cpp +++ b/test-suite/generated-src/c/map_date_record.cpp @@ -9,17 +9,17 @@ testsuite_map_date_record_ref testsuite_map_date_record_new(djinni_keyval_array_ref dates_by_id) { - return ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::make(::djinni::c_api::MapTranslator::toCpp(dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::DateTranslator::toCpp(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::make(::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::DateTranslator>::toCpp(dates_by_id)); } djinni_keyval_array_ref testsuite_map_date_record_get_dates_by_id(testsuite_map_date_record_ref instance) { - return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::DateTranslator::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::DateTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id); } void testsuite_map_date_record_set_dates_by_id(testsuite_map_date_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::DateTranslator::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapDateRecord>::toCpp(instance).dates_by_id = ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::DateTranslator>::toCpp(value); } diff --git a/test-suite/generated-src/c/map_list_record.cpp b/test-suite/generated-src/c/map_list_record.cpp index 36b37f2b..660a538a 100644 --- a/test-suite/generated-src/c/map_list_record.cpp +++ b/test-suite/generated-src/c/map_list_record.cpp @@ -7,17 +7,17 @@ testsuite_map_list_record_ref testsuite_map_list_record_new(djinni_array_ref map_list) { - return ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::make(::djinni::c_api::ListTranslator>::toCpp(map_list, [](auto&& value) { return ::djinni::c_api::MapTranslator::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::make(::djinni::c_api::ListTranslator<::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>>::toCpp(map_list)); } djinni_array_ref testsuite_map_list_record_get_map_list(testsuite_map_list_record_ref instance) { - return ::djinni::c_api::ListTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list, [](auto&& value) { return ::djinni::c_api::MapTranslator::fromCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list); } void testsuite_map_list_record_set_map_list(testsuite_map_list_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list = ::djinni::c_api::ListTranslator>::toCpp(value, [](auto&& value) { return ::djinni::c_api::MapTranslator::toCpp(std::forward(value), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(instance).map_list = ::djinni::c_api::ListTranslator<::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>>::toCpp(value); } diff --git a/test-suite/generated-src/c/map_record.cpp b/test-suite/generated-src/c/map_record.cpp index 377396f0..30cc1150 100644 --- a/test-suite/generated-src/c/map_record.cpp +++ b/test-suite/generated-src/c/map_record.cpp @@ -7,27 +7,27 @@ testsuite_map_record_ref testsuite_map_record_new(djinni_keyval_array_ref map, djinni_keyval_array_ref imap) { - return ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::make(::djinni::c_api::MapTranslator::toCpp(map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }), ::djinni::c_api::MapTranslator::toCpp(imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::make(::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::toCpp(map), ::djinni::c_api::MapTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::Int32Translator>::toCpp(imap)); } djinni_keyval_array_ref testsuite_map_record_get_map(testsuite_map_record_ref instance) { - return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map); } void testsuite_map_record_set_map(testsuite_map_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).map = ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::toCpp(value); } djinni_keyval_array_ref testsuite_map_record_get_imap(testsuite_map_record_ref instance) { - return ::djinni::c_api::MapTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::Int32Translator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap); } void testsuite_map_record_set_imap(testsuite_map_record_ref instance, djinni_keyval_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap = ::djinni::c_api::MapTranslator::toCpp(value, [](auto key, auto value) { return std::make_pair(::djinni::c_api::NumberTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::MapRecord>::toCpp(instance).imap = ::djinni::c_api::MapTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::Int32Translator>::toCpp(value); } diff --git a/test-suite/generated-src/c/nested_collection.cpp b/test-suite/generated-src/c/nested_collection.cpp index bf583387..414b39f5 100644 --- a/test-suite/generated-src/c/nested_collection.cpp +++ b/test-suite/generated-src/c/nested_collection.cpp @@ -7,17 +7,17 @@ testsuite_nested_collection_ref testsuite_nested_collection_new(djinni_array_ref set_list) { - return ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::make(::djinni::c_api::ListTranslator>::toCpp(set_list, [](auto&& value) { return ::djinni::c_api::SetTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::make(::djinni::c_api::ListTranslator<::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>>::toCpp(set_list)); } djinni_array_ref testsuite_nested_collection_get_set_list(testsuite_nested_collection_ref instance) { - return ::djinni::c_api::ListTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list, [](auto&& value) { return ::djinni::c_api::SetTranslator::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list); } void testsuite_nested_collection_set_set_list(testsuite_nested_collection_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list = ::djinni::c_api::ListTranslator>::toCpp(value, [](auto&& value) { return ::djinni::c_api::SetTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(instance).set_list = ::djinni::c_api::ListTranslator<::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>>::toCpp(value); } diff --git a/test-suite/generated-src/c/nested_outcome.cpp b/test-suite/generated-src/c/nested_outcome.cpp index 865c9e18..7b99dcd0 100644 --- a/test-suite/generated-src/c/nested_outcome.cpp +++ b/test-suite/generated-src/c/nested_outcome.cpp @@ -9,17 +9,17 @@ testsuite_nested_outcome_ref testsuite_nested_outcome_new(djinni_outcome_ref o) { - return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::make(::djinni::c_api::OutcomeTranslator::toCpp(o, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::make(::djinni::c_api::OutcomeTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::StringTranslator>::toCpp(o)); } djinni_outcome_ref testsuite_nested_outcome_get_o(testsuite_nested_outcome_ref instance) { - return ::djinni::c_api::OutcomeTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OutcomeTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::StringTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o); } void testsuite_nested_outcome_set_o(testsuite_nested_outcome_ref instance, djinni_outcome_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::OutcomeTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(instance).o = ::djinni::c_api::OutcomeTranslator<::djinni::c_api::Int32Translator, ::djinni::c_api::StringTranslator>::toCpp(value); } diff --git a/test-suite/generated-src/c/objc_only_listener.cpp b/test-suite/generated-src/c/objc_only_listener.cpp index d542c53d..a025f753 100644 --- a/test-suite/generated-src/c/objc_only_listener.cpp +++ b/test-suite/generated-src/c/objc_only_listener.cpp @@ -5,20 +5,4 @@ #include "djinni_c_translators.hpp" #include "objc_only_listener.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct ObjcOnlyListener_Proxy: public Proxy_Parent, public ::testsuite::ObjcOnlyListener { - ObjcOnlyListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ObjcOnlyListener_Proxy() override = default; - -}; - -testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - diff --git a/test-suite/generated-src/c/objc_only_listener.h b/test-suite/generated-src/c/objc_only_listener.h index 3823ecc1..641aa047 100644 --- a/test-suite/generated-src/c/objc_only_listener.h +++ b/test-suite/generated-src/c/objc_only_listener.h @@ -10,16 +10,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_objc_only_listener_ref; -typedef djinni_proxy_class_ref testsuite_objc_only_listener_proxy_class_ref; - -typedef struct -{ - void *reserved[1]; -} testsuite_objc_only_listener_method_defs; - -testsuite_objc_only_listener_proxy_class_ref testsuite_objc_only_listener_proxy_class_new(const testsuite_objc_only_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_objc_only_listener_ref testsuite_objc_only_listener_new(testsuite_objc_only_listener_proxy_class_ref proxy_class, void *opaque); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/generated-src/c/primitive_list.cpp b/test-suite/generated-src/c/primitive_list.cpp index e5a0601e..5bcb36c5 100644 --- a/test-suite/generated-src/c/primitive_list.cpp +++ b/test-suite/generated-src/c/primitive_list.cpp @@ -7,27 +7,27 @@ testsuite_primitive_list_ref testsuite_primitive_list_new(djinni_array_ref list, djinni_array_ref optional_list) { - return ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::make(::djinni::c_api::ListTranslator::toCpp(list, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::toCpp>>>(optional_list, [](auto&& value) { return ::djinni::c_api::ListTranslator>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); }); })); + return ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::make(::djinni::c_api::ListTranslator<::djinni::c_api::Int64Translator>::toCpp(list), ::djinni::c_api::OptionalTranslator>>, ::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int64Translator>>>::toCpp(optional_list)); } djinni_array_ref testsuite_primitive_list_get_list(testsuite_primitive_list_ref instance) { - return ::djinni::c_api::ListTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::Int64Translator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list); } void testsuite_primitive_list_set_list(testsuite_primitive_list_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list = ::djinni::c_api::ListTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).list = ::djinni::c_api::ListTranslator<::djinni::c_api::Int64Translator>::toCpp(value); } djinni_array_ref testsuite_primitive_list_get_optional_list(testsuite_primitive_list_ref instance) { - return ::djinni::c_api::OptionalTranslator::fromCpp>>>(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list, [](auto&& value) { return ::djinni::c_api::ListTranslator>::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); }); + return ::djinni::c_api::OptionalTranslator>>, ::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int64Translator>>>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list); } void testsuite_primitive_list_set_optional_list(testsuite_primitive_list_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list = ::djinni::c_api::OptionalTranslator::toCpp>>>(value, [](auto&& value) { return ::djinni::c_api::ListTranslator>::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); }); }); + ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(instance).optional_list = ::djinni::c_api::OptionalTranslator>>, ::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int64Translator>>>::toCpp(value); } diff --git a/test-suite/generated-src/c/proto_tests.cpp b/test-suite/generated-src/c/proto_tests.cpp index 38d4417c..985f062b 100644 --- a/test-suite/generated-src/c/proto_tests.cpp +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -11,98 +11,108 @@ #include "proto/cpp/test2.pb.h" #include "proto_tests.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct ProtoTests_Proxy: public Proxy_Parent, public ::testsuite::ProtoTests { - ProtoTests_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ProtoTests_Proxy() override = default; - -}; - -testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::protoToStrings(::djinni::c_api::ProtobufTranslator<::djinni::test::AddressBook>::toCpp(x)); - return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_binary_ref testsuite_proto_tests_stringsToProto(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::stringsToProto(::djinni::c_api::ListTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::ProtoTests::stringsToProto(::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::toCpp(x)); return ::djinni::c_api::ProtobufTranslator<::djinni::test::AddressBook>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_string_ref testsuite_proto_tests_embeddedProtoToString(testsuite_RecordWithEmbeddedProto_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::embeddedProtoToString(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } testsuite_RecordWithEmbeddedProto_ref testsuite_proto_tests_stringToEmbeddedProto(djinni_string_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::stringToEmbeddedProto(::djinni::c_api::StringTranslator::toCpp(x)); return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_RecordWithEmbeddedProto_ref) } djinni_string_ref testsuite_proto_tests_cppProtoToString(djinni_binary_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::cppProtoToString(::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_binary_ref testsuite_proto_tests_stringToCppProto(djinni_string_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::stringToCppProto(::djinni::c_api::StringTranslator::toCpp(x)); return ::djinni::c_api::ProtobufTranslator<::djinni::test2::PersistingState>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_string_ref testsuite_proto_tests_embeddedCppProtoToString(testsuite_RecordWithEmbeddedCppProto_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::embeddedCppProtoToString(::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } testsuite_RecordWithEmbeddedCppProto_ref testsuite_proto_tests_stringToEmbeddedCppProto(djinni_string_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::stringToEmbeddedCppProto(::djinni::c_api::StringTranslator::toCpp(x)); return ::djinni::c_api::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_RecordWithEmbeddedCppProto_ref) } djinni_array_ref testsuite_proto_tests_protoListToStrings(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::protoListToStrings(::djinni::c_api::ListTranslator<::djinni::test::Person>::toCpp(x, [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(std::forward(value)); })); - return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::ProtoTests::protoListToStrings(::djinni::c_api::ListTranslator<::djinni::c_api::ProtobufTranslator<::djinni::test::Person>>::toCpp(x)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_array_ref testsuite_proto_tests_stringsToProtoList(djinni_array_ref x) { - auto retValue = ::testsuite::ProtoTests::stringsToProtoList(::djinni::c_api::ListTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::ListTranslator<::djinni::test::Person>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::ProtoTests::stringsToProtoList(::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::toCpp(x)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::ProtobufTranslator<::djinni::test::Person>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_string_ref testsuite_proto_tests_optionalProtoToString(djinni_binary_ref x) { - auto retValue = ::testsuite::ProtoTests::optionalProtoToString(::djinni::c_api::OptionalTranslator::toCpp>(x, [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::ProtoTests::optionalProtoToString(::djinni::c_api::OptionalTranslator, ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_binary_ref testsuite_proto_tests_stringToOptionalProto(djinni_string_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::stringToOptionalProto(::djinni::c_api::StringTranslator::toCpp(x)); - return ::djinni::c_api::OptionalTranslator::fromCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator, ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_outcome_ref testsuite_proto_tests_stringToProtoOutcome(djinni_string_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ProtoTests::stringToProtoOutcome(::djinni::c_api::StringTranslator::toCpp(x)); - return ::djinni::c_api::OutcomeTranslator<::djinni::test::Person, int32_t>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ProtobufTranslator<::djinni::test::Person>::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OutcomeTranslator<::djinni::c_api::ProtobufTranslator<::djinni::test::Person>, ::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_outcome_ref) } diff --git a/test-suite/generated-src/c/proto_tests.h b/test-suite/generated-src/c/proto_tests.h index 5ead2789..b76ca8db 100644 --- a/test-suite/generated-src/c/proto_tests.h +++ b/test-suite/generated-src/c/proto_tests.h @@ -13,28 +13,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_proto_tests_ref; -typedef djinni_proxy_class_ref testsuite_proto_tests_proxy_class_ref; - -typedef struct -{ - djinni_array_ref (*protoToStrings)(void *, djinni_binary_ref); - djinni_binary_ref (*stringsToProto)(void *, djinni_array_ref); - djinni_string_ref (*embeddedProtoToString)(void *, testsuite_RecordWithEmbeddedProto_ref); - testsuite_RecordWithEmbeddedProto_ref (*stringToEmbeddedProto)(void *, djinni_string_ref); - djinni_string_ref (*cppProtoToString)(void *, djinni_binary_ref); - djinni_binary_ref (*stringToCppProto)(void *, djinni_string_ref); - djinni_string_ref (*embeddedCppProtoToString)(void *, testsuite_RecordWithEmbeddedCppProto_ref); - testsuite_RecordWithEmbeddedCppProto_ref (*stringToEmbeddedCppProto)(void *, djinni_string_ref); - djinni_array_ref (*protoListToStrings)(void *, djinni_array_ref); - djinni_array_ref (*stringsToProtoList)(void *, djinni_array_ref); - djinni_string_ref (*optionalProtoToString)(void *, djinni_binary_ref); - djinni_binary_ref (*stringToOptionalProto)(void *, djinni_string_ref); - djinni_outcome_ref (*stringToProtoOutcome)(void *, djinni_string_ref); -} testsuite_proto_tests_method_defs; - -testsuite_proto_tests_proxy_class_ref testsuite_proto_tests_proxy_class_new(const testsuite_proto_tests_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_proto_tests_ref testsuite_proto_tests_new(testsuite_proto_tests_proxy_class_ref proxy_class, void *opaque); djinni_array_ref testsuite_proto_tests_protoToStrings(djinni_binary_ref x); diff --git a/test-suite/generated-src/c/return_one.cpp b/test-suite/generated-src/c/return_one.cpp index 1c31940f..51da0e7e 100644 --- a/test-suite/generated-src/c/return_one.cpp +++ b/test-suite/generated-src/c/return_one.cpp @@ -6,39 +6,20 @@ #include "return_one.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct ReturnOne_Proxy: public Proxy_Parent, public ::testsuite::ReturnOne { - ReturnOne_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ReturnOne_Proxy() override = default; - - int8_t return_one() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_one(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = returnValue; - return returnValue_cpp; - } - -}; - -testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_return_one_ref testsuite_return_one_get_instance() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ReturnOne::get_instance(); return ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnOne>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_return_one_ref) } int8_t testsuite_return_one_return_one(testsuite_return_one_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnOne>::toCpp(instance)->return_one(); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int8_t) } diff --git a/test-suite/generated-src/c/return_one.h b/test-suite/generated-src/c/return_one.h index 767e6e23..e3100912 100644 --- a/test-suite/generated-src/c/return_one.h +++ b/test-suite/generated-src/c/return_one.h @@ -12,17 +12,6 @@ extern "C" { /** Used for C++ multiple inheritance tests */ typedef djinni_interface_ref testsuite_return_one_ref; -typedef djinni_proxy_class_ref testsuite_return_one_proxy_class_ref; - -typedef struct -{ - testsuite_return_one_ref (*get_instance)(void *); - int8_t (*return_one)(void *); -} testsuite_return_one_method_defs; - -testsuite_return_one_proxy_class_ref testsuite_return_one_proxy_class_new(const testsuite_return_one_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_return_one_ref testsuite_return_one_new(testsuite_return_one_proxy_class_ref proxy_class, void *opaque); testsuite_return_one_ref testsuite_return_one_get_instance(); diff --git a/test-suite/generated-src/c/return_two.cpp b/test-suite/generated-src/c/return_two.cpp index 07389381..de8ab3c0 100644 --- a/test-suite/generated-src/c/return_two.cpp +++ b/test-suite/generated-src/c/return_two.cpp @@ -6,39 +6,20 @@ #include "return_two.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct ReturnTwo_Proxy: public Proxy_Parent, public ::testsuite::ReturnTwo { - ReturnTwo_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ReturnTwo_Proxy() override = default; - - int8_t return_two() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_two(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = returnValue; - return returnValue_cpp; - } - -}; - -testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - testsuite_return_two_ref testsuite_return_two_get_instance() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ReturnTwo::get_instance(); return ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnTwo>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_return_two_ref) } int8_t testsuite_return_two_return_two(testsuite_return_two_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReturnTwo>::toCpp(instance)->return_two(); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int8_t) } diff --git a/test-suite/generated-src/c/return_two.h b/test-suite/generated-src/c/return_two.h index 27dba911..39a999c1 100644 --- a/test-suite/generated-src/c/return_two.h +++ b/test-suite/generated-src/c/return_two.h @@ -12,17 +12,6 @@ extern "C" { /** Used for C++ multiple inheritance tests */ typedef djinni_interface_ref testsuite_return_two_ref; -typedef djinni_proxy_class_ref testsuite_return_two_proxy_class_ref; - -typedef struct -{ - testsuite_return_two_ref (*get_instance)(void *); - int8_t (*return_two)(void *); -} testsuite_return_two_method_defs; - -testsuite_return_two_proxy_class_ref testsuite_return_two_proxy_class_new(const testsuite_return_two_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_return_two_ref testsuite_return_two_new(testsuite_return_two_proxy_class_ref proxy_class, void *opaque); testsuite_return_two_ref testsuite_return_two_get_instance(); diff --git a/test-suite/generated-src/c/reverse_client_interface.cpp b/test-suite/generated-src/c/reverse_client_interface.cpp index 6d1f0dbb..64cfcd5d 100644 --- a/test-suite/generated-src/c/reverse_client_interface.cpp +++ b/test-suite/generated-src/c/reverse_client_interface.cpp @@ -6,72 +6,36 @@ #include "reverse_client_interface.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct ReverseClientInterface_Proxy: public Proxy_Parent, public ::testsuite::ReverseClientInterface { - ReverseClientInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ReverseClientInterface_Proxy() override = default; - - std::string return_str() const override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().return_str(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::string meth_taking_interface(const /*not-null*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { - auto i_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(i); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_interface(Proxy_Parent::getOpaque(), i_c); - djinni_ref_release(i_c); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - std::string meth_taking_optional_interface(const /*nullable*/ std::shared_ptr<::testsuite::ReverseClientInterface> & i) override { - auto i_c = ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(std::forward(value)); }); - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().meth_taking_optional_interface(Proxy_Parent::getOpaque(), i_c); - djinni_ref_release(i_c); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->return_str(); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_reverse_client_interface_meth_taking_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_interface(::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(i)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_reverse_client_interface_meth_taking_optional_interface(testsuite_reverse_client_interface_ref instance, testsuite_reverse_client_interface_ref i) { - auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(i, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::toCpp(instance)->meth_taking_optional_interface(::djinni::c_api::OptionalPtrTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>>::toCpp(i)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_create() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::ReverseClientInterface::create(); return ::djinni::c_api::InterfaceTranslator<::testsuite::ReverseClientInterface>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_reverse_client_interface_ref) } diff --git a/test-suite/generated-src/c/reverse_client_interface.h b/test-suite/generated-src/c/reverse_client_interface.h index 1f4cb3f8..9bdc8a9b 100644 --- a/test-suite/generated-src/c/reverse_client_interface.h +++ b/test-suite/generated-src/c/reverse_client_interface.h @@ -11,19 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_reverse_client_interface_ref; -typedef djinni_proxy_class_ref testsuite_reverse_client_interface_proxy_class_ref; - -typedef struct -{ - djinni_string_ref (*return_str)(void *); - djinni_string_ref (*meth_taking_interface)(void *, testsuite_reverse_client_interface_ref); - djinni_string_ref (*meth_taking_optional_interface)(void *, testsuite_reverse_client_interface_ref); - testsuite_reverse_client_interface_ref (*create)(void *); -} testsuite_reverse_client_interface_method_defs; - -testsuite_reverse_client_interface_proxy_class_ref testsuite_reverse_client_interface_proxy_class_new(const testsuite_reverse_client_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_reverse_client_interface_ref testsuite_reverse_client_interface_new(testsuite_reverse_client_interface_proxy_class_ref proxy_class, void *opaque); djinni_string_ref testsuite_reverse_client_interface_return_str(testsuite_reverse_client_interface_ref instance); diff --git a/test-suite/generated-src/c/sample_interface.cpp b/test-suite/generated-src/c/sample_interface.cpp index 1cc3bdae..751f7b75 100644 --- a/test-suite/generated-src/c/sample_interface.cpp +++ b/test-suite/generated-src/c/sample_interface.cpp @@ -5,20 +5,4 @@ #include "djinni_c_translators.hpp" #include "sample_interface.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct SampleInterface_Proxy: public Proxy_Parent, public ::testsuite::SampleInterface { - SampleInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~SampleInterface_Proxy() override = default; - -}; - -testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - diff --git a/test-suite/generated-src/c/sample_interface.h b/test-suite/generated-src/c/sample_interface.h index 38ad0312..82e1784a 100644 --- a/test-suite/generated-src/c/sample_interface.h +++ b/test-suite/generated-src/c/sample_interface.h @@ -14,16 +14,6 @@ extern "C" { * this one will be used */ typedef djinni_interface_ref testsuite_sample_interface_ref; -typedef djinni_proxy_class_ref testsuite_sample_interface_proxy_class_ref; - -typedef struct -{ - void *reserved[1]; -} testsuite_sample_interface_method_defs; - -testsuite_sample_interface_proxy_class_ref testsuite_sample_interface_proxy_class_new(const testsuite_sample_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_sample_interface_ref testsuite_sample_interface_new(testsuite_sample_interface_proxy_class_ref proxy_class, void *opaque); #ifdef __cplusplus } // extern "C" diff --git a/test-suite/generated-src/c/second_listener.cpp b/test-suite/generated-src/c/second_listener.cpp index 7113ca08..f311bf6d 100644 --- a/test-suite/generated-src/c/second_listener.cpp +++ b/test-suite/generated-src/c/second_listener.cpp @@ -5,29 +5,11 @@ #include "djinni_c_translators.hpp" #include "second_listener.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct SecondListener_Proxy: public Proxy_Parent, public ::testsuite::SecondListener { - SecondListener_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~SecondListener_Proxy() override = default; - - void second() override { - Proxy_Parent::getProxyClass().methodDefs().second(Proxy_Parent::getOpaque()); - } - -}; - -testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - void testsuite_second_listener_second(testsuite_second_listener_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::SecondListener>::toCpp(instance)->second(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/second_listener.h b/test-suite/generated-src/c/second_listener.h index 08cb7229..95e52056 100644 --- a/test-suite/generated-src/c/second_listener.h +++ b/test-suite/generated-src/c/second_listener.h @@ -11,16 +11,6 @@ extern "C" { /** Used for ObjC multiple inheritance tests */ typedef djinni_interface_ref testsuite_second_listener_ref; -typedef djinni_proxy_class_ref testsuite_second_listener_proxy_class_ref; - -typedef struct -{ - void (*second)(void *); -} testsuite_second_listener_method_defs; - -testsuite_second_listener_proxy_class_ref testsuite_second_listener_proxy_class_new(const testsuite_second_listener_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_second_listener_ref testsuite_second_listener_new(testsuite_second_listener_proxy_class_ref proxy_class, void *opaque); void testsuite_second_listener_second(testsuite_second_listener_ref instance); diff --git a/test-suite/generated-src/c/set_record.cpp b/test-suite/generated-src/c/set_record.cpp index ece4858e..25096fdf 100644 --- a/test-suite/generated-src/c/set_record.cpp +++ b/test-suite/generated-src/c/set_record.cpp @@ -7,27 +7,27 @@ testsuite_set_record_ref testsuite_set_record_new(djinni_array_ref set, djinni_array_ref iset) { - return ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::make(::djinni::c_api::SetTranslator::toCpp(set, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::SetTranslator::toCpp(iset, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + return ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::make(::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>::toCpp(set), ::djinni::c_api::SetTranslator<::djinni::c_api::Int32Translator>::toCpp(iset)); } djinni_array_ref testsuite_set_record_get_set(testsuite_set_record_ref instance) { - return ::djinni::c_api::SetTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set); } void testsuite_set_record_set_set(testsuite_set_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set = ::djinni::c_api::SetTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).set = ::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>::toCpp(value); } djinni_array_ref testsuite_set_record_get_iset(testsuite_set_record_ref instance) { - return ::djinni::c_api::SetTranslator::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::SetTranslator<::djinni::c_api::Int32Translator>::fromCpp(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset); } void testsuite_set_record_set_iset(testsuite_set_record_ref instance, djinni_array_ref value) { - ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset = ::djinni::c_api::SetTranslator::toCpp(value, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); + ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(instance).iset = ::djinni::c_api::SetTranslator<::djinni::c_api::Int32Translator>::toCpp(value); } diff --git a/test-suite/generated-src/c/test_array.cpp b/test-suite/generated-src/c/test_array.cpp index d1543d91..05cdb8f3 100644 --- a/test-suite/generated-src/c/test_array.cpp +++ b/test-suite/generated-src/c/test_array.cpp @@ -6,44 +6,36 @@ #include "test_array.hpp" #include "vec2.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct TestArray_Proxy: public Proxy_Parent, public ::testsuite::TestArray { - TestArray_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~TestArray_Proxy() override = default; - -}; - -testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testStringArray(::djinni::c_api::ListTranslator::toCpp(a, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestArray::testStringArray(::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::toCpp(a)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_array_ref testsuite_test_array_testIntArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testIntArray(::djinni::c_api::ListTranslator::toCpp(a, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::ListTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestArray::testIntArray(::djinni::c_api::ListTranslator<::djinni::c_api::Int32Translator>::toCpp(a)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_array_ref testsuite_test_array_testRecordArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testRecordArray(::djinni::c_api::ListTranslator<::testsuite::Vec2>::toCpp(a, [](auto&& value) { return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::toCpp(std::forward(value)); })); - return ::djinni::c_api::ListTranslator<::testsuite::Vec2>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::RecordTranslator<::testsuite::Vec2>::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestArray::testRecordArray(::djinni::c_api::ListTranslator<::djinni::c_api::RecordTranslator<::testsuite::Vec2>>::toCpp(a)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::RecordTranslator<::testsuite::Vec2>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } djinni_array_ref testsuite_test_array_testArrayOfArray(djinni_array_ref a) { - auto retValue = ::testsuite::TestArray::testArrayOfArray(::djinni::c_api::ListTranslator>::toCpp(a, [](auto&& value) { return ::djinni::c_api::ListTranslator::toCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); })); - return ::djinni::c_api::ListTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::ListTranslator::fromCpp(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestArray::testArrayOfArray(::djinni::c_api::ListTranslator<::djinni::c_api::ListTranslator<::djinni::c_api::Int32Translator>>::toCpp(a)); + return ::djinni::c_api::ListTranslator<::djinni::c_api::ListTranslator<::djinni::c_api::Int32Translator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } diff --git a/test-suite/generated-src/c/test_array.h b/test-suite/generated-src/c/test_array.h index 6df798d0..fb656204 100644 --- a/test-suite/generated-src/c/test_array.h +++ b/test-suite/generated-src/c/test_array.h @@ -11,19 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_test_array_ref; -typedef djinni_proxy_class_ref testsuite_test_array_proxy_class_ref; - -typedef struct -{ - djinni_array_ref (*testStringArray)(void *, djinni_array_ref); - djinni_array_ref (*testIntArray)(void *, djinni_array_ref); - djinni_array_ref (*testRecordArray)(void *, djinni_array_ref); - djinni_array_ref (*testArrayOfArray)(void *, djinni_array_ref); -} testsuite_test_array_method_defs; - -testsuite_test_array_proxy_class_ref testsuite_test_array_proxy_class_new(const testsuite_test_array_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_test_array_ref testsuite_test_array_new(testsuite_test_array_proxy_class_ref proxy_class, void *opaque); djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a); diff --git a/test-suite/generated-src/c/test_duration.cpp b/test-suite/generated-src/c/test_duration.cpp index a8312e78..92dbf73a 100644 --- a/test-suite/generated-src/c/test_duration.cpp +++ b/test-suite/generated-src/c/test_duration.cpp @@ -7,140 +7,164 @@ #include "test_duration.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct TestDuration_Proxy: public Proxy_Parent, public ::testsuite::TestDuration { - TestDuration_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~TestDuration_Proxy() override = default; - -}; - -testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::hoursString(::djinni::c_api::DurationTranslator>::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_test_duration_minutesString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::minutesString(::djinni::c_api::DurationTranslator>::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_test_duration_secondsString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::secondsString(::djinni::c_api::DurationTranslator>::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_test_duration_millisString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::millisString(::djinni::c_api::DurationTranslator::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_test_duration_microsString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::microsString(::djinni::c_api::DurationTranslator::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_string_ref testsuite_test_duration_nanosString(djinni_number_ref dt) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::nanosString(::djinni::c_api::DurationTranslator::toCpp(dt)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } djinni_number_ref testsuite_test_duration_hours(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::hours(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_minutes(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::minutes(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_seconds(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::seconds(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_millis(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::millis(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_micros(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::micros(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_nanos(int32_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::nanos(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_hoursf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::hoursf(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_minutesf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::minutesf(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_secondsf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::secondsf(count); return ::djinni::c_api::DurationTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_millisf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::millisf(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_microsf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::microsf(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_nanosf(double count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::nanosf(count); return ::djinni::c_api::DurationTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } djinni_number_ref testsuite_test_duration_box(int64_t count) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestDuration::box(count); - return ::djinni::c_api::OptionalTranslator::fromCpp>>>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::DurationTranslator>::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OptionalTranslator>>, ::djinni::c_api::DurationTranslator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_number_ref) } int64_t testsuite_test_duration_unbox(djinni_number_ref dt) { - auto retValue = ::testsuite::TestDuration::unbox(::djinni::c_api::OptionalTranslator::toCpp>>>(dt, [](auto&& value) { return ::djinni::c_api::DurationTranslator>::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestDuration::unbox(::djinni::c_api::OptionalTranslator>>, ::djinni::c_api::DurationTranslator>>::toCpp(dt)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int64_t) } diff --git a/test-suite/generated-src/c/test_duration.h b/test-suite/generated-src/c/test_duration.h index 11e0567b..9a3efb49 100644 --- a/test-suite/generated-src/c/test_duration.h +++ b/test-suite/generated-src/c/test_duration.h @@ -11,35 +11,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_test_duration_ref; -typedef djinni_proxy_class_ref testsuite_test_duration_proxy_class_ref; - -typedef struct -{ - djinni_string_ref (*hoursString)(void *, djinni_number_ref); - djinni_string_ref (*minutesString)(void *, djinni_number_ref); - djinni_string_ref (*secondsString)(void *, djinni_number_ref); - djinni_string_ref (*millisString)(void *, djinni_number_ref); - djinni_string_ref (*microsString)(void *, djinni_number_ref); - djinni_string_ref (*nanosString)(void *, djinni_number_ref); - djinni_number_ref (*hours)(void *, int32_t); - djinni_number_ref (*minutes)(void *, int32_t); - djinni_number_ref (*seconds)(void *, int32_t); - djinni_number_ref (*millis)(void *, int32_t); - djinni_number_ref (*micros)(void *, int32_t); - djinni_number_ref (*nanos)(void *, int32_t); - djinni_number_ref (*hoursf)(void *, double); - djinni_number_ref (*minutesf)(void *, double); - djinni_number_ref (*secondsf)(void *, double); - djinni_number_ref (*millisf)(void *, double); - djinni_number_ref (*microsf)(void *, double); - djinni_number_ref (*nanosf)(void *, double); - djinni_number_ref (*box)(void *, int64_t); - int64_t (*unbox)(void *, djinni_number_ref); -} testsuite_test_duration_method_defs; - -testsuite_test_duration_proxy_class_ref testsuite_test_duration_proxy_class_new(const testsuite_test_duration_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_test_duration_ref testsuite_test_duration_new(testsuite_test_duration_proxy_class_ref proxy_class, void *opaque); djinni_string_ref testsuite_test_duration_hoursString(djinni_number_ref dt); diff --git a/test-suite/generated-src/c/test_helpers.cpp b/test-suite/generated-src/c/test_helpers.cpp index 9c11d6f7..da18a378 100644 --- a/test-suite/generated-src/c/test_helpers.cpp +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -14,27 +14,13 @@ #include "test_helpers.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct TestHelpers_Proxy: public Proxy_Parent, public ::testsuite::TestHelpers { - TestHelpers_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~TestHelpers_Proxy() override = default; - -}; - -testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - /** Method with documentation */ testsuite_set_record_ref testsuite_test_helpers_get_set_record() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_set_record(); return ::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_set_record_ref) } /** @@ -44,164 +30,220 @@ testsuite_set_record_ref testsuite_test_helpers_get_set_record() */ bool testsuite_test_helpers_check_set_record(testsuite_set_record_ref rec) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_set_record(::djinni::c_api::RecordTranslator<::testsuite::SetRecord>::toCpp(rec)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } testsuite_primitive_list_ref testsuite_test_helpers_get_primitive_list() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_primitive_list(); return ::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_primitive_list_ref) } bool testsuite_test_helpers_check_primitive_list(testsuite_primitive_list_ref pl) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_primitive_list(::djinni::c_api::RecordTranslator<::testsuite::PrimitiveList>::toCpp(pl)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } testsuite_nested_collection_ref testsuite_test_helpers_get_nested_collection() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_nested_collection(); return ::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_nested_collection_ref) } bool testsuite_test_helpers_check_nested_collection(testsuite_nested_collection_ref nc) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_nested_collection(::djinni::c_api::RecordTranslator<::testsuite::NestedCollection>::toCpp(nc)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } djinni_keyval_array_ref testsuite_test_helpers_get_map() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_map(); - return ::djinni::c_api::MapTranslator::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_keyval_array_ref) } bool testsuite_test_helpers_check_map(djinni_keyval_array_ref m) { - auto retValue = ::testsuite::TestHelpers::check_map(::djinni::c_api::MapTranslator::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::check_map(::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::toCpp(m)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } djinni_keyval_array_ref testsuite_test_helpers_get_empty_map() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_empty_map(); - return ::djinni::c_api::MapTranslator::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::fromCpp(key), ::djinni::c_api::NumberTranslator::fromCpp(value)); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_keyval_array_ref) } bool testsuite_test_helpers_check_empty_map(djinni_keyval_array_ref m) { - auto retValue = ::testsuite::TestHelpers::check_empty_map(::djinni::c_api::MapTranslator::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::StringTranslator::toCpp(key), ::djinni::c_api::NumberTranslator::toCpp(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::check_empty_map(::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>::toCpp(m)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } testsuite_map_list_record_ref testsuite_test_helpers_get_map_list_record() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_map_list_record(); return ::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_map_list_record_ref) } bool testsuite_test_helpers_check_map_list_record(testsuite_map_list_record_ref m) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_map_list_record(::djinni::c_api::RecordTranslator<::testsuite::MapListRecord>::toCpp(m)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } void testsuite_test_helpers_check_client_interface_ascii(testsuite_client_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_client_interface_ascii(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } void testsuite_test_helpers_check_client_interface_nonascii(testsuite_client_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_client_interface_nonascii(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } void testsuite_test_helpers_check_client_interface_args(testsuite_client_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_client_interface_args(::djinni::c_api::InterfaceTranslator<::testsuite::ClientInterface>::toCpp(i)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } void testsuite_test_helpers_check_enum_map(djinni_keyval_array_ref m) { - ::testsuite::TestHelpers::check_enum_map(::djinni::c_api::MapTranslator<::testsuite::color, std::string>::toCpp(m, [](auto key, auto value) { return std::make_pair(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCppBoxed(key), ::djinni::c_api::StringTranslator::toCpp(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + ::testsuite::TestHelpers::check_enum_map(::djinni::c_api::MapTranslator<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::StringTranslator>::toCpp(m)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } void testsuite_test_helpers_check_enum(testsuite_color c) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_enum(::djinni::c_api::EnumTranslator<::testsuite::color, testsuite_color>::toCpp(c)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } testsuite_user_token_ref testsuite_test_helpers_token_id(testsuite_user_token_ref t) { - auto retValue = ::testsuite::TestHelpers::token_id(::djinni::c_api::OptionalTranslator::toSharedPtrCpp>(t, [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(std::forward(value)); })); - return ::djinni::c_api::OptionalTranslator::fromSharedPtrCpp>(std::move(retValue), [](auto&& value) { return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::token_id(::djinni::c_api::OptionalPtrTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>>::toCpp(t)); + return ::djinni::c_api::OptionalPtrTranslator<::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_user_token_ref) } testsuite_user_token_ref testsuite_test_helpers_create_cpp_token() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::create_cpp_token(); return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_user_token_ref) } void testsuite_test_helpers_check_cpp_token(testsuite_user_token_ref t) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_cpp_token(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } int64_t testsuite_test_helpers_cpp_token_id(testsuite_user_token_ref t) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::cpp_token_id(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int64_t) } void testsuite_test_helpers_check_token_type(testsuite_user_token_ref t, djinni_string_ref type) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestHelpers::check_token_type(::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(t), ::djinni::c_api::StringTranslator::toCpp(type)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } -djinni_optional_int32_t testsuite_test_helpers_return_none() +djinni_optional_int32 testsuite_test_helpers_return_none() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::return_none(); - return ::djinni::c_api::OptionalTranslator::fromCppPrimitive, djinni_optional_int32_t>(std::move(retValue)); + return ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int32>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_optional_int32) } /** Ensures that we generate integer translation code */ testsuite_assorted_primitives_ref testsuite_test_helpers_assorted_primitives_id(testsuite_assorted_primitives_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::assorted_primitives_id(::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(i)); return ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_assorted_primitives_ref) } djinni_binary_ref testsuite_test_helpers_id_binary(djinni_binary_ref b) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::id_binary(::djinni::c_api::BinaryTranslator::toCpp(b)); return ::djinni::c_api::BinaryTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_binary_ref) } djinni_future_ref testsuite_test_helpers_get_async_result() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_async_result(); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_future_ref testsuite_test_helpers_future_roundtrip(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::future_roundtrip(::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::toCpp(f)); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_future_ref testsuite_test_helpers_async_early_throw() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::async_early_throw(); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return std::forward(value); })); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return std::forward(value); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::void_async_method(::djinni::c_api::FutureTranslator<::djinni::c_api::VoidTranslator>::toCpp(f)); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::VoidTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } /** @@ -210,63 +252,83 @@ djinni_future_ref testsuite_test_helpers_void_async_method(djinni_future_ref f) */ djinni_future_ref testsuite_test_helpers_add_one_if_present(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::FutureTranslator>::toCpp(f, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); }); })); - return ::djinni::c_api::FutureTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::add_one_if_present(::djinni::c_api::FutureTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int32Translator>>::toCpp(f)); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int32Translator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } /** try-catches the future f, and accesses the error message, and returns as a string. */ djinni_future_ref testsuite_test_helpers_return_exception_string(djinni_future_ref f) { - auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::FutureTranslator::toCpp(f, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::return_exception_string(::djinni::c_api::FutureTranslator<::djinni::c_api::Int32Translator>::toCpp(f)); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_future_ref testsuite_test_helpers_check_async_interface(testsuite_async_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_async_interface(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_future_ref testsuite_test_helpers_check_async_composition(testsuite_async_interface_ref i) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::check_async_composition(::djinni::c_api::InterfaceTranslator<::testsuite::AsyncInterface>::toCpp(i)); - return ::djinni::c_api::FutureTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::FutureTranslator<::djinni::c_api::StringTranslator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_future_ref) } djinni_array_ref testsuite_test_helpers_get_optional_list() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_optional_list(); - return ::djinni::c_api::ListTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } bool testsuite_test_helpers_check_optional_list(djinni_array_ref ol) { - auto retValue = ::testsuite::TestHelpers::check_optional_list(::djinni::c_api::ListTranslator>::toCpp(ol, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::check_optional_list(::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::toCpp(ol)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } djinni_array_ref testsuite_test_helpers_get_optional_set() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_optional_set(); - return ::djinni::c_api::SetTranslator>::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::OptionalTranslator::fromCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }); }); + return ::djinni::c_api::SetTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_array_ref) } bool testsuite_test_helpers_check_optional_set(djinni_array_ref os) { - auto retValue = ::testsuite::TestHelpers::check_optional_set(::djinni::c_api::SetTranslator>::toCpp(os, [](auto&& value) { return ::djinni::c_api::OptionalTranslator::toCpp>(std::forward(value), [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::check_optional_set(::djinni::c_api::SetTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::toCpp(os)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } djinni_keyval_array_ref testsuite_test_helpers_get_optional_map() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestHelpers::get_optional_map(); - return ::djinni::c_api::MapTranslator, std::experimental::optional>::fromCpp(std::move(retValue), [](auto key, auto value) { return std::make_pair(::djinni::c_api::OptionalTranslator::fromCpp>(key, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::fromCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); })); }); + return ::djinni::c_api::MapTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>, ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_keyval_array_ref) } bool testsuite_test_helpers_check_optional_map(djinni_keyval_array_ref om) { - auto retValue = ::testsuite::TestHelpers::check_optional_map(::djinni::c_api::MapTranslator, std::experimental::optional>::toCpp(om, [](auto key, auto value) { return std::make_pair(::djinni::c_api::OptionalTranslator::toCpp>(key, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }), ::djinni::c_api::OptionalTranslator::toCpp>(value, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); })); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::check_optional_map(::djinni::c_api::MapTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>, ::djinni::c_api::OptionalTranslator, ::djinni::c_api::StringTranslator>>::toCpp(om)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(bool) } diff --git a/test-suite/generated-src/c/test_helpers.h b/test-suite/generated-src/c/test_helpers.h index ddaef091..6469298f 100644 --- a/test-suite/generated-src/c/test_helpers.h +++ b/test-suite/generated-src/c/test_helpers.h @@ -25,54 +25,6 @@ extern "C" { * Indented third line of multi-line documentation.) */ typedef djinni_interface_ref testsuite_test_helpers_ref; -typedef djinni_proxy_class_ref testsuite_test_helpers_proxy_class_ref; - -typedef struct -{ - testsuite_set_record_ref (*get_set_record)(void *); - bool (*check_set_record)(void *, testsuite_set_record_ref); - testsuite_primitive_list_ref (*get_primitive_list)(void *); - bool (*check_primitive_list)(void *, testsuite_primitive_list_ref); - testsuite_nested_collection_ref (*get_nested_collection)(void *); - bool (*check_nested_collection)(void *, testsuite_nested_collection_ref); - djinni_keyval_array_ref (*get_map)(void *); - bool (*check_map)(void *, djinni_keyval_array_ref); - djinni_keyval_array_ref (*get_empty_map)(void *); - bool (*check_empty_map)(void *, djinni_keyval_array_ref); - testsuite_map_list_record_ref (*get_map_list_record)(void *); - bool (*check_map_list_record)(void *, testsuite_map_list_record_ref); - void (*check_client_interface_ascii)(void *, testsuite_client_interface_ref); - void (*check_client_interface_nonascii)(void *, testsuite_client_interface_ref); - void (*check_client_interface_args)(void *, testsuite_client_interface_ref); - void (*check_enum_map)(void *, djinni_keyval_array_ref); - void (*check_enum)(void *, testsuite_color); - testsuite_user_token_ref (*token_id)(void *, testsuite_user_token_ref); - testsuite_user_token_ref (*create_cpp_token)(void *); - void (*check_cpp_token)(void *, testsuite_user_token_ref); - int64_t (*cpp_token_id)(void *, testsuite_user_token_ref); - void (*check_token_type)(void *, testsuite_user_token_ref, djinni_string_ref); - djinni_optional_int32_t (*return_none)(void *); - testsuite_assorted_primitives_ref (*assorted_primitives_id)(void *, testsuite_assorted_primitives_ref); - djinni_binary_ref (*id_binary)(void *, djinni_binary_ref); - djinni_future_ref (*get_async_result)(void *); - djinni_future_ref (*future_roundtrip)(void *, djinni_future_ref); - djinni_future_ref (*async_early_throw)(void *); - djinni_future_ref (*void_async_method)(void *, djinni_future_ref); - djinni_future_ref (*add_one_if_present)(void *, djinni_future_ref); - djinni_future_ref (*return_exception_string)(void *, djinni_future_ref); - djinni_future_ref (*check_async_interface)(void *, testsuite_async_interface_ref); - djinni_future_ref (*check_async_composition)(void *, testsuite_async_interface_ref); - djinni_array_ref (*get_optional_list)(void *); - bool (*check_optional_list)(void *, djinni_array_ref); - djinni_array_ref (*get_optional_set)(void *); - bool (*check_optional_set)(void *, djinni_array_ref); - djinni_keyval_array_ref (*get_optional_map)(void *); - bool (*check_optional_map)(void *, djinni_keyval_array_ref); -} testsuite_test_helpers_method_defs; - -testsuite_test_helpers_proxy_class_ref testsuite_test_helpers_proxy_class_new(const testsuite_test_helpers_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_test_helpers_ref testsuite_test_helpers_new(testsuite_test_helpers_proxy_class_ref proxy_class, void *opaque); /** Method with documentation */ testsuite_set_record_ref testsuite_test_helpers_get_set_record(); @@ -124,7 +76,7 @@ int64_t testsuite_test_helpers_cpp_token_id(testsuite_user_token_ref t); void testsuite_test_helpers_check_token_type(testsuite_user_token_ref t, djinni_string_ref type); -djinni_optional_int32_t testsuite_test_helpers_return_none(); +djinni_optional_int32 testsuite_test_helpers_return_none(); /** Ensures that we generate integer translation code */ testsuite_assorted_primitives_ref testsuite_test_helpers_assorted_primitives_id(testsuite_assorted_primitives_ref i); diff --git a/test-suite/generated-src/c/test_outcome.cpp b/test-suite/generated-src/c/test_outcome.cpp index abcd0bcb..72d1f6bc 100644 --- a/test-suite/generated-src/c/test_outcome.cpp +++ b/test-suite/generated-src/c/test_outcome.cpp @@ -8,68 +8,68 @@ #include "nested_outcome.hpp" #include "test_outcome.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct TestOutcome_Proxy: public Proxy_Parent, public ::testsuite::TestOutcome { - TestOutcome_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~TestOutcome_Proxy() override = default; - -}; - -testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::getSuccessOutcome(); - return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OutcomeTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_outcome_ref) } djinni_outcome_ref testsuite_test_outcome_getErrorOutcome() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::getErrorOutcome(); - return ::djinni::c_api::OutcomeTranslator::fromCpp(std::move(retValue), [](auto&& value) { return ::djinni::c_api::StringTranslator::fromCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::fromCpp(std::forward(value)); }); + return ::djinni::c_api::OutcomeTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int32Translator>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_outcome_ref) } djinni_string_ref testsuite_test_outcome_putSuccessOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestOutcome::putSuccessOutcome(::djinni::c_api::OutcomeTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int32Translator>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } int32_t testsuite_test_outcome_putErrorOutcome(djinni_outcome_ref x) { - auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::OutcomeTranslator::toCpp(x, [](auto&& value) { return ::djinni::c_api::StringTranslator::toCpp(std::forward(value)); }, [](auto&& value) { return ::djinni::c_api::NumberTranslator::toCpp(std::forward(value)); })); + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestOutcome::putErrorOutcome(::djinni::c_api::OutcomeTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int32Translator>::toCpp(x)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int32_t) } testsuite_nested_outcome_ref testsuite_test_outcome_getNestedSuccessOutcome() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::getNestedSuccessOutcome(); return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_nested_outcome_ref) } testsuite_nested_outcome_ref testsuite_test_outcome_getNestedErrorOutcome() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::getNestedErrorOutcome(); return ::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_nested_outcome_ref) } int32_t testsuite_test_outcome_putNestedSuccessOutcome(testsuite_nested_outcome_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::putNestedSuccessOutcome(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(x)); return std::move(retValue); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(int32_t) } djinni_string_ref testsuite_test_outcome_putNestedErrorOutcome(testsuite_nested_outcome_ref x) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::testsuite::TestOutcome::putNestedErrorOutcome(::djinni::c_api::RecordTranslator<::testsuite::NestedOutcome>::toCpp(x)); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } diff --git a/test-suite/generated-src/c/test_outcome.h b/test-suite/generated-src/c/test_outcome.h index 5d3c329b..8cd8d33d 100644 --- a/test-suite/generated-src/c/test_outcome.h +++ b/test-suite/generated-src/c/test_outcome.h @@ -12,23 +12,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_test_outcome_ref; -typedef djinni_proxy_class_ref testsuite_test_outcome_proxy_class_ref; - -typedef struct -{ - djinni_outcome_ref (*getSuccessOutcome)(void *); - djinni_outcome_ref (*getErrorOutcome)(void *); - djinni_string_ref (*putSuccessOutcome)(void *, djinni_outcome_ref); - int32_t (*putErrorOutcome)(void *, djinni_outcome_ref); - testsuite_nested_outcome_ref (*getNestedSuccessOutcome)(void *); - testsuite_nested_outcome_ref (*getNestedErrorOutcome)(void *); - int32_t (*putNestedSuccessOutcome)(void *, testsuite_nested_outcome_ref); - djinni_string_ref (*putNestedErrorOutcome)(void *, testsuite_nested_outcome_ref); -} testsuite_test_outcome_method_defs; - -testsuite_test_outcome_proxy_class_ref testsuite_test_outcome_proxy_class_new(const testsuite_test_outcome_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_test_outcome_ref testsuite_test_outcome_new(testsuite_test_outcome_proxy_class_ref proxy_class, void *opaque); djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome(); diff --git a/test-suite/generated-src/c/test_static_method_language.cpp b/test-suite/generated-src/c/test_static_method_language.cpp index 10b665a1..90a7ead4 100644 --- a/test-suite/generated-src/c/test_static_method_language.cpp +++ b/test-suite/generated-src/c/test_static_method_language.cpp @@ -5,29 +5,15 @@ #include "djinni_c_translators.hpp" #include "test_static_method_language.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct TestStaticMethodLanguage_Proxy: public Proxy_Parent, public ::testsuite::TestStaticMethodLanguage { - TestStaticMethodLanguage_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~TestStaticMethodLanguage_Proxy() override = default; - -}; - -testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - /** * callable only from c++. platform code should compile and link even without * c++ providing the implementation. */ void testsuite_test_static_method_language_test_method() { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::testsuite::TestStaticMethodLanguage::test_method(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/test_static_method_language.h b/test-suite/generated-src/c/test_static_method_language.h index 9d1fffb8..0bc39f0d 100644 --- a/test-suite/generated-src/c/test_static_method_language.h +++ b/test-suite/generated-src/c/test_static_method_language.h @@ -10,16 +10,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_test_static_method_language_ref; -typedef djinni_proxy_class_ref testsuite_test_static_method_language_proxy_class_ref; - -typedef struct -{ - void (*test_method)(void *); -} testsuite_test_static_method_language_method_defs; - -testsuite_test_static_method_language_proxy_class_ref testsuite_test_static_method_language_proxy_class_new(const testsuite_test_static_method_language_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_test_static_method_language_ref testsuite_test_static_method_language_new(testsuite_test_static_method_language_proxy_class_ref proxy_class, void *opaque); /** * callable only from c++. platform code should compile and link even without diff --git a/test-suite/generated-src/c/throwing_interface.cpp b/test-suite/generated-src/c/throwing_interface.cpp index 82ac9db6..8ddd045e 100644 --- a/test-suite/generated-src/c/throwing_interface.cpp +++ b/test-suite/generated-src/c/throwing_interface.cpp @@ -5,29 +5,11 @@ #include "djinni_c_translators.hpp" #include "throwing_interface.hpp" -using Proxy_Parent = ::djinni::Proxy; -struct ThrowingInterface_Proxy: public Proxy_Parent, public ::testsuite::ThrowingInterface { - ThrowingInterface_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~ThrowingInterface_Proxy() override = default; - - void throw_exception() override { - Proxy_Parent::getProxyClass().methodDefs().throw_exception(Proxy_Parent::getOpaque()); - } - -}; - -testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::ThrowingInterface>::toCpp(instance)->throw_exception(); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } diff --git a/test-suite/generated-src/c/throwing_interface.h b/test-suite/generated-src/c/throwing_interface.h index f1690ac1..155a2c82 100644 --- a/test-suite/generated-src/c/throwing_interface.h +++ b/test-suite/generated-src/c/throwing_interface.h @@ -10,16 +10,6 @@ extern "C" { #endif // __cplusplus typedef djinni_interface_ref testsuite_throwing_interface_ref; -typedef djinni_proxy_class_ref testsuite_throwing_interface_proxy_class_ref; - -typedef struct -{ - void (*throw_exception)(void *); -} testsuite_throwing_interface_method_defs; - -testsuite_throwing_interface_proxy_class_ref testsuite_throwing_interface_proxy_class_new(const testsuite_throwing_interface_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_throwing_interface_ref testsuite_throwing_interface_new(testsuite_throwing_interface_proxy_class_ref proxy_class, void *opaque); void testsuite_throwing_interface_throw_exception(testsuite_throwing_interface_ref instance); diff --git a/test-suite/generated-src/c/user_token.cpp b/test-suite/generated-src/c/user_token.cpp index 08208556..73f67a23 100644 --- a/test-suite/generated-src/c/user_token.cpp +++ b/test-suite/generated-src/c/user_token.cpp @@ -12,27 +12,26 @@ struct UserToken_Proxy: public Proxy_Parent, public ::testsuite::UserToken { ~UserToken_Proxy() override = default; std::string whoami() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().whoami(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::StringTranslator::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; + auto returnValue = ::djinni::c_api::Ref(Proxy_Parent::getProxyClass().methodDefs().whoami(Proxy_Parent::getOpaque())); + return ::djinni::c_api::StringTranslator::toCpp(returnValue.get()); } }; testsuite_user_token_proxy_class_ref testsuite_user_token_proxy_class_new(const testsuite_user_token_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); + return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::makeProxyClass(method_defs, opaque_deallocator); } testsuite_user_token_ref testsuite_user_token_new(testsuite_user_token_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); + return ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::makeProxy(proxy_class, opaque); } djinni_string_ref testsuite_user_token_whoami(testsuite_user_token_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UserToken>::toCpp(instance)->whoami(); return ::djinni::c_api::StringTranslator::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(djinni_string_ref) } diff --git a/test-suite/generated-src/c/uses_single_language_listeners.cpp b/test-suite/generated-src/c/uses_single_language_listeners.cpp index e8add5c8..da4ef450 100644 --- a/test-suite/generated-src/c/uses_single_language_listeners.cpp +++ b/test-suite/generated-src/c/uses_single_language_listeners.cpp @@ -6,70 +6,34 @@ #include "uses_single_language_listeners.hpp" #include -using Proxy_Parent = ::djinni::Proxy; -struct UsesSingleLanguageListeners_Proxy: public Proxy_Parent, public ::testsuite::UsesSingleLanguageListeners { - UsesSingleLanguageListeners_Proxy(::djinni::ProxyClass *proxyClass, void *opaque): Proxy_Parent(proxyClass, opaque) {} - - ~UsesSingleLanguageListeners_Proxy() override = default; - - void callForObjC(const /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override { - auto l_c = ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::fromCpp(l); - Proxy_Parent::getProxyClass().methodDefs().callForObjC(Proxy_Parent::getOpaque(), l_c); - djinni_ref_release(l_c); - } - - /*not-null*/ std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForObjC(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - - void callForJava(const /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> & l) override { - auto l_c = ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::fromCpp(l); - Proxy_Parent::getProxyClass().methodDefs().callForJava(Proxy_Parent::getOpaque(), l_c); - djinni_ref_release(l_c); - } - - /*not-null*/ std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override { - auto returnValue = Proxy_Parent::getProxyClass().methodDefs().returnForJava(Proxy_Parent::getOpaque()); - - auto returnValue_cpp = ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::toCpp(returnValue); - djinni_ref_release(returnValue); - return returnValue_cpp; - } - -}; - -testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator) { - return ::djinni::c_api::ProxyTranslator::makeClass(method_defs, opaque_deallocator); -} - -testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque) { - return ::djinni::c_api::ProxyTranslator::make(proxy_class, opaque); -} - void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForObjC(::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::toCpp(l)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } testsuite_objc_only_listener_ref testsuite_uses_single_language_listeners_returnForObjC(testsuite_uses_single_language_listeners_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForObjC(); return ::djinni::c_api::InterfaceTranslator<::testsuite::ObjcOnlyListener>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_objc_only_listener_ref) } void testsuite_uses_single_language_listeners_callForJava(testsuite_uses_single_language_listeners_ref instance, testsuite_java_only_listener_ref l) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->callForJava(::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::toCpp(l)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(void) } testsuite_java_only_listener_ref testsuite_uses_single_language_listeners_returnForJava(testsuite_uses_single_language_listeners_ref instance) { + DJINNI_HANDLE_EXCEPTION_PROLOGUE auto retValue = ::djinni::c_api::InterfaceTranslator<::testsuite::UsesSingleLanguageListeners>::toCpp(instance)->returnForJava(); return ::djinni::c_api::InterfaceTranslator<::testsuite::JavaOnlyListener>::fromCpp(std::move(retValue)); + DJINNI_HANDLE_EXCEPTION_EPILOGUE(testsuite_java_only_listener_ref) } diff --git a/test-suite/generated-src/c/uses_single_language_listeners.h b/test-suite/generated-src/c/uses_single_language_listeners.h index cff0fa05..a737b2c4 100644 --- a/test-suite/generated-src/c/uses_single_language_listeners.h +++ b/test-suite/generated-src/c/uses_single_language_listeners.h @@ -16,19 +16,6 @@ extern "C" { * on references to interfaces they don't need. */ typedef djinni_interface_ref testsuite_uses_single_language_listeners_ref; -typedef djinni_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_ref; - -typedef struct -{ - void (*callForObjC)(void *, testsuite_objc_only_listener_ref); - testsuite_objc_only_listener_ref (*returnForObjC)(void *); - void (*callForJava)(void *, testsuite_java_only_listener_ref); - testsuite_java_only_listener_ref (*returnForJava)(void *); -} testsuite_uses_single_language_listeners_method_defs; - -testsuite_uses_single_language_listeners_proxy_class_ref testsuite_uses_single_language_listeners_proxy_class_new(const testsuite_uses_single_language_listeners_method_defs *method_defs, djinni_opaque_deallocator opaque_deallocator); - -testsuite_uses_single_language_listeners_ref testsuite_uses_single_language_listeners_new(testsuite_uses_single_language_listeners_proxy_class_ref proxy_class, void *opaque); void testsuite_uses_single_language_listeners_callForObjC(testsuite_uses_single_language_listeners_ref instance, testsuite_objc_only_listener_ref l); From 0acac732ae3c7a2e2454529c5d7c60d0dfc77063 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Thu, 21 Aug 2025 15:54:36 -0500 Subject: [PATCH 36/42] avoid using vector for making it very low overhead --- support-lib/cpp/djinni_c.cpp | 32 +++++++++-------- support-lib/cpp/djinni_c.h | 11 ++++-- .../c/tests/DjinniCAPI_tests.cpp | 36 ++++++++++++++++++- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp index a4564022..a5f27769 100644 --- a/support-lib/cpp/djinni_c.cpp +++ b/support-lib/cpp/djinni_c.cpp @@ -1,6 +1,6 @@ #include "djinni_c.h" #include "djinni_c_types.hpp" -#include +#include using namespace djinni; @@ -151,22 +151,27 @@ struct ExceptionHandler { ExceptionHandler(void *opaque, djinni_exception_handler handler) : opaque(opaque), handler(handler) {} - static void push(void *opaque, djinni_exception_handler handler) { - exceptionHandlers.emplace_back(opaque, handler); + static void push(djinni_exception_handler *handler) { + auto &handlerPtr = getHandlerPtr(); + handler->__reserved__ = handlerPtr; + handlerPtr = handler; } static void pop() { - if (exceptionHandlers.empty()) { + auto &handlerPtr = getHandlerPtr(); + if (handlerPtr == nullptr) { std::fprintf(stderr, "Unbalanced djinni_exception_handler_push and " "djinni_exception_handler_pop calls"); std::abort(); } - exceptionHandlers.pop_back(); + handlerPtr = + reinterpret_cast(handlerPtr->__reserved__); } static void notify(const char *error) { - if (exceptionHandlers.empty()) { + auto *handler = getHandlerPtr(); + if (handler == nullptr) { std::fprintf(stderr, "No exception handler registered with " "djinni_exception_handler_push to handle error: %s", @@ -174,21 +179,20 @@ struct ExceptionHandler { std::abort(); } - auto handler = exceptionHandlers.back(); - handler.handler(handler.opaque, error); + handler->callback(handler->opaque, error); } private: - static thread_local std::vector exceptionHandlers; + static djinni_exception_handler *&getHandlerPtr() { + thread_local djinni_exception_handler *kHandler = nullptr; + return kHandler; + } }; -thread_local std::vector ExceptionHandler::exceptionHandlers; - } // namespace djinni::c_api -void djinni_exception_handler_push(void *opaque, - djinni_exception_handler handler) { - djinni::c_api::ExceptionHandler::push(opaque, handler); +void djinni_exception_handler_push(djinni_exception_handler *handler) { + djinni::c_api::ExceptionHandler::push(handler); } void djinni_exception_handler_pop() { djinni::c_api::ExceptionHandler::pop(); } diff --git a/support-lib/cpp/djinni_c.h b/support-lib/cpp/djinni_c.h index 35d48cd7..de1131cb 100644 --- a/support-lib/cpp/djinni_c.h +++ b/support-lib/cpp/djinni_c.h @@ -23,7 +23,7 @@ typedef djinni_ref djinni_proxy_class_ref; typedef void (*djinni_binary_deallocator)(uint8_t *, size_t, void *); typedef void (*djinni_opaque_deallocator)(void *); -typedef void (*djinni_exception_handler)(void *, const char *); +typedef void (*djinni_exception_callback)(void *, const char *); void djinni_ref_retain(djinni_ref ref); void djinni_ref_release(djinni_ref ref); @@ -75,8 +75,13 @@ void djinni_array_set_value(djinni_array_ref array, size_t index, djinni_date_ref djinni_date_new(uint64_t epoch_time_ms); uint64_t djinni_date_get_epoch(djinni_date_ref date); -void djinni_exception_handler_push(void *opaque, - djinni_exception_handler handler); +typedef struct { + void *opaque; + djinni_exception_callback callback; + void *__reserved__; +} djinni_exception_handler; + +void djinni_exception_handler_push(djinni_exception_handler *handler); void djinni_exception_handler_pop(); void djinni_exception_notify(const char *error); diff --git a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp index 58384da4..fde31d1e 100644 --- a/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -553,13 +553,47 @@ static void handleException(void *opaque, const char *message) { TEST(DjinniCAPI, canCatchExceptions) { std::string errorMessage; - djinni_exception_handler_push(&errorMessage, &handleException); + djinni_exception_handler handler; + handler.opaque = &errorMessage; + handler.callback = &handleException; + + djinni_exception_handler_push(&handler); auto result = CRef(testsuite_test_helpers_async_early_throw()); djinni_exception_handler_pop(); ASSERT_EQ(std::string("error"), errorMessage); } +TEST(DjinniCAPI, supportsNestedExceptionHandler) { + + std::string errorMessage; + std::string errorMessageInner; + + djinni_exception_handler handler; + handler.opaque = &errorMessage; + handler.callback = &handleException; + + djinni_exception_handler_push(&handler); + { + djinni_exception_handler nestedHandler; + nestedHandler.opaque = &errorMessageInner; + nestedHandler.callback = &handleException; + djinni_exception_handler_push(&nestedHandler); + auto result = CRef(testsuite_test_helpers_async_early_throw()); + + djinni_exception_handler_pop(); + + ASSERT_EQ(std::string(""), errorMessage); + ASSERT_EQ(std::string("error"), errorMessageInner); + } + + auto result = CRef(testsuite_test_helpers_async_early_throw()); + ASSERT_EQ(std::string("error"), errorMessage); + ASSERT_EQ(std::string("error"), errorMessageInner); + + djinni_exception_handler_pop(); +} + static void futureIntCallback(void *opaque, djinni_ref value, djinni_ref error) { auto result = djinni_number_get_int64(value); From 07f81c4b6b32f0d564fc83614e661db44a12640b Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 22 Aug 2025 08:51:21 -0500 Subject: [PATCH 37/42] disable bzlmod --- .bazelrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.bazelrc b/.bazelrc index 3ee13222..317fafd6 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1,2 @@ +common --noenable_bzlmod build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder From d8ce16352928c7ae2ce17eadd281d60b1edf9cdb Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Fri, 22 Aug 2025 15:06:16 -0500 Subject: [PATCH 38/42] more cleanup --- .bazelrc | 1 - MODULE.bazel | 6 + MODULE.bazel.lock | 110 ++++++++++++++++++ test-suite/BUILD | 21 ++-- test-suite/djinni/enum.djinni | 1 - test-suite/generated-src/c/color.h | 5 +- .../java/com/dropbox/djinni/test/Color.java | 5 +- test-suite/generated-src/objc/DBColor.h | 5 +- test-suite/generated-src/ts/test.ts | 5 +- 9 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 MODULE.bazel create mode 100644 MODULE.bazel.lock diff --git a/.bazelrc b/.bazelrc index 317fafd6..3ee13222 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,2 +1 @@ -common --noenable_bzlmod build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000..00bb1836 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,6 @@ +############################################################################### +# Bazel now uses Bzlmod by default to manage external dependencies. +# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. +# +# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 +############################################################################### diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 00000000..f5cd5310 --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,110 @@ +{ + "lockFileVersion": 11, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/source.json": "7e3a9adf473e9af076ae485ed649d5641ad50ec5c11718103f34de03170d94ad", + "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", + "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/source.json": "082ed5f9837901fada8c68c2f3ddc958bb22b6d654f71dd73f3df30d45d4b749", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.11.0/source.json": "c73d9ef4268c91bd0c1cd88f1f9dfa08e814b1dbe89b5f594a9f08ba0244d206", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/21.7/source.json": "bbe500720421e582ff2d18b0802464205138c06056f443184de39fbb8187b09b", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/source.json": "1f1ba6fea244b616de4a554a0f4983c91a9301640c8fe0dd1d410254115c8430", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/7.6.1/source.json": "8f3f3076554e1558e8e468b2232991c510ecbcbed9e6f8c06ac31c93bcf38362", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/source.json": "a075731e1b46bc8425098512d038d416e966ab19684a10a34f4741295642fc35", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/source.json": "d57902c052424dfda0e71646cb12668d39c4620ee0544294d9d941e7d12bc3a9", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", + "https://bcr.bazel.build/modules/rules_python/0.22.1/source.json": "57226905e783bae7c37c2dd662be078728e48fa28ee4324a7eabcafb5a43d014", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.1/source.json": "a96f95e02123320aa015b956f29c00cb818fa891ef823d55148e1a362caacf29", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/source.json": "f1ef7d3f9e0e26d4b23d1c39b5f5de71f584dd7d1b4ef83d9bbba6ec7a6a6459", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.3/MODULE.bazel": "6a9c02f19a24dcedb05572b2381446e27c272cd383aed11d41d99da9e3167a72", + "https://bcr.bazel.build/modules/zlib/1.3/source.json": "b6b43d0737af846022636e6e255fd4a96fee0d34f08f3830e6e0bac51465c37c" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=", + "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_apple_cc": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf", + "attributes": {} + }, + "local_config_apple_cc_toolchains": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf_toolchains", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "apple_support~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@platforms//host:extension.bzl%host_platform": { + "general": { + "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", + "usagesDigest": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "host_platform": { + "bzlFile": "@@platforms//host:extension.bzl", + "ruleClassName": "host_platform_repo", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [] + } + } + } +} diff --git a/test-suite/BUILD b/test-suite/BUILD index 1c09aa36..77530f33 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -1,4 +1,4 @@ -# load("@build_bazel_rules_apple//apple:macos.bzl", "macos_unit_test") +load("@build_bazel_rules_apple//apple:macos.bzl", "macos_unit_test") load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library", "swift_test") load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "objc_library") @@ -179,16 +179,15 @@ java_test( ], ) -# Uncomment before merging. This rule causes issues for me. -# macos_unit_test( -# name = "djinni-objc-tests", -# minimum_os_version = "10.10", -# deps = [ -# "djinni-tests-objc", -# "djinni-tests-objcxx", -# "djinni-tests-objc-proto", -# ], -# ) +macos_unit_test( + name = "djinni-objc-tests", + minimum_os_version = "10.10", + deps = [ + "djinni-tests-objc", + "djinni-tests-objcxx", + "djinni-tests-objc-proto", + ], +) EMSCRIPTEN_LINKOPTS = [ "--bind", # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript diff --git a/test-suite/djinni/enum.djinni b/test-suite/djinni/enum.djinni index bed9d6b2..a7dbeee5 100644 --- a/test-suite/djinni/enum.djinni +++ b/test-suite/djinni/enum.djinni @@ -1,5 +1,4 @@ # This is a test -# my dude! color = enum { red; orange; diff --git a/test-suite/generated-src/c/color.h b/test-suite/generated-src/c/color.h index ffb3a7fc..ebf61053 100644 --- a/test-suite/generated-src/c/color.h +++ b/test-suite/generated-src/c/color.h @@ -9,10 +9,7 @@ extern "C" { #endif // __cplusplus -/** - * This is a test - * my dude! - */ +/** This is a test */ enum testsuite_color { testsuite_color_RED = 0, testsuite_color_ORANGE = 1, diff --git a/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java b/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java index 006fe63f..82c50f23 100644 --- a/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java +++ b/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java @@ -6,10 +6,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -/** - * This is a test - * my dude! - */ +/** This is a test */ public enum Color { RED, ORANGE, diff --git a/test-suite/generated-src/objc/DBColor.h b/test-suite/generated-src/objc/DBColor.h index a9b1b0e9..ecfc38b4 100644 --- a/test-suite/generated-src/objc/DBColor.h +++ b/test-suite/generated-src/objc/DBColor.h @@ -3,10 +3,7 @@ #import -/** - * This is a test - * my dude! - */ +/** This is a test */ typedef NS_ENUM(NSInteger, DBColor) { DBColorRed = 0, diff --git a/test-suite/generated-src/ts/test.ts b/test-suite/generated-src/ts/test.ts index f888ec53..f7d8e4bd 100644 --- a/test-suite/generated-src/ts/test.ts +++ b/test-suite/generated-src/ts/test.ts @@ -499,10 +499,7 @@ export interface UserToken { whoami(): string; } -/** - * This is a test - * my dude! - */ +/** This is a test */ export enum Color { RED = 0, ORANGE = 1, From 2c047725b4c6890ad5e60c5b32fe16a8d1435554 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 25 Aug 2025 11:09:56 -0500 Subject: [PATCH 39/42] revert bazel upgrade as this ends up being a can of worm --- .bazelrc | 2 +- .bazelversion | 2 +- MODULE.bazel | 6 --- MODULE.bazel.lock | 110 ---------------------------------------------- WORKSPACE | 52 ++++++++-------------- 5 files changed, 20 insertions(+), 152 deletions(-) delete mode 100644 MODULE.bazel delete mode 100644 MODULE.bazel.lock diff --git a/.bazelrc b/.bazelrc index 3ee13222..d473c76a 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1 @@ -build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder +build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder --nouse_workers_with_dexbuilder \ No newline at end of file diff --git a/.bazelversion b/.bazelversion index 468c41f9..04edabda 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.2.1 \ No newline at end of file +5.4.1 \ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel deleted file mode 100644 index 00bb1836..00000000 --- a/MODULE.bazel +++ /dev/null @@ -1,6 +0,0 @@ -############################################################################### -# Bazel now uses Bzlmod by default to manage external dependencies. -# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. -# -# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 -############################################################################### diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock deleted file mode 100644 index f5cd5310..00000000 --- a/MODULE.bazel.lock +++ /dev/null @@ -1,110 +0,0 @@ -{ - "lockFileVersion": 11, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/source.json": "7e3a9adf473e9af076ae485ed649d5641ad50ec5c11718103f34de03170d94ad", - "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", - "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/source.json": "082ed5f9837901fada8c68c2f3ddc958bb22b6d654f71dd73f3df30d45d4b749", - "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", - "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.11.0/source.json": "c73d9ef4268c91bd0c1cd88f1f9dfa08e814b1dbe89b5f594a9f08ba0244d206", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/21.7/source.json": "bbe500720421e582ff2d18b0802464205138c06056f443184de39fbb8187b09b", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/source.json": "1f1ba6fea244b616de4a554a0f4983c91a9301640c8fe0dd1d410254115c8430", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/7.6.1/source.json": "8f3f3076554e1558e8e468b2232991c510ecbcbed9e6f8c06ac31c93bcf38362", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/source.json": "a075731e1b46bc8425098512d038d416e966ab19684a10a34f4741295642fc35", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/source.json": "d57902c052424dfda0e71646cb12668d39c4620ee0544294d9d941e7d12bc3a9", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", - "https://bcr.bazel.build/modules/rules_python/0.22.1/source.json": "57226905e783bae7c37c2dd662be078728e48fa28ee4324a7eabcafb5a43d014", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.1/source.json": "a96f95e02123320aa015b956f29c00cb818fa891ef823d55148e1a362caacf29", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/source.json": "f1ef7d3f9e0e26d4b23d1c39b5f5de71f584dd7d1b4ef83d9bbba6ec7a6a6459", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", - "https://bcr.bazel.build/modules/zlib/1.3/MODULE.bazel": "6a9c02f19a24dcedb05572b2381446e27c272cd383aed11d41d99da9e3167a72", - "https://bcr.bazel.build/modules/zlib/1.3/source.json": "b6b43d0737af846022636e6e255fd4a96fee0d34f08f3830e6e0bac51465c37c" - }, - "selectedYankedVersions": {}, - "moduleExtensions": { - "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=", - "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_apple_cc": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf", - "attributes": {} - }, - "local_config_apple_cc_toolchains": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf_toolchains", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [ - [ - "apple_support~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@platforms//host:extension.bzl%host_platform": { - "general": { - "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", - "usagesDigest": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "host_platform": { - "bzlFile": "@@platforms//host:extension.bzl", - "ruleClassName": "host_platform_repo", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [] - } - } - } -} diff --git a/WORKSPACE b/WORKSPACE index acbf834f..fb714a68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,51 +1,43 @@ -workspace(name = "snap_djinni") +workspace(name="snap_djinni") load("//bzl:deps.bzl", "djinni_deps") - djinni_deps() - load("//bzl:scala_config.bzl", "djinni_scala_config") - djinni_scala_config() - load("//bzl:setup_deps.bzl", "djinni_setup_deps") - djinni_setup_deps() # --- Everything below is only used for examples and tests load("//bzl:android_configure.bzl", "android_configure") - android_configure(name = "local_config_android") - load("@local_config_android//:android_configure.bzl", "android_workspace") - android_workspace() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -build_bazel_rules_apple_version = "1.1.3" - +build_bazel_rules_apple_version = "1.0.1" http_archive( name = "build_bazel_rules_apple", - sha256 = "f94e6dddf74739ef5cb30f000e13a2a613f6ebfa5e63588305a71fce8a8a9911", - url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz".format(build_bazel_rules_apple_version), + sha256 = "36072d4f3614d309d6a703da0dfe48684ec4c65a89611aeb9590b45af7a3e592", + url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz" + .format(build_bazel_rules_apple_version), ) -build_bazel_rules_swift_version = "1.14.0" - +build_bazel_rules_swift_version = "1.0.0" http_archive( name = "build_bazel_rules_swift", - sha256 = "9b0064197e3b6c123cf7cbd377ad5071ac020cbd208fcc23dbc9f3928baf4fa2", - url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz".format(build_bazel_rules_swift_version), + sha256 = "12057b7aa904467284eee640de5e33853e51d8e31aae50b3fb25d2823d51c6b8", + url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz" + .format(build_bazel_rules_swift_version), ) -build_bazel_apple_support_version = "1.15.1" - +build_bazel_apple_support_version = "1.0.0" http_archive( name = "build_bazel_apple_support", - sha256 = "c4bb2b7367c484382300aee75be598b92f847896fb31bbd22f3a2346adf66a80", - url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz".format(build_bazel_apple_support_version), + sha256 = "df317473b5894dd8eb432240d209271ebc83c76bb30c55481374b36ddf1e4fd1", + url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz" + .format(build_bazel_apple_support_version), ) rules_kotlin_version = "legacy-1.3.0" @@ -57,20 +49,14 @@ http_archive( sha256 = "4fd769fb0db5d3c6240df8a9500515775101964eebdf85a3f9f0511130885fde", ) -load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") -load("@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies") -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") - load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies") +load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") apple_rules_dependencies() - -apple_support_dependencies() - swift_rules_dependencies() - -swift_rules_extra_dependencies() +apple_support_dependencies() kotlin_repositories() kt_register_toolchains() @@ -79,18 +65,16 @@ emsdk_version = "3.1.8" http_archive( name = "emsdk", - sha256 = "7795202a50ab09958d8943f79110de4386ff0f38bf4c97ec1a896885f28fe1cf", strip_prefix = "emsdk-%s/bazel" % emsdk_version, type = "zip", url = "https://github.com/emscripten-core/emsdk/archive/%s.zip" % emsdk_version, + sha256 = "7795202a50ab09958d8943f79110de4386ff0f38bf4c97ec1a896885f28fe1cf", ) load("@emsdk//:deps.bzl", emsdk_deps = "deps") - emsdk_deps() load("@emsdk//:emscripten_deps.bzl", emsdk_emscripten_deps = "emscripten_deps") - emsdk_emscripten_deps() http_archive( @@ -98,4 +82,4 @@ http_archive( strip_prefix = "googletest-1.13.0", url = "https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz", integrity = "sha256-rX/boR6gEcHZJbMonPSvLGajUuGNTHJkOS/q116Rk2M=", -) +) \ No newline at end of file From 9dffe62bb59e50d7bdd34d4c451d8e26c4385e68 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 25 Aug 2025 11:10:42 -0500 Subject: [PATCH 40/42] adding c tests in the test command --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0e91e13c..7f98ba00 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -31,7 +31,7 @@ jobs: run: ./ci/generate.sh - name: Test - run: bazel test --test_output=all //test-suite:djinni-java-tests //test-suite:djinni-objc-tests + run: bazel test --test_output=all //test-suite:djinni-java-tests //test-suite:djinni-objc-tests //test-suite:djinni-tests-c - name: External Test working-directory: external-test From 268eade6b1123d4059cff9ff93c0473d5f596172 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 25 Aug 2025 11:16:22 -0500 Subject: [PATCH 41/42] fixed incorrect workspace --- .bazelrc | 2 +- .bazelversion | 2 +- WORKSPACE | 27 +++++++++++++-------------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.bazelrc b/.bazelrc index d473c76a..8b9d0d7d 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1 +1 @@ -build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder --nouse_workers_with_dexbuilder \ No newline at end of file +build --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 --incompatible_java_common_parameters=false --define=android_dexmerger_tool=d8_dexmerger --define=android_incremental_dexing_tool=d8_dexbuilder --nouse_workers_with_dexbuilder diff --git a/.bazelversion b/.bazelversion index 04edabda..ade65226 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -5.4.1 \ No newline at end of file +5.4.1 diff --git a/WORKSPACE b/WORKSPACE index fb714a68..c6e44381 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -16,28 +16,25 @@ android_workspace() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -build_bazel_rules_apple_version = "1.0.1" +build_bazel_rules_apple_version = "1.1.3" http_archive( name = "build_bazel_rules_apple", - sha256 = "36072d4f3614d309d6a703da0dfe48684ec4c65a89611aeb9590b45af7a3e592", - url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz" - .format(build_bazel_rules_apple_version), + sha256 = "f94e6dddf74739ef5cb30f000e13a2a613f6ebfa5e63588305a71fce8a8a9911", + url = "https://github.com/bazelbuild/rules_apple/releases/download/{0}/rules_apple.{0}.tar.gz" .format(build_bazel_rules_apple_version), ) -build_bazel_rules_swift_version = "1.0.0" +build_bazel_rules_swift_version = "1.14.0" http_archive( name = "build_bazel_rules_swift", - sha256 = "12057b7aa904467284eee640de5e33853e51d8e31aae50b3fb25d2823d51c6b8", - url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz" - .format(build_bazel_rules_swift_version), + sha256 = "9b0064197e3b6c123cf7cbd377ad5071ac020cbd208fcc23dbc9f3928baf4fa2", + url = "https://github.com/bazelbuild/rules_swift/releases/download/{0}/rules_swift.{0}.tar.gz" .format(build_bazel_rules_swift_version), ) -build_bazel_apple_support_version = "1.0.0" +build_bazel_apple_support_version = "1.15.1" http_archive( name = "build_bazel_apple_support", - sha256 = "df317473b5894dd8eb432240d209271ebc83c76bb30c55481374b36ddf1e4fd1", - url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz" - .format(build_bazel_apple_support_version), + sha256 = "c4bb2b7367c484382300aee75be598b92f847896fb31bbd22f3a2346adf66a80", + url = "https://github.com/bazelbuild/apple_support/releases/download/{0}/apple_support.{0}.tar.gz" .format(build_bazel_apple_support_version), ) rules_kotlin_version = "legacy-1.3.0" @@ -50,13 +47,15 @@ http_archive( ) load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") -load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies") load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") +load("@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies") +load("@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies",) load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") apple_rules_dependencies() -swift_rules_dependencies() apple_support_dependencies() +swift_rules_dependencies() +swift_rules_extra_dependencies() kotlin_repositories() kt_register_toolchains() From 1a40a6811905f0874fd177a72ae9f64c4ffc9157 Mon Sep 17 00:00:00 2001 From: Simon Corsin Date: Mon, 25 Aug 2025 20:03:08 -0500 Subject: [PATCH 42/42] one more fix --- test-suite/BUILD | 3 +-- test-suite/handwritten-src/cpp/optional.hpp | 4 ++-- .../handwritten-src/objc/tests/DBNestedCollectionTests.mm | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test-suite/BUILD b/test-suite/BUILD index 77530f33..48aede8d 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -103,8 +103,7 @@ objc_library( ]), copts = [ "-ObjC++", - "-std=c++17", - "-fcoroutines-ts", + "-std=c++20", ], includes = [ "generated-src/objc", diff --git a/test-suite/handwritten-src/cpp/optional.hpp b/test-suite/handwritten-src/cpp/optional.hpp index ab01c835..a4dfe50d 100644 --- a/test-suite/handwritten-src/cpp/optional.hpp +++ b/test-suite/handwritten-src/cpp/optional.hpp @@ -866,7 +866,7 @@ namespace std template struct hash> { - typedef typename hash::result_type result_type; + typedef std::size_t result_type; typedef std::experimental::optional argument_type; constexpr result_type operator()(argument_type const& arg) const { @@ -877,7 +877,7 @@ namespace std template struct hash> { - typedef typename hash::result_type result_type; + typedef std::size_t result_type; typedef std::experimental::optional argument_type; constexpr result_type operator()(argument_type const& arg) const { diff --git a/test-suite/handwritten-src/objc/tests/DBNestedCollectionTests.mm b/test-suite/handwritten-src/objc/tests/DBNestedCollectionTests.mm index b12cddf1..42059939 100644 --- a/test-suite/handwritten-src/objc/tests/DBNestedCollectionTests.mm +++ b/test-suite/handwritten-src/objc/tests/DBNestedCollectionTests.mm @@ -5,7 +5,7 @@ using namespace testsuite; -static NestedCollection cppNestedCollection { { {u8"String1", u8"String2"}, {u8"StringA", u8"StringB"} } }; +static NestedCollection cppNestedCollection { { {"String1", "String2"}, {"StringA", "StringB"} } }; static DBNestedCollection *objcNestedCollection = [DBNestedCollection nestedCollectionWithSetList:@[ [NSSet setWithArray:@[ @"String1", @"String2" ]], [NSSet setWithArray:@[ @"StringA", @"StringB" ]],