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 diff --git a/WORKSPACE b/WORKSPACE index cb090799..c6e44381 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -75,3 +75,10 @@ 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=", +) \ No newline at end of file diff --git a/src/source/CGenerator.scala b/src/source/CGenerator.scala new file mode 100644 index 00000000..e7002e48 --- /dev/null +++ b/src/source/CGenerator.scala @@ -0,0 +1,408 @@ +package djinni + +import generatorTools.{Spec, q} + +import djinni.ast.{Doc, Field, Ident, Interface, ProtobufMessage, Record, TypeDecl, 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 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 + } + + 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\" {") + 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 = { + 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 + f(w) + w.wl + }) + } + + 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 + + w.wl("#include " + q(spec.cBaseLibIncludePrefix + "djinni_c.h")) + publicIncludes.foreach(w.wl) + + w.wl + + writeExternCBegin(w) + w.wl + + header(w) + + writeExternCEnd(w) + }) + + writeCFile(origin, ident, "cpp", (w: IndentWriter) => { + w.wl(s"""#include ${publicHeader(ident)}""") + w.wl("#include " + q(spec.cppBaseLibIncludePrefix + "djinni_c_translators.hpp")) + privateIncludes.foreach(w.wl) + + w.wl + impl(w) + }) + } + + override def generateEnum(origin: String, ident: Ident, doc: Doc, e: ast.Enum): Unit = { + 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) + writeEnumOptions(w, e, idCpp.enum, "=", enumCasePrefix) + writeEnumOptionAll(w, e, idCpp.enum, "=", enumCasePrefix) + } + + }, (w: IndentWriter) => { + }) + } + + 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(delimiter) + } + } + } + + private def writeParamList(w: IndentWriter, params: Seq[(String, String)]): Unit = { + writeDelimited(w, params, ", ")(t => { + 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) + + val typeResolver = new CTypeResolver(ident, spec, cppMarshal) + val prefix = resolveSymbolName(ident.name) + val typeName = resolveRefSymbolTypeName(ident) + + val resolvedFields = r.fields.map(f => (new ResolvedField(f, typeResolver.resolve(f.ty.resolved)))) + + 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}_new(""") + writeParamListWithResolvedFields(w, resolvedFields) + w.wl(");") + + 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}_new(""") + writeParamListWithResolvedFields(w, resolvedFields) + w.wl(") ") + + w.braced { + w.w(s"""return ::djinni::c_api::RecordTranslator<${selfCpp}>::make(""") + + writeDelimited(w, resolvedFields, ", ")(t => { + w.w(t.translator.toCpp(t.field.ident.name)) + }) + + w.wl(");") + } + + w.wl + + val toCppExpr = s"::djinni::c_api::RecordTranslator<${selfCpp}>::toCpp(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(resolvedField.field.ident)}" + 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.toCpp("value") + w.wl(s"${toCppExpr}.${idCpp.field(resolvedField.field.ident)} = ${toCppValue};") + } + w.wl + } + + }) + } + + private def isReservedIdentifier(ident: Ident): Boolean = { + ident.name == "new" || ident.name == "proxy_class_new" + } + + private def getConvertedParamName(resolvedField: ResolvedField): String = { + return resolvedField.field.ident.name + "_c" + } + + 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) + + 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 => 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 + + if (resolvedMethod.returnType.get.isRefType) { + w.wl(s"return ${resolvedMethod.returnType.get.toCpp(retValueName + ".get()")};") + } else { + w.wl(s"return ${resolvedMethod.returnType.get.toCpp(retValueName)};") + } + } else { + w.wl(");") + } + + } + + w.wl + } + } + w.wl + + return proxyClassName + } + + 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( + p, + typeResolver.resolve(p.ty.resolved)) + ), + m.ret.map(r => typeResolver.resolve(r.resolved)) + )) + + val prefix = resolveSymbolName(ident.name) + val typeName = resolveRefSymbolTypeName(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) => { + writeDoc(w, doc) + w.wl(s"""typedef djinni_interface_ref ${typeName};""") + + 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(");") + } + } + } + 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) + 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))) + } else { + writeParamList(w, (typeName, "instance") +: resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } + + w.wl(");") + + w.wl + } + + }, (w: IndentWriter) => { + 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::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::InterfaceTranslator<${selfCpp}>::makeProxy<${methodDefsStructName}, ${proxyClassNameCpp}>(proxy_class, opaque);") + } + w.wl + } + + for (resolvedMethod <- resolvedMethods) { + writeDoc(w, resolvedMethod.method.doc) + 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))) + } else { + writeParamList(w, (typeName, "instance") +: resolvedMethod.parameters.map(p => (p.translator.typename, p.field.ident.name))) + } + + w.wl(")") + w.braced { + w.wl("DJINNI_HANDLE_EXCEPTION_PROLOGUE") + val needsReturnValue = resolvedMethod.retTypename != "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::InterfaceTranslator<${selfCpp}>::toCpp(instance)->${resolvedMethod.method.ident.name}(""") + } + + writeDelimited(w, resolvedMethod.parameters, ", ")(p => { + w.w(p.translator.toCpp(p.field.ident.name)) + }) + + w.w(")") + + w.wl(";") + 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 new file mode 100644 index 00000000..2bcc41c2 --- /dev/null +++ b/src/source/CTypeResolver.scala @@ -0,0 +1,260 @@ +package djinni + +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 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) { + + val publicImports = mutable.TreeSet[String]() + val privateImports = mutable.TreeSet[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 + } + + def ptrTypeName(str: String): String = { + spec.cNamespace + str + "_ref" + } + + private def getPrimitiveOrNull(expr: MExpr): meta.MPrimitive = { + expr.base match { + case opaque: meta.MOpaque => + opaque match { + case MPrimitive(_, _, _, _, _, _, _, _) => return opaque.asInstanceOf[MPrimitive] + case _ => + } + case _ => + } + null + } + + private def isEnum(expr: MExpr): Boolean = { + expr.base match { + case meta.MDef(_, _, _, body) => { + body match { + case ast.Enum(_, _) => true + case _ => false + } + } + case meta.MExtern(_, _, defType, _, _, _, _, _, _, _, _, _, _, _, _) => { + defType match { + case DEnum => true + case _ => false + } + } + case _ => false + } + } + + private def resolveOptional(expr: MExpr, asBoxed: Boolean, parent: MExpr): CTypeTranslator = { + val resolved = resolve(expr, asBoxed || isEnum(expr)) + val primitive = getPrimitiveOrNull(expr) + + val cppOptionalTemplate = cppMarshal.fqTypename(parent) + + if (primitive != null && !asBoxed) { + 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, + false, + s"::djinni::c_api::PrimitiveOptionalTranslator<${cppOptionalTemplate}, ${typename}>" + ) + } else { + val sharedPtr = cppMarshal.bySharedPtr(expr) + + 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, asBoxed = true) + + new CTypeTranslator("djinni_array_ref", true, s"$translator<${resolved.translator}>") + } + + private def resolveMap(keyExpr: MExpr, valueExpr: MExpr): CTypeTranslator = { + 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) { + 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, "") + } + } + + private def updatePrivateImports(meta: Meta): Unit = { + for (r <- cppMarshal.hppReferences(meta, ident.name, forwardDeclareOnly = 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, body: ast.TypeDef, asBoxed: Boolean): CTypeTranslator = { + val cppTypename = cppMarshal.fqTypename(name, body) + val typename = valueTypeName(name) + doResolveEnum(typename, cppTypename, asBoxed) + } + + private def doResolveEnum(typename: String, cppTypename: String, asBoxed: Boolean): CTypeTranslator = { + if (asBoxed) { + new CTypeTranslator("djinni_number_ref", true, s"::djinni::c_api::BoxedEnumTranslator<${cppTypename}>") + } else { + new CTypeTranslator(typename, false, s"::djinni::c_api::EnumTranslator<${cppTypename}, ${typename}>") + } + } + + 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)) + + if (expr.args.nonEmpty) { + 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, + translator + ) + } else { + val argsTranslators = expr.args.map(a => resolve(a, asBoxed = true).translator).mkString(", ") + val translator = s"${c.translator}<${argsTranslators}>" + + return new CTypeTranslator(c.typename, true, translator) + } + } + + val isEnum = defType match { + case DEnum => true + case _ => false + } + + if (isEnum) { + doResolveEnum(c.typename, c.translator, asBoxed) + } else { + new CTypeTranslator(c.typename, true, c.translator) + } + } + + 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::EnumTranslator<${cppTypename}, ${typename}>" + } + 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") + } + } + + def resolve(expr: MExpr): CTypeTranslator = { + resolve(expr, asBoxed = false) + } + + private def resolve(expr: MExpr, asBoxed: Boolean): CTypeTranslator = { + expr.base match { + case meta.MParam(_) => { + throw new AssertionError("Unsupported MParam type") + } + case meta.MDef(name, _, _, body) => { + updatePrivateImports(expr.base) + addPublicImportFromDef(name) + body match { + case ast.Enum(_, _) => resolveEnum(name, body, asBoxed) + 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) + new CTypeTranslator( + "djinni_binary_ref", + isRefType = true, + s"::djinni::c_api::ProtobufTranslator<${cppMarshal.fqTypename(expr)}>" + ) + case opaque: meta.MOpaque => + opaque match { + case meta.MPrimitive(_, _, _, cName, _, _, _, _) => resolvePrimitive(cName, asBoxed) + 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, "::djinni::c_api::VoidTranslator") + } + } + } + +} \ No newline at end of file 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/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..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. */ @@ -111,6 +111,11 @@ object Main { var composerIncludePrefix: String = "" 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 = "" var swiftOutFolder: Option[File] = None var swiftModule: String = "Module" var swiftIdentStyle = IdentStyle.swiftDefault @@ -301,6 +306,16 @@ 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[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) + .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 = _) @@ -361,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) @@ -520,6 +536,11 @@ object Main { composerClassIdentStyle, composerFileIdentStyle, composerTsOutFolder, + cOutFolder, + cHeaderOutFolder, + cNamespace, + cBaseLibIncludePrefix, + cIncludePrefix, swiftOutFolder, swiftIdentStyle, swiftModule, diff --git a/src/source/YamlGenerator.scala b/src/source/YamlGenerator.scala index 1633a902..657bf37b 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]) { @@ -130,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) { "" @@ -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()) @@ -323,7 +336,14 @@ 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"), + getOptionalField(td, "c", "ignore_type_params", false) + ) ) 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..14cbfc94 100644 --- a/src/source/generator.scala +++ b/src/source/generator.scala @@ -113,6 +113,11 @@ package object generatorTools { composerClassIdentStyle: IdentConverter, composerFileIdentStyle: IdentConverter, composerTsOutFolder: Option[File], + cOutFolder: Option[File], + cHeaderOutFolder: Option[File], + cNamespace: String, + cBaseLibIncludePrefix: String, + cIncludePrefix: String, swiftOutFolder: Option[File], swiftIdentStyle: SwiftIdentStyle, swiftModule: String, @@ -333,6 +338,13 @@ package object generatorTools { } new ComposerGenerator(spec).generate(idl) } + if (spec.cOutFolder.isDefined) { + if (!spec.skipGeneration) { + createFolder("C", spec.cOutFolder.get) + createFolder("C header", spec.cHeaderOutFolder.get) + } + new CGenerator(spec).generate(idl) + } if (spec.tsOutFolder.isDefined) { if (!spec.skipGeneration) { createFolder("TypeScript", spec.tsOutFolder.get) @@ -480,13 +492,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..e4288f41 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,13 @@ object MExtern { translator: String, header: String ) + case class C( + typename: String, + publicHeader: String, + privateHeader: String, + translator: String, + ignoreTypeParams: Boolean + ) } 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..4e614fce 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 @@ -104,11 +105,16 @@ private object IdlParser extends RegexParsers { foundObjc = true foundJavascript = true foundSwift = true + foundC = true } case "c" => { 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 +138,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/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/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.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 new file mode 100644 index 00000000..f4328e9b --- /dev/null +++ b/support-lib/cpp/Future_c_translator.hpp @@ -0,0 +1,79 @@ +#pragma once + +#include "Future.hpp" +#include "djinni_c_ref.hpp" +#include "djinni_c_types.hpp" +#include "future_c.h" + +namespace djinni::c_api { + +class FutureException : public std::exception { +public: + FutureException(djinni_string_ref error); + ~FutureException() override; + + const char *what() const noexcept override; + +private: + Ref _error; +}; + +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 promise = new ::djinni::Promise(); + + djinni_future_on_complete(future, promise, &deallocatePromise, + &promiseCallback); + + return promise->getFuture(); + } + + static CType fromCpp(CppType &&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 outputFuture; + } +}; + +} // namespace djinni::c_api \ No newline at end of file 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 new file mode 100644 index 00000000..2972bf4d --- /dev/null +++ b/support-lib/cpp/Outcome_c.h @@ -0,0 +1,22 @@ +#pragma once + +#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 new file mode 100644 index 00000000..d66b6c81 --- /dev/null +++ b/support-lib/cpp/Outcome_c_translator.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include "Outcome_c.h" +#include "expected.hpp" + +namespace djinni::c_api { + +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 = CppType(Tr1::toCpp(success)); + djinni_ref_release(success); + return out; + } else { + auto error = djinni_outcome_get_error(outcome); + auto out = + ::djinni::make_unexpected(Tr2::toCpp(error)); + djinni_ref_release(error); + return out; + } + } + + static CType fromCpp(CppType &&outcome) { + if (outcome) { + 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 = Tr2::fromCpp(std::move(outcome.error())); + djinni_outcome_ref result = djinni_outcome_make_error(error); + djinni_ref_release(error); + return result; + } + } + + static CType fromCpp(const CppType &outcome) { + if (outcome) { + auto success = Tr1::fromCpp(outcome.value()); + djinni_outcome_ref result = djinni_outcome_make_success(success); + djinni_ref_release(success); + return result; + } else { + auto error = Tr2::fromCpp(outcome.error()); + djinni_outcome_ref result = djinni_outcome_make_error(error); + djinni_ref_release(error); + return result; + } + } +}; + +} // namespace djinni::c_api \ No newline at end of file diff --git a/support-lib/cpp/djinni_c.cpp b/support-lib/cpp/djinni_c.cpp new file mode 100644 index 00000000..a5f27769 --- /dev/null +++ b/support-lib/cpp/djinni_c.cpp @@ -0,0 +1,201 @@ +#include "djinni_c.h" +#include "djinni_c_types.hpp" +#include + +using namespace djinni; + +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_new(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_new_with_bytes(uint8_t *data, size_t length, void *opaque, + djinni_binary_deallocator 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_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_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) { + return fromC(binary)->data(); +} + +size_t djinni_binary_get_length(djinni_binary_ref binary) { + return fromC(binary)->length(); +} + +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_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_new(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_new(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_new(size_t 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) { + 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_new(uint64_t epoch_time_ms) { + return djinni_number_uint64_new(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(djinni_exception_handler *handler) { + auto &handlerPtr = getHandlerPtr(); + handler->__reserved__ = handlerPtr; + handlerPtr = handler; + } + + static void pop() { + auto &handlerPtr = getHandlerPtr(); + if (handlerPtr == nullptr) { + std::fprintf(stderr, "Unbalanced djinni_exception_handler_push and " + "djinni_exception_handler_pop calls"); + std::abort(); + } + + handlerPtr = + reinterpret_cast(handlerPtr->__reserved__); + } + + static void notify(const char *error) { + auto *handler = getHandlerPtr(); + if (handler == nullptr) { + std::fprintf(stderr, + "No exception handler registered with " + "djinni_exception_handler_push to handle error: %s", + error); + std::abort(); + } + + handler->callback(handler->opaque, error); + } + +private: + static djinni_exception_handler *&getHandlerPtr() { + thread_local djinni_exception_handler *kHandler = nullptr; + return kHandler; + } +}; + +} // namespace djinni::c_api + +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(); } + +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 new file mode 100644 index 00000000..de1131cb --- /dev/null +++ b/support-lib/cpp/djinni_c.h @@ -0,0 +1,119 @@ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +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; +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_callback)(void *, const char *); + +void djinni_ref_retain(djinni_ref ref); +void djinni_ref_release(djinni_ref ref); + +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_new(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); + +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_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, + 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_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_new(uint64_t epoch_time_ms); +uint64_t djinni_date_get_epoch(djinni_date_ref date); + +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); + +#define DJINNI_OPTIONAL_PRIMITIVE(__name__, __type__) \ + typedef struct { \ + __type__ value; \ + bool has_value; \ + } djinni_optional_##__name__; \ + \ + inline djinni_optional_##__name__ djinni_optional_##__name__##_make( \ + __type__ value) { \ + djinni_optional_##__name__ output; \ + output.value = value; \ + output.has_value = true; \ + return 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, 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" +#endif // __cplusplus 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.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_translators.hpp b/support-lib/cpp/djinni_c_translators.hpp new file mode 100644 index 00000000..b6ad7b7b --- /dev/null +++ b/support-lib/cpp/djinni_c_translators.hpp @@ -0,0 +1,407 @@ +#pragma once + +#include "djinni_c.h" +#include "djinni_c_ref.hpp" +#include "djinni_c_types.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace djinni::c_api { + +struct VoidTranslator { + using CppType = void; + using CType = void; + + static CType fromCpp() {} + static CppType toCpp() {} +}; + +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); +}; + +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 struct UIntTranslator { + using CppType = T; + using CType = djinni_number_ref; + + static CType fromCpp(CppType value) { + return djinni_number_uint64_new(static_cast(value)); + } + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_uint64(value)); + } +}; + +template struct SignedIntTranslator { + using CppType = T; + using CType = djinni_number_ref; + + static CType fromCpp(CppType value) { + return djinni_number_int64_new(static_cast(value)); + } + + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_int64(value)); + } +}; + +template struct FloatingPointTranslator { + using CppType = T; + using CType = djinni_number_ref; + + static CType fromCpp(CppType value) { + return djinni_number_double_new(static_cast(value)); + } + + static CppType toCpp(CType value) { + return static_cast(djinni_number_get_double(value)); + } +}; + +struct UInt8Translator : public UIntTranslator {}; +struct UInt16Translator : public UIntTranslator {}; +struct UInt32Translator : public UIntTranslator {}; +struct UInt64Translator : public UIntTranslator {}; + +struct Int8Translator : public SignedIntTranslator {}; +struct Int16Translator : public SignedIntTranslator {}; +struct Int32Translator : public SignedIntTranslator {}; +struct Int64Translator : public SignedIntTranslator {}; + +struct FloatTranslator : public FloatingPointTranslator {}; +struct DoubleTranslator : public FloatingPointTranslator {}; + +template struct PrimitiveOptionalTranslator { + using CppType = CppOpt; + using CType = COpt; + + static CType fromCpp(CppType value) { + CType out; + + if (value) { + out.has_value = true; + out.value = value.value(); + } else { + out.has_value = false; + out.value = 0; + } + + return out; + } + + static CppType toCpp(CType value) { + if (value.has_value) { + return CppType(value.value); + } else { + return CppType(); + } + } +}; + +template struct OptionalTranslator { + using CppType = CppOpt; + using CType = djinni_ref; + + static CType fromCpp(const CppType &value) { + if (!value) { + return nullptr; + } else { + return Tr::fromCpp(value.value()); + } + } + + static CType fromCpp(CppType &&value) { + if (!value) { + return nullptr; + } else { + return Tr::fromCpp(std::move(value.value())); + } + } + + static CppType toCpp(djinni_ref ptr) { + if (ptr == nullptr) { + return CppType(); + } else { + return CppType(Tr::toCpp(ptr)); + } + } +}; + +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 Tr::fromCpp(value); + } + } + + static CType fromCpp(CppType &&value) { + if (value == nullptr) { + return nullptr; + } else { + return Tr::fromCpp(std::move(value)); + } + } + + static CppType toCpp(CType value) { + if (value == nullptr) { + return nullptr; + } else { + return Tr::toCpp(value); + } + } +}; + +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(Tr::toCpp(item)); + djinni_ref_release(item); + } + + return output; + } + + 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 = Tr::fromCpp(value); + djinni_array_set_value(output, index++, converted); + djinni_ref_release(converted); + } + + return 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(Tr::toCpp(item)); + djinni_ref_release(item); + } + + return output; + } + + 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 = Tr::fromCpp(value); + djinni_array_set_value(output, index++, converted); + djinni_ref_release(converted); + } + + return 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); + output.try_emplace(TrK::toCpp(key), TrV::toCpp(value)); + djinni_ref_release(key); + djinni_ref_release(value); + } + + return output; + } + + 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 key = TrK::fromCpp(it.first); + auto value = TrV::fromCpp(it.second); + + djinni_keyval_array_set_entry(output, index++, key, value); + + djinni_ref_release(key); + djinni_ref_release(value); + } + return output; + } +}; + +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 CppType &toCpp(djinni_record_ref ref) { + auto *record = fromC>(ref); + if (record == nullptr) { + std::abort(); + } + + return record->data(); + } + + static CType fromCpp(CppType &&value) { return make(std::move(value)); } + + static CType fromCpp(const CppType &value) { return make(value); } +}; + +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(); + } + + return i->data(); + } + + static CType fromCpp(CppType value) { + Object *obj = new InterfaceHolder(std::move(value)); + return toC(obj); + } + + template + static djinni_proxy_class_ref + makeProxyClass(const PT *methodDefs, + djinni_opaque_deallocator opaqueDeallocator) { + auto *proxyClass = + new ::djinni::ProxyClass(*methodDefs, opaqueDeallocator); + return toC(proxyClass); + } + + template + static djinni_interface_ref makeProxy(djinni_proxy_class_ref proxyClassRef, + void *opaque) { + auto *proxyClass = fromC<::djinni::ProxyClass>(proxyClassRef); + + return fromCpp(std::make_shared

(proxyClass, opaque)); + } +}; + +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 djinni_number_int64_new(static_cast(value)); + } +}; + +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)); + } +}; + +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 CType fromCpp(const CppType &proto) { + auto length = proto.ByteSizeLong(); + auto output = djinni_binary_new(static_cast(length)); + + proto.SerializeToArray(djinni_binary_get_data(output), length); + + return output; + } +}; + +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/support-lib/cpp/djinni_c_types.cpp b/support-lib/cpp/djinni_c_types.cpp new file mode 100644 index 00000000..71923c61 --- /dev/null +++ b/support-lib/cpp/djinni_c_types.cpp @@ -0,0 +1,190 @@ +#include "djinni_c_types.hpp" +#include + +namespace djinni { + +constexpr size_t alignUp(size_t size, size_t alignment) { + return (size + alignment - 1) & ~(alignment - 1); +} + +template struct ArrayAllocator { + template static T *allocate(size_t size, Args &&...args) { + auto allocSize = + alignUp(sizeof(T), alignof(ValueType)) + (sizeof(ValueType) * size); + + auto *arrayRegion = ::operator new(allocSize); + + new (arrayRegion)(T)(std::forward(args)...); + + return reinterpret_cast(arrayRegion); + } + + constexpr inline static ValueType *getContainerStartPtr(T *object) { + return reinterpret_cast( + reinterpret_cast(object) + + alignUp(sizeof(T), alignof(ValueType))); + } + + constexpr inline static const ValueType * + getContainerStartPtr(const T *object) { + return reinterpret_cast( + reinterpret_cast(object) + + alignUp(sizeof(T), alignof(ValueType))); + } +}; + +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 { + return StringAllocator::getContainerStartPtr(this); +} + +size_t String::String::length() const { return _length; } + +String *String::make(const char *str, size_t length) { + auto *output = StringAllocator::allocate(length, length); + auto *data = StringAllocator::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() { + auto **data = ObjectArrayAllocator::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 { + Object *const *data = ObjectArrayAllocator::getContainerStartPtr(this); + auto *object = data[index]; + Object::retain(object); + return object; +} + +void ObjectArray::setObjectAtIndex(size_t index, Object *object) { + Object **data = ObjectArrayAllocator::getContainerStartPtr(this); + + Object::retain(object); + Object::release(data[index]); + data[index] = object; +} + +ObjectArray *ObjectArray::make(size_t length) { + auto *output = ObjectArrayAllocator::allocate(length, length); + + std::memset(ObjectArrayAllocator::getContainerStartPtr(output), 0, length); + + return output; +} + +Binary::Binary(uint8_t *data, size_t length) : _data(data), _length(length) {} + +Binary::~Binary() = default; + +uint8_t *Binary::data() const { return _data; } + +size_t Binary::length() const { return _length; } + +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) + : _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); +} + +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 new file mode 100644 index 00000000..6a31c416 --- /dev/null +++ b/support-lib/cpp/djinni_c_types.hpp @@ -0,0 +1,206 @@ +#pragma once + +#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 { +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(size_t index, Object *object); + + static ObjectArray *make(size_t length); + +private: + size_t _length; +}; + +class Binary : public Object { +public: + Binary(uint8_t *data, size_t length); + ~Binary() override; + + uint8_t *data() const; + size_t length() const; + +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; + BinaryWithDeallocator::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; +}; + +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; +}; + +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; +}; + +template class ProxyClass : public Object { +public: + using OpaqueDeallocator = void (*)(void *); + ProxyClass(const T &methodDefs, OpaqueDeallocator opaqueDeallocator) + : _methodDefs(methodDefs), _opaqueDeallocator(opaqueDeallocator) {} + ~ProxyClass() override = default; + + 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; +}; + +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 diff --git a/support-lib/cpp/future_c.h b/support-lib/cpp/future_c.h new file mode 100644 index 00000000..3af09015 --- /dev/null +++ b/support-lib/cpp/future_c.h @@ -0,0 +1,27 @@ +#pragma once + +#include "djinni_c.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +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" +#endif // __cplusplus \ No newline at end of file diff --git a/support-lib/dataref.yaml b/support-lib/dataref.yaml index c062a75e..b72ff210 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::DataRefTranslator' + public_header: '"$djinni_c.h"' + private_header: '"$DataRef_c_translator.hpp"' diff --git a/support-lib/dataview.yaml b/support-lib/dataview.yaml index 8dc0a2b6..3ff49ce8 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::DataViewTranslator' + public_header: '"$djinni_c.h"' + private_header: '"$DataView_c_translator.hpp"' diff --git a/support-lib/future.yaml b/support-lib/future.yaml index 67643711..596d7390 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::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 a7e57990..e4e158b4 100644 --- a/support-lib/outcome.yaml +++ b/support-lib/outcome.yaml @@ -47,3 +47,9 @@ swift: swiftxx: translator: '::djinni::swift::OutcomeAdaptor' header: '"Outcome_swift.hpp"' +c: + typename: 'djinni_outcome_ref' + translator: '::djinni::c_api::OutcomeTranslator' + public_header: '"$Outcome_c.h"' + private_header: '"$Outcome_c_translator.hpp"' + diff --git a/test-suite/BUILD b/test-suite/BUILD index 1ca43ba2..48aede8d 100644 --- a/test-suite/BUILD +++ b/test-suite/BUILD @@ -1,37 +1,76 @@ -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_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", + ], + ), + hdrs = glob([ + "generated-src/c/*.h", + ]), + includes = [ + "generated-src/c", + ], + 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", + ], +) + cc_library( name = "djinni-tests-jni-static", srcs = glob(["generated-src/jni/*.cpp"]), @@ -53,11 +92,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 +101,10 @@ objc_library( "handwritten-src/objc/**/*.h", "djinni/vendor/third-party/proto/objc/*.h", ]), + copts = [ + "-ObjC++", + "-std=c++20", + ], 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,18 +161,21 @@ 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( @@ -151,7 +192,7 @@ 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/djinni/enum.djinni b/test-suite/djinni/enum.djinni index 01bd26ae..a7dbeee5 100644 --- a/test-suite/djinni/enum.djinni +++ b/test-suite/djinni/enum.djinni @@ -1,3 +1,4 @@ +# This is a test color = enum { red; orange; 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/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/date.yaml b/test-suite/djinni/vendor/third-party/date.yaml index 185bb592..72c0f4be 100644 --- a/test-suite/djinni/vendor/third-party/date.yaml +++ b/test-suite/djinni/vendor/third-party/date.yaml @@ -44,3 +44,8 @@ swift: swiftxx: translator: '::djinni::swift::Date' header: '"djinni_support.hpp"' +c: + typename: 'djinni_date_ref' + translator: '::djinni::c_api::DateTranslator' + public_header: '"djinni_c.h"' + 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 d931bd60..82de4ab7 100644 --- a/test-suite/djinni/vendor/third-party/duration.yaml +++ b/test-suite/djinni/vendor/third-party/duration.yaml @@ -45,6 +45,12 @@ swift: swiftxx: translator: '::djinni::swift::Duration' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' + ignore_type_params: true --- name: h typedef: 'record' @@ -88,6 +94,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_h' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_h' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' --- name: min typedef: 'record' @@ -131,6 +142,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_min' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_min' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' --- name: s typedef: 'record' @@ -174,6 +190,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_s' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_s' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' --- name: ms typedef: 'record' @@ -217,6 +238,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_ms' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_ms' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' --- name: us typedef: 'record' @@ -260,6 +286,11 @@ swift: swiftxx: translator: '::djinni::swift::Duration_us' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_us' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' --- name: ns typedef: 'record' @@ -303,3 +334,8 @@ swift: swiftxx: translator: '::djinni::swift::Duration_ns' header: '"Duration-swift.hpp"' +c: + typename: 'djinni_number_ref' + translator: '::djinni::c_api::DurationTranslator_ns' + public_header: '"djinni_c.h"' + private_header: '"$duration_c_translator.hpp"' diff --git a/test-suite/generated-src/c/Conflict.cpp b/test-suite/generated-src/c/Conflict.cpp new file mode 100644 index 00000000..6de03fc4 --- /dev/null +++ b/test-suite/generated-src/c/Conflict.cpp @@ -0,0 +1,8 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "Conflict.h" +#include "djinni_c_translators.hpp" +#include "Conflict.hpp" + + diff --git a/test-suite/generated-src/c/Conflict.h b/test-suite/generated-src/c/Conflict.h new file mode 100644 index 00000000..c4a20586 --- /dev/null +++ b/test-suite/generated-src/c/Conflict.h @@ -0,0 +1,21 @@ +// 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; + +#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..d59e4174 --- /dev/null +++ b/test-suite/generated-src/c/DataRefTest.cpp @@ -0,0 +1,83 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from data_ref_view.djinni + +#include "DataRefTest.h" +#include "djinni_c_translators.hpp" +#include "DataRef.hpp" +#include "DataRefTest.hpp" +#include "DataRef_c_translator.hpp" +#include "DataView.hpp" +#include "DataView_c_translator.hpp" +#include + +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 new file mode 100644 index 00000000..4078d749 --- /dev/null +++ b/test-suite/generated-src/c/DataRefTest.h @@ -0,0 +1,37 @@ +// 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; + +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..f3d21695 --- /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_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::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::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::RecordTranslator<::testsuite::RecordWithEmbeddedCppProto>::toCpp(instance).state = ::djinni::c_api::ProtobufTranslator<::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..41b0eb49 --- /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_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::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::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::RecordTranslator<::testsuite::RecordWithEmbeddedProto>::toCpp(instance).person = ::djinni::c_api::ProtobufTranslator<::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..4558ce01 --- /dev/null +++ b/test-suite/generated-src/c/_varname_interface_.cpp @@ -0,0 +1,31 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from varnames.djinni + +#include "_varname_interface_.h" +#include "djinni_c_translators.hpp" +#include "_varname_interface_.hpp" +#include "_varname_record_.hpp" +#include + +/** + * 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_) +{ + 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 new file mode 100644 index 00000000..1fa11270 --- /dev/null +++ b/test-suite/generated-src/c/_varname_interface_.h @@ -0,0 +1,28 @@ +// 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; + +/** + * 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..3fce47dd --- /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_translators.hpp" +#include "_varname_record_.hpp" + +testsuite__varname_record__ref testsuite__varname_record__new(int8_t _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::RecordTranslator<::testsuite::VarnameRecord>::toCpp(instance)._field_; +} + +void testsuite__varname_record__set__field_(testsuite__varname_record__ref instance, int8_t value) +{ + ::djinni::c_api::RecordTranslator<::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..97a141d1 --- /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_translators.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..f76c0692 --- /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_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 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::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) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).b = value; +} + +int8_t testsuite_assorted_primitives_get_eight(testsuite_assorted_primitives_ref instance) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).eight = value; +} + +int16_t testsuite_assorted_primitives_get_sixteen(testsuite_assorted_primitives_ref instance) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixteen = value; +} + +int32_t testsuite_assorted_primitives_get_thirtytwo(testsuite_assorted_primitives_ref instance) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).thirtytwo = value; +} + +int64_t testsuite_assorted_primitives_get_sixtyfour(testsuite_assorted_primitives_ref instance) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).sixtyfour = value; +} + +float testsuite_assorted_primitives_get_fthirtytwo(testsuite_assorted_primitives_ref instance) +{ + 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::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).fthirtytwo = value; +} + +double testsuite_assorted_primitives_get_fsixtyfour(testsuite_assorted_primitives_ref instance) +{ + 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::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::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::PrimitiveOptionalTranslator, djinni_optional_bool>::toCpp(value); +} + +djinni_optional_int8 testsuite_assorted_primitives_get_o_eight(testsuite_assorted_primitives_ref instance) +{ + 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 value) +{ + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_eight = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int8>::toCpp(value); +} + +djinni_optional_int16 testsuite_assorted_primitives_get_o_sixteen(testsuite_assorted_primitives_ref instance) +{ + 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 value) +{ + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_sixteen = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int16>::toCpp(value); +} + +djinni_optional_int32 testsuite_assorted_primitives_get_o_thirtytwo(testsuite_assorted_primitives_ref instance) +{ + 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 value) +{ + ::djinni::c_api::RecordTranslator<::testsuite::AssortedPrimitives>::toCpp(instance).o_thirtytwo = ::djinni::c_api::PrimitiveOptionalTranslator, djinni_optional_int32>::toCpp(value); +} + +djinni_optional_int64 testsuite_assorted_primitives_get_o_sixtyfour(testsuite_assorted_primitives_ref instance) +{ + 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 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::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::PrimitiveOptionalTranslator, djinni_optional_float>::toCpp(value); +} + +djinni_optional_double testsuite_assorted_primitives_get_o_fsixtyfour(testsuite_assorted_primitives_ref instance) +{ + 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::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 new file mode 100644 index 00000000..d5882311 --- /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 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); + +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 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 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 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 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); + +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..f124dbe1 --- /dev/null +++ b/test-suite/generated-src/c/async_interface.cpp @@ -0,0 +1,40 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "async_interface.h" +#include "djinni_c_translators.hpp" +#include "Future.hpp" +#include "Future_c_translator.hpp" +#include "async_interface.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::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::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::InterfaceTranslator<::testsuite::AsyncInterface>::makeProxy(proxy_class, opaque); +} + +djinni_future_ref testsuite_async_interface_future_roundtrip(testsuite_async_interface_ref instance, djinni_future_ref f) +{ + 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/async_interface.h b/test-suite/generated-src/c/async_interface.h new file mode 100644 index 00000000..34148a01 --- /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 "Future_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..51367a73 --- /dev/null +++ b/test-suite/generated-src/c/client_interface.cpp @@ -0,0 +1,101 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#include "client_interface.h" +#include "djinni_c_translators.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::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::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.get(), r_c, jret_c); + + return returnValue; + } + + std::string return_str() override { + 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::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::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::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::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) +{ + 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) +{ + 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_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..c47d6c2a --- /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_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::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) +{ + 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::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::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::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::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, ::djinni::c_api::StringTranslator>::toCpp(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..17ea2a83 --- /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_translators.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..ebf61053 --- /dev/null +++ b/test-suite/generated-src/c/color.h @@ -0,0 +1,30 @@ +// 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 */ +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..b2708802 --- /dev/null +++ b/test-suite/generated-src/c/conflict_user.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "conflict_user.h" +#include "djinni_c_translators.hpp" +#include "conflict_user.hpp" +#include + +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) +{ + 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 new file mode 100644 index 00000000..d05c0296 --- /dev/null +++ b/test-suite/generated-src/c/conflict_user.h @@ -0,0 +1,22 @@ +// 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; + +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..035c9cd8 --- /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_translators.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..2d39f358 --- /dev/null +++ b/test-suite/generated-src/c/constant_interface_with_enum.cpp @@ -0,0 +1,8 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constant_enum.djinni + +#include "constant_interface_with_enum.h" +#include "djinni_c_translators.hpp" +#include "constant_interface_with_enum.hpp" + + 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..7b62db0d --- /dev/null +++ b/test-suite/generated-src/c/constant_interface_with_enum.h @@ -0,0 +1,18 @@ +// 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; + +#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..6a4a0802 --- /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_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::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::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::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::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::RecordTranslator<::testsuite::ConstantRecord>::toCpp(instance).some_string = ::djinni::c_api::StringTranslator::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..20b713ed --- /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_translators.hpp" +#include "constant_with_enum.hpp" + +testsuite_constant_with_enum_ref testsuite_constant_with_enum_new() +{ + return ::djinni::c_api::RecordTranslator<::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..7e8fc4c5 --- /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_translators.hpp" +#include "constants.hpp" + +testsuite_constants_ref testsuite_constants_new() +{ + return ::djinni::c_api::RecordTranslator<::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..79210674 --- /dev/null +++ b/test-suite/generated-src/c/constants_interface.cpp @@ -0,0 +1,20 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from constants.djinni + +#include "constants_interface.h" +#include "djinni_c_translators.hpp" +#include "constants_interface.hpp" + +/** + * 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_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 new file mode 100644 index 00000000..08efcd35 --- /dev/null +++ b/test-suite/generated-src/c/constants_interface.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 + +/** Interface containing constants */ +typedef djinni_interface_ref testsuite_constants_interface_ref; + +/** + * 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..54edf870 --- /dev/null +++ b/test-suite/generated-src/c/cpp_exception.cpp @@ -0,0 +1,41 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#include "cpp_exception.h" +#include "djinni_c_translators.hpp" +#include "cpp_exception.hpp" +#include + +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 new file mode 100644 index 00000000..d09a0d74 --- /dev/null +++ b/test-suite/generated-src/c/cpp_exception.h @@ -0,0 +1,27 @@ +// 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; + +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..8bc7a8b6 --- /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_translators.hpp" +#include "date_record.hpp" +#include "djinni_c_translators.hpp" +#include + +testsuite_date_record_ref testsuite_date_record_new(djinni_date_ref 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::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::RecordTranslator<::testsuite::DateRecord>::toCpp(instance).created_at = ::djinni::c_api::DateTranslator::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..6b775b34 --- /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_translators.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..6b40d71a --- /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_translators.hpp" +#include "empty_record.hpp" + +testsuite_empty_record_ref testsuite_empty_record_new() +{ + return ::djinni::c_api::RecordTranslator<::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..b0010709 --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_interface.cpp @@ -0,0 +1,49 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum.djinni + +#include "enum_usage_interface.h" +#include "djinni_c_translators.hpp" +#include "color.hpp" +#include "enum_usage_interface.hpp" + +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) +{ + 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) +{ + 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) +{ + 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) +{ + 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 new file mode 100644 index 00000000..67a829df --- /dev/null +++ b/test-suite/generated-src/c/enum_usage_interface.h @@ -0,0 +1,28 @@ +// 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; + +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..e5510ec0 --- /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_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::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) +{ + 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::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::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, ::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<::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<::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<::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<::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<::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<::djinni::c_api::BoxedEnumTranslator<::testsuite::color>, ::djinni::c_api::BoxedEnumTranslator<::testsuite::color>>::toCpp(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..9c059f95 --- /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_translators.hpp" +#include "extended_record.hpp" + +testsuite_extended_record_ref testsuite_extended_record_new(bool 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::RecordTranslator<::testsuite::ExtendedRecord>::toCpp(instance).foo; +} + +void testsuite_extended_record_set_foo(testsuite_extended_record_ref instance, bool value) +{ + ::djinni::c_api::RecordTranslator<::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..fdc4331f --- /dev/null +++ b/test-suite/generated-src/c/first_listener.cpp @@ -0,0 +1,15 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "first_listener.h" +#include "djinni_c_translators.hpp" +#include "first_listener.hpp" + +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 new file mode 100644 index 00000000..7ac2351e --- /dev/null +++ b/test-suite/generated-src/c/first_listener.h @@ -0,0 +1,20 @@ +// 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; + +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..a0bf0699 --- /dev/null +++ b/test-suite/generated-src/c/flag_roundtrip.cpp @@ -0,0 +1,42 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from enum_flags.djinni + +#include "flag_roundtrip.h" +#include "djinni_c_translators.hpp" +#include "access_flags.hpp" +#include "empty_flags.hpp" +#include "flag_roundtrip.hpp" + +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) +{ + 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) +{ + 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 new file mode 100644 index 00000000..35aec463 --- /dev/null +++ b/test-suite/generated-src/c/flag_roundtrip.h @@ -0,0 +1,27 @@ +// 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; + +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..89675fed --- /dev/null +++ b/test-suite/generated-src/c/interface_using_extended_record.cpp @@ -0,0 +1,17 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from extended_record.djinni + +#include "interface_using_extended_record.h" +#include "djinni_c_translators.hpp" +#include "../../handwritten-src/cpp/extended_record.hpp" +#include "interface_using_extended_record.hpp" + +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 new file mode 100644 index 00000000..3ce01dc0 --- /dev/null +++ b/test-suite/generated-src/c/interface_using_extended_record.h @@ -0,0 +1,20 @@ +// 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; + +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..e4f45700 --- /dev/null +++ b/test-suite/generated-src/c/java_only_listener.cpp @@ -0,0 +1,8 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#include "java_only_listener.h" +#include "djinni_c_translators.hpp" +#include "java_only_listener.hpp" + + 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..b45c77e6 --- /dev/null +++ b/test-suite/generated-src/c/java_only_listener.h @@ -0,0 +1,17 @@ +// 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; + +#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..6b990a84 --- /dev/null +++ b/test-suite/generated-src/c/listener_caller.cpp @@ -0,0 +1,31 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "listener_caller.h" +#include "djinni_c_translators.hpp" +#include "listener_caller.hpp" +#include + +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 new file mode 100644 index 00000000..49700a73 --- /dev/null +++ b/test-suite/generated-src/c/listener_caller.h @@ -0,0 +1,32 @@ +// 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; + +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..e45495ea --- /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_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::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<::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<::djinni::c_api::StringTranslator, ::djinni::c_api::DateTranslator>::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..660a538a --- /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_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::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<::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<::djinni::c_api::MapTranslator<::djinni::c_api::StringTranslator, ::djinni::c_api::Int64Translator>>::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..30cc1150 --- /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_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::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<::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<::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<::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<::djinni::c_api::Int32Translator, ::djinni::c_api::Int32Translator>::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..414b39f5 --- /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_translators.hpp" +#include "nested_collection.hpp" + +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<::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<::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<::djinni::c_api::SetTranslator<::djinni::c_api::StringTranslator>>::toCpp(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..7b99dcd0 --- /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_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::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<::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<::djinni::c_api::Int32Translator, ::djinni::c_api::StringTranslator>::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..687b0e9a --- /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 "Outcome_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..a025f753 --- /dev/null +++ b/test-suite/generated-src/c/objc_only_listener.cpp @@ -0,0 +1,8 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from single_language_interfaces.djinni + +#include "objc_only_listener.h" +#include "djinni_c_translators.hpp" +#include "objc_only_listener.hpp" + + 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..641aa047 --- /dev/null +++ b/test-suite/generated-src/c/objc_only_listener.h @@ -0,0 +1,17 @@ +// 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; + +#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..5bcb36c5 --- /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_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::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<::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<::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>>, ::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>>, ::djinni::c_api::ListTranslator<::djinni::c_api::OptionalTranslator, ::djinni::c_api::Int64Translator>>>::toCpp(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..985f062b --- /dev/null +++ b/test-suite/generated-src/c/proto_tests.cpp @@ -0,0 +1,118 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#include "proto_tests.h" +#include "djinni_c_translators.hpp" +#include "Outcome_c_translator.hpp" +#include "RecordWithEmbeddedCppProto.hpp" +#include "RecordWithEmbeddedProto.hpp" +#include "expected.hpp" +#include "proto/cpp/test.pb.h" +#include "proto/cpp/test2.pb.h" +#include "proto_tests.hpp" + +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<::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) +{ + 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) +{ + 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) +{ + 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) +{ + 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, ::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::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 new file mode 100644 index 00000000..b76ca8db --- /dev/null +++ b/test-suite/generated-src/c/proto_tests.h @@ -0,0 +1,46 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from proto.djinni + +#pragma once + +#include "djinni_c.h" +#include "Outcome_c.h" +#include "RecordWithEmbeddedCppProto.h" +#include "RecordWithEmbeddedProto.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_proto_tests_ref; + +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..79b68c00 --- /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_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::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::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::RecordTranslator<::testsuite::RecordUsingExtendedRecord>::toCpp(instance).er = ::djinni::c_api::RecordTranslator<::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..019f6dc9 --- /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_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::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::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::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::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::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::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::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::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::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).sixtyfour = value; +} + +float testsuite_record_with_derivings_get_fthirtytwo(testsuite_record_with_derivings_ref instance) +{ + 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::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).fthirtytwo = value; +} + +double testsuite_record_with_derivings_get_fsixtyfour(testsuite_record_with_derivings_ref instance) +{ + 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::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::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::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::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::RecordTranslator<::testsuite::RecordWithDerivings>::toCpp(instance).s = ::djinni::c_api::StringTranslator::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..08c3a29b --- /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_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::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::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::RecordTranslator<::testsuite::RecordWithDurationAndDerivings>::toCpp(instance).dt = ::djinni::c_api::DurationTranslator::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..2bf3542c --- /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_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::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::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::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_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..c5284b2a --- /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_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::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::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::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::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::RecordTranslator<::testsuite::RecordWithNestedDerivings>::toCpp(instance).rec = ::djinni::c_api::RecordTranslator<::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..51da0e7e --- /dev/null +++ b/test-suite/generated-src/c/return_one.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "return_one.h" +#include "djinni_c_translators.hpp" +#include "return_one.hpp" +#include + +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 new file mode 100644 index 00000000..e3100912 --- /dev/null +++ b/test-suite/generated-src/c/return_one.h @@ -0,0 +1,23 @@ +// 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; + +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..de8ab3c0 --- /dev/null +++ b/test-suite/generated-src/c/return_two.cpp @@ -0,0 +1,25 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "return_two.h" +#include "djinni_c_translators.hpp" +#include "return_two.hpp" +#include + +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 new file mode 100644 index 00000000..39a999c1 --- /dev/null +++ b/test-suite/generated-src/c/return_two.h @@ -0,0 +1,23 @@ +// 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; + +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..64cfcd5d --- /dev/null +++ b/test-suite/generated-src/c/reverse_client_interface.cpp @@ -0,0 +1,41 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from client_interface.djinni + +#include "reverse_client_interface.h" +#include "djinni_c_translators.hpp" +#include "reverse_client_interface.hpp" +#include + +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) +{ + 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 new file mode 100644 index 00000000..9bdc8a9b --- /dev/null +++ b/test-suite/generated-src/c/reverse_client_interface.h @@ -0,0 +1,26 @@ +// 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; + +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..751f7b75 --- /dev/null +++ b/test-suite/generated-src/c/sample_interface.cpp @@ -0,0 +1,8 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "sample_interface.h" +#include "djinni_c_translators.hpp" +#include "sample_interface.hpp" + + 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..82e1784a --- /dev/null +++ b/test-suite/generated-src/c/sample_interface.h @@ -0,0 +1,21 @@ +// 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; + +#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..f311bf6d --- /dev/null +++ b/test-suite/generated-src/c/second_listener.cpp @@ -0,0 +1,15 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from multiple_inheritance.djinni + +#include "second_listener.h" +#include "djinni_c_translators.hpp" +#include "second_listener.hpp" + +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 new file mode 100644 index 00000000..95e52056 --- /dev/null +++ b/test-suite/generated-src/c/second_listener.h @@ -0,0 +1,20 @@ +// 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; + +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..25096fdf --- /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_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::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<::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<::djinni::c_api::StringTranslator>::toCpp(value); +} + +djinni_array_ref testsuite_set_record_get_iset(testsuite_set_record_ref instance) +{ + 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<::djinni::c_api::Int32Translator>::toCpp(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..df4e446d --- /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_translators.hpp" +#include "support_copying.hpp" + +testsuite_support_copying_ref testsuite_support_copying_new(int32_t 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::RecordTranslator<::testsuite::SupportCopying>::toCpp(instance).x; +} + +void testsuite_support_copying_set_x(testsuite_support_copying_ref instance, int32_t value) +{ + ::djinni::c_api::RecordTranslator<::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..05cdb8f3 --- /dev/null +++ b/test-suite/generated-src/c/test_array.cpp @@ -0,0 +1,41 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from array.djinni + +#include "test_array.h" +#include "djinni_c_translators.hpp" +#include "test_array.hpp" +#include "vec2.hpp" + +djinni_array_ref testsuite_test_array_testStringArray(djinni_array_ref a) +{ + 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) +{ + 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) +{ + 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) +{ + 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 new file mode 100644 index 00000000..fb656204 --- /dev/null +++ b/test-suite/generated-src/c/test_array.h @@ -0,0 +1,26 @@ +// 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; + +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..92dbf73a --- /dev/null +++ b/test-suite/generated-src/c/test_duration.cpp @@ -0,0 +1,170 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from duration.djinni + +#include "test_duration.h" +#include "djinni_c_translators.hpp" +#include "duration_c_translator.hpp" +#include "test_duration.hpp" +#include + +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>>, ::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) +{ + 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 new file mode 100644 index 00000000..9a3efb49 --- /dev/null +++ b/test-suite/generated-src/c/test_duration.h @@ -0,0 +1,58 @@ +// 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; + +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..da18a378 --- /dev/null +++ b/test-suite/generated-src/c/test_helpers.cpp @@ -0,0 +1,334 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#include "test_helpers.h" +#include "djinni_c_translators.hpp" +#include "Future.hpp" +#include "Future_c_translator.hpp" +#include "assorted_primitives.hpp" +#include "color.hpp" +#include "map_list_record.hpp" +#include "nested_collection.hpp" +#include "primitive_list.hpp" +#include "set_record.hpp" +#include "test_helpers.hpp" +#include + +/** 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) +} + +/** + * 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) +{ + 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<::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) +{ + 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<::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) +{ + 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) +{ + 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) +{ + 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 testsuite_test_helpers_return_none() +{ + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestHelpers::return_none(); + 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<::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) +{ + 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<::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) +{ + 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) +} + +/** + * 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) +{ + 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) +{ + 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<::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<::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<::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) +{ + 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<::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) +{ + 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<::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) +{ + 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 new file mode 100644 index 00000000..6469298f --- /dev/null +++ b/test-suite/generated-src/c/test_helpers.h @@ -0,0 +1,122 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from test.djinni + +#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 "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; + +/** 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 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..72d1f6bc --- /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_translators.hpp" +#include "Outcome_c_translator.hpp" +#include "expected.hpp" +#include "nested_outcome.hpp" +#include "test_outcome.hpp" + +djinni_outcome_ref testsuite_test_outcome_getSuccessOutcome() +{ + DJINNI_HANDLE_EXCEPTION_PROLOGUE + auto retValue = ::testsuite::TestOutcome::getSuccessOutcome(); + 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<::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) +{ + 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) +{ + 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 new file mode 100644 index 00000000..8cd8d33d --- /dev/null +++ b/test-suite/generated-src/c/test_outcome.h @@ -0,0 +1,35 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from outcome.djinni + +#pragma once + +#include "djinni_c.h" +#include "Outcome_c.h" +#include "nested_outcome.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef djinni_interface_ref testsuite_test_outcome_ref; + +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..90a7ead4 --- /dev/null +++ b/test-suite/generated-src/c/test_static_method_language.cpp @@ -0,0 +1,19 @@ +// 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_translators.hpp" +#include "test_static_method_language.hpp" + +/** + * 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 new file mode 100644 index 00000000..0bc39f0d --- /dev/null +++ b/test-suite/generated-src/c/test_static_method_language.h @@ -0,0 +1,23 @@ +// 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; + +/** + * 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..8ddd045e --- /dev/null +++ b/test-suite/generated-src/c/throwing_interface.cpp @@ -0,0 +1,15 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from exception.djinni + +#include "throwing_interface.h" +#include "djinni_c_translators.hpp" +#include "throwing_interface.hpp" + +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 new file mode 100644 index 00000000..155a2c82 --- /dev/null +++ b/test-suite/generated-src/c/throwing_interface.h @@ -0,0 +1,19 @@ +// 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; + +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..73f67a23 --- /dev/null +++ b/test-suite/generated-src/c/user_token.cpp @@ -0,0 +1,37 @@ +// AUTOGENERATED FILE - DO NOT MODIFY! +// This file was generated by Djinni from user_token.djinni + +#include "user_token.h" +#include "djinni_c_translators.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 = ::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::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::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/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..da4ef450 --- /dev/null +++ b/test-suite/generated-src/c/uses_single_language_listeners.cpp @@ -0,0 +1,39 @@ +// 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_translators.hpp" +#include "uses_single_language_listeners.hpp" +#include + +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 new file mode 100644 index 00000000..a737b2c4 --- /dev/null +++ b/test-suite/generated-src/c/uses_single_language_listeners.h @@ -0,0 +1,31 @@ +// 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; + +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..ba42b7b9 --- /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_translators.hpp" +#include "vec2.hpp" + +testsuite_vec2_ref testsuite_vec2_new(int32_t x, int32_t 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::RecordTranslator<::testsuite::Vec2>::toCpp(instance).x; +} + +void testsuite_vec2_set_x(testsuite_vec2_ref instance, int32_t 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::RecordTranslator<::testsuite::Vec2>::toCpp(instance).y; +} + +void testsuite_vec2_set_y(testsuite_vec2_ref instance, int32_t value) +{ + ::djinni::c_api::RecordTranslator<::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/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/generated-src/java/com/dropbox/djinni/test/Color.java b/test-suite/generated-src/java/com/dropbox/djinni/test/Color.java index 8ff7d7e5..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,6 +6,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +/** This is a test */ 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..ecfc38b4 100644 --- a/test-suite/generated-src/objc/DBColor.h +++ b/test-suite/generated-src/objc/DBColor.h @@ -3,6 +3,7 @@ #import +/** This is a test */ 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..f7d8e4bd 100644 --- a/test-suite/generated-src/ts/test.ts +++ b/test-suite/generated-src/ts/test.ts @@ -499,6 +499,7 @@ export interface UserToken { whoami(): string; } +/** This is a test */ export enum Color { RED = 0, ORANGE = 1, @@ -571,6 +572,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; } 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..fde31d1e --- /dev/null +++ b/test-suite/handwritten-src/c/tests/DjinniCAPI_tests.cpp @@ -0,0 +1,702 @@ +#include "DataRefTest.h" +#include "Future.hpp" +#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 "proto/cpp/test.pb.h" +#include "proto_tests.h" +#include "test_helpers.h" +#include "test_outcome.h" +#include "gtest/gtest.h" +#include + +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_new( + true, 8, 4242, 3000000, 99999999999, 32.5f, 6482000.5, + 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)); + 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_new( + false, 0, 0, 0, 0, 0.0f, 0.0, djinni_optional_bool_make(true), + 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))); + + // 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_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_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_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_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_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_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_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_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) { + auto content = CRef(djinni_string_new("Hello World", 11)); + auto record = + 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"), + std::string(djinni_string_get_data(returnedContent.value))); +} + +TEST(DjinniCAPI, supportsOptionalRefCountedValues) { + auto content = CRef(djinni_string_new("Hello World", 11)); + auto record = + CRef(testsuite_client_returned_record_new(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_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_new(list.value, nullptr)); + + auto returnedList = + CRef(testsuite_primitive_list_get_list(primitiveList.value)); + + auto returnedLength = djinni_array_get_length(returnedList.value); + + ASSERT_EQ(2, returnedLength); + + auto returnedEntry1 = CRef(djinni_array_get_value(returnedList.value, 0)); + auto returnedEntry2 = CRef(djinni_array_get_value(returnedList.value, 1)); + + 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_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_new(emptyList.value, optionalList.value)); + + auto returnedList = + CRef(testsuite_primitive_list_get_optional_list(primitiveList.value)); + + auto returnedLength = djinni_array_get_length(returnedList.value); + + ASSERT_EQ(2, returnedLength); + + 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_new(2)); + auto imap = CRef(djinni_keyval_array_new(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_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_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)); + + 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) { + 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_new(0)); + + 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)); + + 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)); + + 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()); + + 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]); + + 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_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)); + + 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_new_with_bytes_copy(nullptr, 0)); + testsuite_DataRefTest_sendData(ref.value, newInput.value); + ASSERT_TRUE(dataHolder->deallocCalled); +} + +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); +} + +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))); +} + +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)); +} + +static void handleException(void *opaque, const char *message) { + *reinterpret_cast(opaque) = std::string(message); +} + +TEST(DjinniCAPI, canCatchExceptions) { + std::string errorMessage; + + 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); + 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 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 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/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"); 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" ]], 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"