From 302b33b231998163fee94f898745f4f9015161a4 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Mon, 16 Sep 2024 15:30:47 +0200 Subject: [PATCH] feat: Test all types in Example app (#131) * feat: Implement same Test Object in Swift/Kotlin * fix: Create Test Object * fix: Fix other wrong types * fix: Fix Swift module * fix: Rename cpp object as well * feat: Add segmented control to switch between tests * fix: Make getTests() stateless * fix: Fix `isCarElectric` * feat: Implement Hybrid Test Object in Kotlin * chore: Lint C++ * fix: Fix `bool` value (it's `jboolean`) * fix: Fix boxing primitives in promise * fix: Return `local_ref` always * Codegen * Remove raw JSI funcs * fix: Use `nativeOrder` for ByteBuffer order * Update ArrayBuffer.kt * fix: Fix `alias_ref` being destroyed immediately * fix: Actually wait the seconds requested * Update HybridObjectTestsScreen.tsx --- bun.lockb | Bin 797592 -> 798104 bytes example/ios/Podfile.lock | 16 +- example/package.json | 1 + example/src/getTests.ts | 603 ++++++++++-------- .../src/screens/HybridObjectTestsScreen.tsx | 119 ++-- .../src/syntax/kotlin/FbjniHybridObject.ts | 2 +- .../src/syntax/kotlin/KotlinCxxBridgedType.ts | 16 +- packages/react-native-nitro-image/README.md | 6 +- .../android/CMakeLists.txt | 2 +- .../nitro/image/HybridTestObjectKotlin.kt | 144 +++++ .../margelo/nitro/image/KotlinTestObject.kt | 64 -- .../cpp/HybridTestObject.cpp | 306 --------- .../cpp/HybridTestObjectCpp.cpp | 299 +++++++++ ...TestObject.hpp => HybridTestObjectCpp.hpp} | 23 +- .../ios/HybridSwiftKotlinTestObject.swift | 137 ---- .../ios/HybridTestObjectSwiftKotlin.swift | 162 +++++ .../ios/NitroImageRegistry.swift | 19 - packages/react-native-nitro-image/nitro.json | 12 +- .../android/NitroImage+autolinking.cmake | 7 +- .../generated/android/NitroImageOnLoad.cpp | 31 +- .../generated/android/c++/JFunc_void.hpp | 48 ++ .../android/c++/JFunc_void_Person.hpp | 51 -- .../android/c++/JHybridImageFactorySpec.cpp | 8 +- .../android/c++/JHybridImageSpec.cpp | 4 +- .../c++/JHybridKotlinTestObjectSpec.cpp | 184 ------ .../c++/JHybridKotlinTestObjectSpec.hpp | 67 -- .../c++/JHybridTestObjectSwiftKotlinSpec.cpp | 254 ++++++++ .../c++/JHybridTestObjectSwiftKotlinSpec.hpp | 87 +++ .../{Func_void_Person.kt => Func_void.kt} | 10 +- .../nitro/image/HybridKotlinTestObjectSpec.kt | 112 ---- .../image/HybridTestObjectSwiftKotlinSpec.kt | 197 ++++++ .../ios/NitroImage-Swift-Cxx-Bridge.hpp | 175 +---- .../ios/NitroImage-Swift-Cxx-Umbrella.hpp | 24 +- .../generated/ios/NitroImageAutolinking.mm | 18 +- .../generated/ios/NitroImageAutolinking.swift | 10 +- .../HybridSwiftKotlinTestObjectSpecSwift.hpp | 259 -------- ... HybridTestObjectSwiftKotlinSpecSwift.cpp} | 4 +- .../HybridTestObjectSwiftKotlinSpecSwift.hpp | 223 +++++++ .../generated/ios/swift/CallbackHolder.swift | 82 --- .../HybridSwiftKotlinTestObjectSpec.swift | 76 --- .../HybridTestObjectSwiftKotlinSpec.swift | 75 +++ ... HybridTestObjectSwiftKotlinSpecCxx.swift} | 335 +++++----- .../generated/ios/swift/OldEnum.swift | 44 -- .../generated/shared/c++/CallbackHolder.hpp | 68 -- .../shared/c++/HybridKotlinTestObjectSpec.cpp | 36 -- .../shared/c++/HybridKotlinTestObjectSpec.hpp | 92 --- .../c++/HybridSwiftKotlinTestObjectSpec.cpp | 65 -- .../c++/HybridSwiftKotlinTestObjectSpec.hpp | 128 ---- ...ctSpec.cpp => HybridTestObjectCppSpec.cpp} | 108 ++-- ...ctSpec.hpp => HybridTestObjectCppSpec.hpp} | 30 +- .../c++/HybridTestObjectSwiftKotlinSpec.cpp | 56 ++ .../c++/HybridTestObjectSwiftKotlinSpec.hpp | 111 ++++ .../react-native-nitro-image/src/index.ts | 22 +- .../src/specs/TestObject.nitro.ts | 105 +-- .../main/cpp/core/ByteBufferArrayBuffer.hpp | 4 +- .../src/main/cpp/core/JArrayBuffer.hpp | 8 +- .../com/margelo/nitro/core/ArrayBuffer.kt | 10 + packages/template/README.md | 6 +- packages/template/android/CMakeLists.txt | 1 - 59 files changed, 2477 insertions(+), 2689 deletions(-) create mode 100644 packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt delete mode 100644 packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/KotlinTestObject.kt delete mode 100644 packages/react-native-nitro-image/cpp/HybridTestObject.cpp create mode 100644 packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp rename packages/react-native-nitro-image/cpp/{HybridTestObject.hpp => HybridTestObjectCpp.hpp} (87%) delete mode 100644 packages/react-native-nitro-image/ios/HybridSwiftKotlinTestObject.swift create mode 100644 packages/react-native-nitro-image/ios/HybridTestObjectSwiftKotlin.swift delete mode 100644 packages/react-native-nitro-image/ios/NitroImageRegistry.swift create mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_Person.hpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.cpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.hpp create mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp create mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp rename packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/{Func_void_Person.kt => Func_void.kt} (84%) delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridKotlinTestObjectSpec.kt create mode 100644 packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.hpp rename packages/react-native-nitro-image/nitrogen/generated/ios/c++/{HybridSwiftKotlinTestObjectSpecSwift.cpp => HybridTestObjectSwiftKotlinSpecSwift.cpp} (70%) create mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/swift/CallbackHolder.swift delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpec.swift create mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift rename packages/react-native-nitro-image/nitrogen/generated/ios/swift/{HybridSwiftKotlinTestObjectSpecCxx.swift => HybridTestObjectSwiftKotlinSpecCxx.swift} (61%) delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/ios/swift/OldEnum.swift delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/CallbackHolder.hpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.cpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.hpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.cpp delete mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.hpp rename packages/react-native-nitro-image/nitrogen/generated/shared/c++/{HybridTestObjectSpec.cpp => HybridTestObjectCppSpec.cpp} (65%) rename packages/react-native-nitro-image/nitrogen/generated/shared/c++/{HybridTestObjectSpec.hpp => HybridTestObjectCppSpec.hpp} (86%) create mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp create mode 100644 packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp diff --git a/bun.lockb b/bun.lockb index fed3f7aa121b50c27f47e30c8e4788ff46683e70..448702cbdf9636489f7811f53d130a4080095b81 100755 GIT binary patch delta 66574 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 UBfZM!uAmxWR)1MsKKGOV1HF}n(f|Me delta 67092 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 }) } -export function getTests(): TestRunner[] { +export function getTests( + testObject: TestObjectCpp | TestObjectSwiftKotlin +): TestRunner[] { return [ // Basic prototype tests createTest('HybridObject.prototype is valid', () => - it(() => Object.getPrototypeOf(HybridTestObject)) + it(() => Object.getPrototypeOf(testObject)) .didNotThrow() .didReturn('object') .toContain('simpleFunc') ), createTest('HybridObject.prototype.prototype is valid', () => - it(() => Object.getPrototypeOf(Object.getPrototypeOf(HybridTestObject))) + it(() => Object.getPrototypeOf(Object.getPrototypeOf(testObject))) .didNotThrow() .didReturn('object') .toContain('toString') @@ -100,24 +103,20 @@ export function getTests(): TestRunner[] { it( () => // eslint-disable-next-line no-self-compare - HybridTestObject.newTestObject() === HybridTestObject.newTestObject() + testObject.newTestObject() === testObject.newTestObject() ) .didNotThrow() .equals(false) ), createTest('Two HybridObjects are not equal (a.equals(b))', () => - it(() => - HybridTestObject.newTestObject().equals( - HybridTestObject.newTestObject() - ) - ) + it(() => testObject.newTestObject().equals(testObject.newTestObject())) .didNotThrow() .equals(false) ), createTest("Two HybridObjects's prototypse are equal", () => it(() => { - const objA = HybridTestObject.newTestObject() - const objB = HybridTestObject.newTestObject() + const objA = testObject.newTestObject() + const objB = testObject.newTestObject() return Object.getPrototypeOf(objA) === Object.getPrototypeOf(objB) }) .didNotThrow() @@ -126,96 +125,117 @@ export function getTests(): TestRunner[] { // Test Primitives (getters & setters) createTest('set numberValue to 13', () => - it(() => (HybridTestObject.numberValue = 13)).didNotThrow() + it(() => (testObject.numberValue = 13)).didNotThrow() ), createTest('get numberValue (== 13)', () => - it(() => HybridTestObject.numberValue) + it(() => { + testObject.numberValue = 14 + return testObject.numberValue + }) .didNotThrow() - .equals(13) + .equals(14) ), createTest('set boolValue to true', () => - it(() => (HybridTestObject.boolValue = true)).didNotThrow() + it(() => (testObject.boolValue = true)).didNotThrow() ), createTest('get boolValue (== true)', () => - it(() => HybridTestObject.boolValue) + it(() => { + testObject.boolValue = true + return testObject.boolValue + }) .didNotThrow() .equals(true) ), createTest("set stringValue to 'hello!'", () => - it(() => (HybridTestObject.stringValue = 'hello!')).didNotThrow() + it(() => (testObject.stringValue = 'hello!')).didNotThrow() ), createTest("get stringValue (== 'hello!')", () => - it(() => HybridTestObject.stringValue) + it(() => { + testObject.stringValue = 'hello!' + return testObject.stringValue + }) .didNotThrow() .equals('hello!') ), createTest('set bigintValue to 7362572367826385n', () => - it(() => (HybridTestObject.bigintValue = 7362572367826385n)).didNotThrow() + it(() => (testObject.bigintValue = 7362572367826385n)).didNotThrow() ), createTest('get bigintValue (== 7362572367826385n)', () => - it(() => HybridTestObject.bigintValue) + it(() => { + testObject.bigintValue = 7362572367826385n + return testObject.bigintValue + }) .didNotThrow() .equals(7362572367826385n) ), createTest('set stringOrUndefined to string, then undefined', () => it(() => { - HybridTestObject.stringOrUndefined = 'hello' - HybridTestObject.stringOrUndefined = undefined + testObject.stringOrUndefined = 'hello' + testObject.stringOrUndefined = undefined }).didNotThrow() ), createTest('get stringOrUndefined (== undefined)', () => - it(() => HybridTestObject.stringOrUndefined) + it(() => { + testObject.stringOrUndefined = undefined + return testObject.stringOrUndefined + }) .didNotThrow() .equals(undefined) ), createTest('set stringOrNull to string, then undefined', () => it(() => { - HybridTestObject.stringOrNull = 'hello' - HybridTestObject.stringOrNull = null + testObject.stringOrNull = 'hello' + testObject.stringOrNull = null }).didNotThrow() ), createTest('get stringOrNull (== undefined)', () => - it(() => HybridTestObject.stringOrNull) + it(() => { + testObject.stringOrNull = null + return testObject.stringOrNull + }) .didNotThrow() .equals(null) ), createTest('set optionalString to string, then undefined', () => it(() => { - HybridTestObject.optionalString = 'hello' - HybridTestObject.optionalString = undefined + testObject.optionalString = 'hello' + testObject.optionalString = undefined }).didNotThrow() ), createTest('get optionalString (== undefined)', () => - it(() => HybridTestObject.optionalString) + it(() => { + testObject.optionalString = undefined + return testObject.optionalString + }) .didNotThrow() .equals(undefined) ), // Test basic functions createTest('addNumbers(5, 13) = 18', () => - it(() => HybridTestObject.addNumbers(5, 13)) + it(() => testObject.addNumbers(5, 13)) .didNotThrow() .equals(18) ), createTest('addStrings("hello ", "world") = "hello world"', () => - it(() => HybridTestObject.addStrings('hello ', 'world')) + it(() => testObject.addStrings('hello ', 'world')) .didNotThrow() .equals('hello world') ), createTest('simpleFunc()', () => - it(() => HybridTestObject.simpleFunc()) + it(() => testObject.simpleFunc()) .didNotThrow() .didReturn('undefined') ), createTest('multipleArguments(...)', () => - it(() => HybridTestObject.multipleArguments(13, 'hello!', true)) + it(() => testObject.multipleArguments(13, 'hello!', true)) .didNotThrow() .didReturn('undefined') ), // Test Maps createTest('createMap()', () => - it(() => HybridTestObject.createMap()) + it(() => testObject.createMap()) .didNotThrow() .didReturn('object') .toContain('object') @@ -227,48 +247,42 @@ export function getTests(): TestRunner[] { .toContain('number') ), createTest('createMap().array', () => - it(() => HybridTestObject.createMap().array) + it(() => testObject.createMap().array) .didNotThrow() .didReturn('object') ), createTest('createMap().object', () => - it(() => HybridTestObject.createMap().object) + it(() => testObject.createMap().object) .didNotThrow() .didReturn('object') ), createTest('mapRoundtrip(...)', () => - it(() => HybridTestObject.mapRoundtrip(HybridTestObject.createMap())) + it(() => testObject.mapRoundtrip(testObject.createMap())) .didNotThrow() - .equals(HybridTestObject.createMap()) + .equals(testObject.createMap()) ), // Test errors - createTest('get valueThatWillThrowOnAccess', () => - it(() => HybridTestObject.valueThatWillThrowOnAccess).didThrow() - ), - createTest('set valueThatWillThrowOnAccess', () => - it(() => (HybridTestObject.valueThatWillThrowOnAccess = 55)).didThrow() - ), createTest('funcThatThrows()', () => - it(() => HybridTestObject.funcThatThrows()).didThrow() + it(() => testObject.funcThatThrows()).didThrow() ), // Optional parameters createTest('tryOptionalParams(...) omitted', () => - it(() => HybridTestObject.tryOptionalParams(13, true)) + it(() => testObject.tryOptionalParams(13, true)) .didNotThrow() .didReturn('string') .equals('value omitted!') ), createTest('tryOptionalParams(...) provided', () => - it(() => HybridTestObject.tryOptionalParams(13, true, 'hello')) + it(() => testObject.tryOptionalParams(13, true, 'hello')) .didNotThrow() .didReturn('string') .equals('hello') ), createTest('tryOptionalParams(...) one-too-many', () => it(() => - HybridTestObject.tryOptionalParams( + testObject.tryOptionalParams( 13, true, 'hello', @@ -280,193 +294,223 @@ export function getTests(): TestRunner[] { createTest('tryOptionalParams(...) one-too-few', () => it(() => // @ts-expect-error - HybridTestObject.tryOptionalParams(13) + testObject.tryOptionalParams(13) ).didThrow() ), createTest('tryMiddleParam(...)', () => - it(() => HybridTestObject.tryMiddleParam(13, undefined, 'hello!')) + it(() => testObject.tryMiddleParam(13, undefined, 'hello!')) .didNotThrow() .equals('hello!') ), createTest('tryMiddleParam(...)', () => - it(() => HybridTestObject.tryMiddleParam(13, true, 'passed')) + it(() => testObject.tryMiddleParam(13, true, 'passed')) .didNotThrow() .equals('passed') ), // Variants tests - createTest('set someVariant to 55', () => - it(() => (HybridTestObject.someVariant = 55)).didNotThrow() - ), - createTest('get someVariant (== 55)', () => - it(() => HybridTestObject.someVariant).equals(55) - ), - createTest("set someVariant to 'some-string'", () => - it(() => (HybridTestObject.someVariant = 'some-string')).didNotThrow() - ), - createTest("get someVariant (== 'some-string')", () => - it(() => HybridTestObject.someVariant).equals('some-string') - ), - createTest('set someVariant to false', () => - it( - () => - // @ts-expect-error - (HybridTestObject.someVariant = false) - ).didThrow() - ), - createTest('passVariant(...) holds something else ([1,2,3])', () => - it(() => HybridTestObject.passVariant([1, 2, 3])) - .didNotThrow() - .equals('holds something else!') - ), - createTest('passVariant(...) holds string(hello!)', () => - it(() => HybridTestObject.passVariant('hello!')) - .didNotThrow() - .equals('hello!') - ), - createTest('passVariant(...) holds number (5)', () => - it(() => HybridTestObject.passVariant(5)) - .didNotThrow() - .equals(5) - ), - createTest('passVariant(...) wrong type ({})', () => - it(() => - HybridTestObject.passVariant( - // @ts-expect-error - {} - ) - ).didThrow() - ), - - // Complex variants tests - createTest('getVariantEnum(...) converts enum', () => - it(() => HybridTestObject.getVariantEnum(OldEnum.THIRD)) - .didNotThrow() - .equals(OldEnum.THIRD) - ), - createTest('getVariantEnum(...) converts boolean', () => - it(() => HybridTestObject.getVariantEnum(true)) - .didNotThrow() - .equals(true) - ), - createTest('getVariantEnum(...) throws at wrong type (string)', () => - // @ts-expect-error - it(() => HybridTestObject.getVariantEnum('string')).didThrow() - ), - createTest('getVariantObjects(...) converts Person', () => - it(() => HybridTestObject.getVariantObjects(TEST_PERSON)) - .didNotThrow() - .equals(TEST_PERSON) - ), - createTest('getVariantObjects(...) converts Car', () => - it(() => HybridTestObject.getVariantObjects(TEST_CAR)) - .didNotThrow() - .equals(TEST_CAR) - ), - createTest('getVariantObjects(...) converts Car (+ person)', () => - it(() => - HybridTestObject.getVariantObjects({ ...TEST_CAR, driver: TEST_PERSON }) - ) - .didNotThrow() - .equals({ ...TEST_CAR, driver: TEST_PERSON }) - ), - createTest('getVariantObjects(...) throws at wrong type (string)', () => - // @ts-expect-error - it(() => HybridTestObject.getVariantObjects('some-string')).didThrow() - ), - createTest( - 'getVariantObjects(...) throws at wrong type (wrong object)', - () => - it(() => - // @ts-expect-error - HybridTestObject.getVariantObjects({ someValue: 55 }) - ).didThrow() - ), - createTest('getVariantHybrid(...) converts Hybrid', () => - it(() => HybridTestObject.getVariantHybrid(HybridTestObject)) - .didNotThrow() - // @ts-expect-error - .toContain('getVariantHybrid') - ), - createTest('getVariantHybrid(...) converts Person', () => - it(() => HybridTestObject.getVariantHybrid(TEST_PERSON)) - .didNotThrow() - .equals(TEST_PERSON) - ), - createTest('getVariantHybrid(...) throws at wrong type (string)', () => - // @ts-expect-error - it(() => HybridTestObject.getVariantHybrid('some-string')).didThrow() - ), - createTest( - 'getVariantHybrid(...) throws at wrong type (wrong object)', - () => - it(() => - // @ts-expect-error - HybridTestObject.getVariantHybrid({ someValue: 55 }) - ).didThrow() - ), - createTest('getVariantTuple(...) converts Float2', () => - it(() => HybridTestObject.getVariantTuple([10, 20])) - .didNotThrow() - .equals([10, 20]) - ), - createTest('getVariantTuple(...) converts Float3', () => - it(() => HybridTestObject.getVariantTuple([10, 20, 30])) - .didNotThrow() - .equals([10, 20, 30]) - ), - createTest('getVariantTuple(...) throws at wrong size (4 items)', () => - it(() => - // @ts-expect-error - HybridTestObject.getVariantTuple([10, 20, 30, 40, 50]) - ).didThrow() - ), - createTest('getVariantTuple(...) throws at wrong type (string)', () => - // @ts-expect-error - it(() => HybridTestObject.getVariantTuple('hello')).didThrow() - ), - createTest('getVariantTuple(...) throws at wrong type (string[])', () => - // @ts-expect-error - it(() => HybridTestObject.getVariantTuple(['hello', 'world'])).didThrow() - ), + ...('someVariant' in testObject + ? [ + createTest('set someVariant to 55', () => + it(() => (testObject.someVariant = 55)).didNotThrow() + ), + createTest('get someVariant (== 55)', () => + it(() => { + testObject.someVariant = 55 + return testObject.someVariant + }).equals(55) + ), + createTest("set someVariant to 'some-string'", () => + it(() => (testObject.someVariant = 'some-string')).didNotThrow() + ), + createTest("get someVariant (== 'some-string')", () => + it(() => { + testObject.someVariant = 'some-string' + return testObject.someVariant + }).equals('some-string') + ), + createTest('set someVariant to false', () => + it( + () => + // @ts-expect-error + (testObject.someVariant = false) + ).didThrow() + ), + createTest('passVariant(...) holds something else ([1,2,3])', () => + it(() => testObject.passVariant([1, 2, 3])) + .didNotThrow() + .equals('holds something else!') + ), + createTest('passVariant(...) holds string(hello!)', () => + it(() => testObject.passVariant('hello!')) + .didNotThrow() + .equals('hello!') + ), + createTest('passVariant(...) holds number (5)', () => + it(() => testObject.passVariant(5)) + .didNotThrow() + .equals(5) + ), + createTest('passVariant(...) wrong type ({})', () => + it(() => + testObject.passVariant( + // @ts-expect-error + {} + ) + ).didThrow() + ), + // Complex variants tests + createTest('getVariantEnum(...) converts enum', () => + it(() => testObject.getVariantEnum(OldEnum.THIRD)) + .didNotThrow() + .equals(OldEnum.THIRD) + ), + createTest('getVariantEnum(...) converts boolean', () => + it(() => testObject.getVariantEnum(true)) + .didNotThrow() + .equals(true) + ), + createTest('getVariantEnum(...) throws at wrong type (string)', () => + // @ts-expect-error + it(() => testObject.getVariantEnum('string')).didThrow() + ), + createTest('getVariantObjects(...) converts Person', () => + it(() => testObject.getVariantObjects(TEST_PERSON)) + .didNotThrow() + .equals(TEST_PERSON) + ), + createTest('getVariantObjects(...) converts Car', () => + it(() => testObject.getVariantObjects(TEST_CAR)) + .didNotThrow() + .equals(TEST_CAR) + ), + createTest('getVariantObjects(...) converts Car (+ person)', () => + it(() => + testObject.getVariantObjects({ ...TEST_CAR, driver: TEST_PERSON }) + ) + .didNotThrow() + .equals({ ...TEST_CAR, driver: TEST_PERSON }) + ), + createTest( + 'getVariantObjects(...) throws at wrong type (string)', + () => + // @ts-expect-error + it(() => testObject.getVariantObjects('some-string')).didThrow() + ), + createTest( + 'getVariantObjects(...) throws at wrong type (wrong object)', + () => + it(() => + // @ts-expect-error + testObject.getVariantObjects({ someValue: 55 }) + ).didThrow() + ), + createTest('getVariantHybrid(...) converts Hybrid', () => + it(() => testObject.getVariantHybrid(testObject)) + .didNotThrow() + // @ts-expect-error + .toContain('getVariantHybrid') + ), + createTest('getVariantHybrid(...) converts Person', () => + it(() => testObject.getVariantHybrid(TEST_PERSON)) + .didNotThrow() + .equals(TEST_PERSON) + ), + createTest( + 'getVariantHybrid(...) throws at wrong type (string)', + () => + // @ts-expect-error + it(() => testObject.getVariantHybrid('some-string')).didThrow() + ), + createTest( + 'getVariantHybrid(...) throws at wrong type (wrong object)', + () => + it(() => + // @ts-expect-error + testObject.getVariantHybrid({ someValue: 55 }) + ).didThrow() + ), + createTest('getVariantTuple(...) converts Float2', () => + it(() => testObject.getVariantTuple([10, 20])) + .didNotThrow() + .equals([10, 20]) + ), + createTest('getVariantTuple(...) converts Float3', () => + it(() => testObject.getVariantTuple([10, 20, 30])) + .didNotThrow() + .equals([10, 20, 30]) + ), + createTest( + 'getVariantTuple(...) throws at wrong size (4 items)', + () => + it(() => + // @ts-expect-error + testObject.getVariantTuple([10, 20, 30, 40, 50]) + ).didThrow() + ), + createTest('getVariantTuple(...) throws at wrong type (string)', () => + // @ts-expect-error + it(() => testObject.getVariantTuple('hello')).didThrow() + ), + createTest( + 'getVariantTuple(...) throws at wrong type (string[])', + () => + it(() => + // @ts-expect-error + testObject.getVariantTuple(['hello', 'world']) + ).didThrow() + ), + ] + : [ + // Swift/Kotlin test object does not have variants yet. + ]), // Tuples Tests - createTest("set someTuple to [55, 'hello']", () => - it(() => (HybridTestObject.someTuple = [55, 'hello'])).didNotThrow() - ), - createTest("get someTuple (== [55, 'hello'])", () => - it(() => HybridTestObject.someTuple).equals([55, 'hello']) - ), - createTest('flip([10, 20, 30])', () => - it(() => HybridTestObject.flip([10, 20, 30])) - .didNotThrow() - .equals([30, 20, 10]) - ), - createTest('flip([10, 20]) throws', () => - it(() => - HybridTestObject.flip( - // @ts-expect-error - [10, 20] - ) - ).didThrow() - ), - createTest('passTuple(...)', () => - it(() => HybridTestObject.passTuple([13, 'hello', true])) - .didNotThrow() - .equals([13, 'hello', true]) - ), + ...('someTuple' in testObject + ? [ + createTest("set someTuple to [55, 'hello']", () => + it(() => (testObject.someTuple = [55, 'hello'])).didNotThrow() + ), + createTest("get someTuple (== [55, 'hello'])", () => + it(() => { + testObject.someTuple = [55, 'hello'] + return testObject.someTuple + }).equals([55, 'hello']) + ), + createTest('flip([10, 20, 30])', () => + it(() => testObject.flip([10, 20, 30])) + .didNotThrow() + .equals([30, 20, 10]) + ), + createTest('flip([10, 20]) throws', () => + it(() => + testObject.flip( + // @ts-expect-error + [10, 20] + ) + ).didThrow() + ), + createTest('passTuple(...)', () => + it(() => testObject.passTuple([13, 'hello', true])) + .didNotThrow() + .equals([13, 'hello', true]) + ), + ] + : [ + // Swift/Kotlin Test Object does not have tuples yet! + ]), // Promises createTest('wait', async () => - (await it(() => HybridTestObject.wait(0.1))).didNotThrow() + (await it(() => testObject.wait(0.1))).didNotThrow() ), createTest('calculateFibonacciSync(5)', async () => - it(() => HybridTestObject.calculateFibonacciSync(10)) + it(() => testObject.calculateFibonacciSync(10)) .didNotThrow() .equals(55n) ), createTest('calculateFibonacciAsync(5)', async () => - (await it(() => HybridTestObject.calculateFibonacciAsync(10))) + (await it(() => testObject.calculateFibonacciAsync(10))) .didNotThrow() .equals(55n) ), @@ -476,7 +520,7 @@ export function getTests(): TestRunner[] { ( await it(async () => { return timeoutedPromise((complete) => { - HybridTestObject.callCallback(() => { + testObject.callCallback(() => { complete(true) }) }) @@ -485,25 +529,47 @@ export function getTests(): TestRunner[] { .didNotThrow() .equals(true) ), - createTest('getValueFromJSCallback(...)', async () => - ( - await it(async () => { - return timeoutedPromise((complete) => { - HybridTestObject.getValueFromJSCallback(() => { - complete(true) - return 55 - }) - }) - }) - ) - .didNotThrow() - .equals(true) - ), - createTest('getValueFromJSCallbackAndWait(...)', async () => - (await it(() => HybridTestObject.getValueFromJSCallbackAndWait(() => 73))) - .didNotThrow() - .equals(73) - ), + ...('getValueFromJSCallback' in testObject + ? [ + createTest('getValueFromJSCallback(...)', async () => + ( + await it(async () => { + return timeoutedPromise((complete) => { + testObject.getValueFromJSCallback(() => { + complete(true) + return 55 + }) + }) + }) + ) + .didNotThrow() + .equals(true) + ), + createTest('getValueFromJSCallbackAndWait(...)', async () => + (await it(() => testObject.getValueFromJSCallbackAndWait(() => 73))) + .didNotThrow() + .equals(73) + ), + createTest('getValueFromJsCallback(...)', async () => + ( + await it(async () => { + let value: string | undefined + await testObject.getValueFromJsCallback( + () => 'hello', + (val) => { + value = val + } + ) + return value + }) + ) + .didNotThrow() + .equals('hello') + ), + ] + : [ + // Swift/Kotlin Test Object does not support JS callbacks _that return a value_ yet! + ]), createTest('callAll(...)', async () => ( await it(async () => { @@ -513,33 +579,17 @@ export function getTests(): TestRunner[] { calledCount++ if (calledCount === 3) complete(calledCount) } - HybridTestObject.callAll(func, func, func) + testObject.callAll(func, func, func) }) }) ) .didNotThrow() .equals(3) ), - createTest('getValueFromJsCallback(...)', async () => - ( - await it(async () => { - let value: string | undefined - await HybridTestObject.getValueFromJsCallback( - () => 'hello', - (val) => { - value = val - } - ) - return value - }) - ) - .didNotThrow() - .equals('hello') - ), // Objects createTest('getCar()', () => - it(() => HybridTestObject.getCar()) + it(() => testObject.getCar()) .didNotThrow() .didReturn('object') .toContain('year') @@ -551,7 +601,7 @@ export function getTests(): TestRunner[] { ), createTest('isCarElectric(...)', () => it(() => - HybridTestObject.isCarElectric({ + testObject.isCarElectric({ make: 'Lamborghini', year: 2018, model: 'Huracan Performante', @@ -564,7 +614,7 @@ export function getTests(): TestRunner[] { ), createTest('getDriver(...) with no driver', () => it(() => - HybridTestObject.getDriver({ + testObject.getDriver({ make: 'Lamborghini', year: 2018, model: 'Huracan Performante', @@ -577,7 +627,7 @@ export function getTests(): TestRunner[] { ), createTest('getDriver(...) with driver', () => it(() => - HybridTestObject.getDriver({ + testObject.getDriver({ make: 'Lamborghini', year: 2018, model: 'Huracan Performante', @@ -592,7 +642,7 @@ export function getTests(): TestRunner[] { // Hybrid Object Tests createTest('get self', () => - it(() => HybridTestObject.self) + it(() => testObject.thisObject) .didNotThrow() .didReturn('object') .toContain('bigintValue') @@ -600,7 +650,7 @@ export function getTests(): TestRunner[] { .toContain('stringValue') ), createTest('newTestObject()', () => - it(() => HybridTestObject.newTestObject()) + it(() => testObject.newTestObject()) .didNotThrow() .didReturn('object') .toContain('bigintValue') @@ -610,14 +660,14 @@ export function getTests(): TestRunner[] { // ArrayBuffers createTest('createArrayBuffer()', () => - it(() => HybridTestObject.createArrayBuffer()) + it(() => testObject.createArrayBuffer()) .didNotThrow() .didReturn('object') ), createTest('getBufferLastItem(...) == 5', () => it(() => { const buffer = new Uint8Array([13, 20, 55]) - return HybridTestObject.getBufferLastItem(buffer.buffer) + return testObject.getBufferLastItem(buffer.buffer) }) .didNotThrow() .equals(55) @@ -625,7 +675,7 @@ export function getTests(): TestRunner[] { createTest('setAllValuesTo(...)', () => it(() => { const buffer = new Uint8Array(30) - HybridTestObject.setAllValuesTo(buffer.buffer, 55) + testObject.setAllValuesTo(buffer.buffer, 55) return buffer.every((v) => v === 55) }) .didNotThrow() @@ -634,49 +684,54 @@ export function getTests(): TestRunner[] { // Base HybridObject inherited methods createTest('.toString()', () => - it(() => HybridTestObject.toString()) + it(() => testObject.toString()) .didNotThrow() .didReturn('string') - .equals('[HybridObject TestObject]') + .equals(`[HybridObject ${testObject.name}]`) ), createTest('.name', () => - it(() => HybridTestObject.name) + it(() => testObject.name) .didNotThrow() .didReturn('string') - .equals('TestObject') ), createTest('.equals(...) == true', () => - it(() => HybridTestObject.equals(HybridTestObject)) + it(() => testObject.equals(testObject)) .didNotThrow() .equals(true) ), createTest('.equals(.self) == true', () => - it(() => HybridTestObject.equals(HybridTestObject.self)) + it(() => testObject.equals(testObject.thisObject)) .didNotThrow() .equals(true) ), createTest('.self == .self', () => // eslint-disable-next-line no-self-compare - it(() => HybridTestObject.self === HybridTestObject.self) + it(() => testObject.thisObject === testObject.thisObject) .didNotThrow() .equals(true) ), createTest('.equals(newTestObject()) == false', () => - it(() => HybridTestObject.equals(HybridTestObject.newTestObject())) + it(() => testObject.equals(testObject.newTestObject())) .didNotThrow() .equals(false) ), createTest('Object.keys(...)', () => - it(() => Object.keys(HybridTestObject)) + it(() => Object.keys(testObject)) .didNotThrow() .didReturn('object') .toBeArray() ), - createTest('Call Raw JSI Func', () => - // @ts-expect-error - it(() => HybridTestObject.rawJsiFunc(55, false, 'hello', { obj: true })) - .didNotThrow() - .equals([55, false, 'hello', { obj: true }]) - ), + ...('rawJsiFunc' in testObject + ? [ + createTest('Call Raw JSI Func', () => + // @ts-expect-error + it(() => testObject.rawJsiFunc(55, false, 'hello', { obj: true })) + .didNotThrow() + .equals([55, false, 'hello', { obj: true }]) + ), + ] + : [ + // Swift/Kotlin Test Objects don't have raw JSI functions! + ]), ] } diff --git a/example/src/screens/HybridObjectTestsScreen.tsx b/example/src/screens/HybridObjectTestsScreen.tsx index 6ba51f074..84aecae3c 100644 --- a/example/src/screens/HybridObjectTestsScreen.tsx +++ b/example/src/screens/HybridObjectTestsScreen.tsx @@ -1,14 +1,16 @@ import * as React from 'react' import { StyleSheet, View, Text, ScrollView, Button } from 'react-native' -import { HybridTestObject } from 'react-native-nitro-image' +import { + HybridTestObjectCpp, + HybridTestObjectSwiftKotlin, +} from 'react-native-nitro-image' import { getTests, type TestRunner } from '../getTests' import { SafeAreaView } from 'react-native-safe-area-context' import { logPrototypeChain } from '../logPrototypeChain' +import SegmentedControl from '@react-native-segmented-control/segmented-control' -logPrototypeChain(HybridTestObject) - -const allTests = getTests() +logPrototypeChain(HybridTestObjectCpp) interface TestState { runner: TestRunner @@ -38,6 +40,15 @@ function TestCase({ test, onRunPressed }: TestCaseProps): React.ReactElement { } export function HybridObjectTestsScreen() { + const [selectedIndex, setSelectedIndex] = React.useState(0) + const selectedObject = [HybridTestObjectCpp, HybridTestObjectSwiftKotlin][ + selectedIndex + ] + console.log(`Showing Tests for HybridObject "${selectedObject?.name}"`) + const allTests = React.useMemo( + () => getTests(selectedObject ?? HybridTestObjectCpp), + [selectedObject] + ) const [tests, setTests] = React.useState(() => allTests.map((t) => ({ runner: t, @@ -45,6 +56,17 @@ export function HybridObjectTestsScreen() { extraMessage: '', })) ) + + React.useEffect(() => { + setTests( + allTests.map((t) => ({ + runner: t, + state: '📱 Click to run', + extraMessage: '', + })) + ) + }, [allTests]) + const status = React.useMemo(() => { const passed = tests.filter((t) => t.state === '✅ Passed').length const failed = tests.filter((t) => t.state === '❌ Failed').length @@ -65,53 +87,56 @@ export function HybridObjectTestsScreen() { return `📱 Idle` }, [tests]) - const updateTest = React.useCallback( - ( - runner: TestRunner, - newState: TestState['state'], - newMessage: TestState['extraMessage'] - ) => { - setTests((t) => { - const indexOfTest = t.findIndex((v) => v.runner === runner) - if (indexOfTest === -1) { - throw new Error( - `Test ${runner} does not exist in all tests! What did you click? lol` - ) - } - const copy = [...t] - copy[indexOfTest]!.state = newState - copy[indexOfTest]!.extraMessage = newMessage - return copy - }) - }, - [] - ) + const updateTest = ( + runner: TestRunner, + newState: TestState['state'], + newMessage: TestState['extraMessage'] + ) => { + setTests((t) => { + const indexOfTest = t.findIndex((v) => v.runner === runner) + if (indexOfTest === -1) { + throw new Error( + `Test ${runner} does not exist in all tests! What did you click? lol` + ) + } + const copy = [...t] + copy[indexOfTest]!.state = newState + copy[indexOfTest]!.extraMessage = newMessage + return copy + }) + } - const runTest = React.useCallback( - (test: TestState) => { - updateTest(test.runner, '⏳ Running', '') - requestAnimationFrame(async () => { - const result = await test.runner.run() - switch (result.status) { - case 'successful': - updateTest(test.runner, '✅ Passed', `Result: ${result.result}`) - break - case 'failed': - updateTest(test.runner, '❌ Failed', `Error: ${result.message}`) - break - } - }) - }, - [updateTest] - ) + const runTest = (test: TestState) => { + updateTest(test.runner, '⏳ Running', '') + requestAnimationFrame(async () => { + const result = await test.runner.run() + switch (result.status) { + case 'successful': + updateTest(test.runner, '✅ Passed', `Result: ${result.result}`) + break + case 'failed': + updateTest(test.runner, '❌ Failed', `Error: ${result.message}`) + break + } + }) + } - const runAllTests = React.useCallback(() => { + const runAllTests = () => { tests.forEach((t) => runTest(t)) - }, [runTest, tests]) + } return ( HybridObject Tests + { + setSelectedIndex(selectedSegmentIndex) + }} + /> + {tests.map((t, i) => ( { const bridge = new KotlinCxxBridgedType(p.type) diff --git a/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts b/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts index 773c6f885..4a228a673 100644 --- a/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts +++ b/packages/nitrogen/src/syntax/kotlin/KotlinCxxBridgedType.ts @@ -168,8 +168,20 @@ export class KotlinCxxBridgedType implements BridgedType<'kotlin', 'c++'> { } } - getTypeCode(language: 'kotlin' | 'c++'): string { + getTypeCode(language: 'kotlin' | 'c++', isBoxed = false): string { switch (this.type.kind) { + case 'number': + case 'bigint': + case 'boolean': + if (isBoxed) { + return getKotlinBoxedPrimitiveType(this.type) + } else { + if (this.type.kind === 'boolean' && language === 'c++') { + // JNI does not use `bool`, so it is a jboolean instead. + return 'jboolean' + } + return this.type.getCode(language) + } case 'array': switch (language) { case 'c++': @@ -624,7 +636,7 @@ export class KotlinCxxBridgedType implements BridgedType<'kotlin', 'c++'> { if (resultingType.hasType) { // it's a Promise resolveBody = ` -auto result = jni::static_ref_cast<${resultingType.getTypeCode('c++')}>(boxedResult); +auto result = jni::static_ref_cast<${resultingType.getTypeCode('c++', true)}>(boxedResult); promise->set_value(${resultingType.parseFromKotlinToCpp('result', 'c++', true)}); `.trim() } else { diff --git a/packages/react-native-nitro-image/README.md b/packages/react-native-nitro-image/README.md index e5fea4c76..47d722b93 100644 --- a/packages/react-native-nitro-image/README.md +++ b/packages/react-native-nitro-image/README.md @@ -34,11 +34,11 @@ npm run nitrogen - [`CMakeLists.txt`](android/CMakeLists.txt): The CMake build file to build C++ code. This contains four important pieces: 1. Creates a library called `NitroImage` (same as in `nitro.json`) 2. Adds all Nitrogen files (`include(.../NitroImage+autolinking.cmake)`) - 3. Adds all custom C++ files (only `HybridTestObject.cpp`) - 4. Adds a `cpp-adapter.cpp` file, which autolinks all C++ HybridObjects (only `HybridTestObject`) + 3. Adds all custom C++ files (only `HybridTestObjectCpp.cpp`) + 4. Adds a `cpp-adapter.cpp` file, which autolinks all C++ HybridObjects (only `HybridTestObjectCpp`) - [`src/main/java/com/margelo/nitro/image/`](android/src/main/java/com/margelo/nitro/image/): All Kotlin implementations. - [`NitroImagePackage.java`](android/src/main/java/com/margelo/nitro/image/NitroImagePackage.java): The react-native package. You need this because the react-native CLI only adds libraries if they have a `*Package.java` file. In here, you can autolink all Kotlin HybridObjects (`ImageFactory`) -- [`cpp/`](cpp): All your cross-platform implementations. (only `HybridTestObject.cpp`) +- [`cpp/`](cpp): All your cross-platform implementations. (only `HybridTestObjectCpp.cpp`) - [`ios/`](ios): All your iOS-specific implementations. (`HybridImage.swift` and `HybridImageFactory.swift`) - [`nitrogen/`](nitrogen): All files generated by nitrogen. You should commit this folder to git. - [`src/`](src): The TypeScript codebase. This defines all HybridObjects and loads them at runtime. diff --git a/packages/react-native-nitro-image/android/CMakeLists.txt b/packages/react-native-nitro-image/android/CMakeLists.txt index 97a5f6a51..caa0ee18a 100644 --- a/packages/react-native-nitro-image/android/CMakeLists.txt +++ b/packages/react-native-nitro-image/android/CMakeLists.txt @@ -8,7 +8,7 @@ set (CMAKE_CXX_STANDARD 20) # Define C++ library and add all sources add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp - ../cpp/HybridTestObject.cpp + ../cpp/HybridTestObjectCpp.cpp ) # Add Nitrogen specs :) diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt new file mode 100644 index 000000000..230db4272 --- /dev/null +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridTestObjectKotlin.kt @@ -0,0 +1,144 @@ +package com.margelo.nitro.image + +import android.util.Log +import com.margelo.nitro.core.AnyMap +import com.margelo.nitro.core.AnyValue +import com.margelo.nitro.core.ArrayBuffer +import com.margelo.nitro.core.Promise +import kotlinx.coroutines.delay +import java.nio.ByteBuffer +import kotlin.concurrent.thread + + +class HybridTestObjectKotlin: HybridTestObjectSwiftKotlinSpec() { + override var numberValue: Double = 0.0 + override var boolValue: Boolean = false + override var stringValue: String = "" + override var bigintValue: Long = 0L + override var stringOrUndefined: String? = null + override var stringOrNull: String? = null + override var optionalString: String? = null + override val thisObject: HybridTestObjectSwiftKotlinSpec + get() = this + + override fun simpleFunc() { + // do nothing + } + + override fun addNumbers(a: Double, b: Double): Double { + return a + b + } + + override fun addStrings(a: String, b: String): String { + return a + b + } + + override fun multipleArguments(num: Double, str: String, boo: Boolean) { + Log.i(TAG, "Arguments received! num: $num | str: $str | boo: $boo") + } + + override fun createMap(): AnyMap { + val map = AnyMap() + map.setDouble("number", numberValue) + map.setBoolean("bool", boolValue) + map.setString("string", stringValue) + map.setBigInt("bigint", bigintValue) + map.setNull("null") + map.setAnyArray("array", arrayOf(AnyValue(numberValue), AnyValue(boolValue), AnyValue(stringValue), AnyValue(bigintValue))) + map.setAnyObject("object", mapOf( + "number" to AnyValue(numberValue), + "bool" to AnyValue(boolValue), + "string" to AnyValue(stringValue), + "bigint" to AnyValue(bigintValue), + "null" to AnyValue() + )) + return map + } + + override fun mapRoundtrip(map: AnyMap): AnyMap { + return map + } + + override fun funcThatThrows(): Double { + throw Error("This function will only work after sacrificing seven lambs!") + } + + override fun tryOptionalParams(num: Double, boo: Boolean, str: String?): String { + return str ?: "value omitted!" + } + + override fun tryMiddleParam(num: Double, boo: Boolean?, str: String): String { + return str + } + + override fun calculateFibonacciSync(value: Double): Long { + val n = value.toInt() + if (n == 0) return 0L + if (n == 1) return 1L + + var a = 0L + var b = 1L + for (i in 2..n) { + val next = a + b + a = b + b = next + } + return b + } + + override fun calculateFibonacciAsync(value: Double): Promise { + return Promise.parallel { calculateFibonacciSync(value) } + } + + override fun wait(seconds: Double): Promise { + return Promise.async { delay(seconds.toLong() * 1000) } + } + + override fun callCallback(callback: () -> Unit) { + callback() + } + + override fun callAll(first: () -> Unit, second: () -> Unit, third: () -> Unit) { + first() + second() + third() + } + + override fun getCar(): Car { + return Car(2018.0, "Lamborghini", "Huracán", 640.0, Powertrain.GAS, null) + } + + override fun isCarElectric(car: Car): Boolean { + return car.powertrain == Powertrain.ELECTRIC + } + + override fun getDriver(car: Car): Person? { + return car.driver + } + + override fun createArrayBuffer(): ArrayBuffer { + return ArrayBuffer.allocate(1024 * 1024 * 10) // 10 MB + } + + override fun getBufferLastItem(buffer: ArrayBuffer): Double { + val byteBuffer = buffer.getBuffer(false) + val lastItem = byteBuffer[buffer.size - 1] + return lastItem.toDouble() + } + + override fun setAllValuesTo(buffer: ArrayBuffer, value: Double) { + val byteBuffer = buffer.getBuffer(false) + byteBuffer.rewind() + val byte = value.toInt().toByte() + while (byteBuffer.hasRemaining()) { + byteBuffer.put(byte) + } + } + + override fun newTestObject(): HybridTestObjectSwiftKotlinSpec { + return HybridTestObjectKotlin() + } + + override val memorySize: Long + get() = 0L +} diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/KotlinTestObject.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/KotlinTestObject.kt deleted file mode 100644 index c79cf863e..000000000 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/KotlinTestObject.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.margelo.nitro.image - -import com.margelo.nitro.core.AnyMap -import com.margelo.nitro.core.AnyValue -import com.margelo.nitro.core.ArrayBuffer -import com.margelo.nitro.core.Promise -import java.nio.ByteBuffer -import kotlin.concurrent.thread - - -class KotlinTestObject: HybridKotlinTestObjectSpec() { - override var numberValue: Double = 0.0 - override var optionalNumber: Double? = null - override var primitiveArray: DoubleArray = doubleArrayOf() - override var carCollection: Array = emptyArray() - override var someBuffer: ArrayBuffer - - override val memorySize: Long - get() = 0 - - init { - someBuffer = ArrayBuffer(ByteBuffer.allocateDirect(1024 * 1024)) - } - - // Methods - override fun asyncTest(): Promise { - return Promise.async { - Thread.sleep(3000) - } - } - - override fun createMap(): AnyMap { - val map = AnyMap() - map.setDouble("double", 55.0) - map.setString("string", "String!") - map.setBoolean("bool", true) - map.setBigInt("bigint", 893256789) - map.setAnyObject("object", mapOf("first" to AnyValue(1), "second" to AnyValue("string"), "third" to AnyValue( - mapOf("nested" to AnyValue(true)) - ))) - map.setAnyArray("array", arrayOf(AnyValue(11), AnyValue(true), AnyValue(33.5), AnyValue("string"), AnyValue( - arrayOf(AnyValue("nested"), AnyValue(true)) - ))) - return map - } - - override fun addOnPersonBornListener(callback: (p: Person) -> Unit) { - callback(Person("Marc", 24.0)) - thread { - Thread.sleep(500) - callback(Person("Marc", 24.0)) - } - thread { - Thread.sleep(700) - callback(Person("Marc", 24.0)) - } - thread { - Thread.sleep(1500) - callback(Person("Marc", 24.0)) - } - } - - override var someRecord: Map = mapOf("something" to "else") -} diff --git a/packages/react-native-nitro-image/cpp/HybridTestObject.cpp b/packages/react-native-nitro-image/cpp/HybridTestObject.cpp deleted file mode 100644 index 3fa1f0d50..000000000 --- a/packages/react-native-nitro-image/cpp/HybridTestObject.cpp +++ /dev/null @@ -1,306 +0,0 @@ -// -// HybridTestObject.cpp -// NitroImage -// -// Created by Marc Rousavy on 30.07.24. -// - -#include "HybridTestObject.hpp" -#include -#include -#include -#include - -namespace margelo::nitro::image { - -// Properties -double HybridTestObject::getNumberValue() { - return _number; -} - -void HybridTestObject::setNumberValue(double numberValue) { - _number = numberValue; -} - -bool HybridTestObject::getBoolValue() { - return _bool; -} - -void HybridTestObject::setBoolValue(bool boolValue) { - _bool = boolValue; -} - -std::string HybridTestObject::getStringValue() { - return _string; -} - -void HybridTestObject::setStringValue(const std::string& stringValue) { - _string = stringValue; -} - -int64_t HybridTestObject::getBigintValue() { - return _bigint; -} - -void HybridTestObject::setBigintValue(int64_t bigintValue) { - _bigint = bigintValue; -} - -std::optional HybridTestObject::getStringOrUndefined() { - return _optionalString; -} - -void HybridTestObject::setStringOrUndefined(const std::optional& stringOrUndefined) { - _optionalString = stringOrUndefined; -} - -std::optional HybridTestObject::getStringOrNull() { - return _optionalString; -} - -void HybridTestObject::setStringOrNull(const std::optional& stringOrNull) { - _optionalString = stringOrNull; -} - -std::optional HybridTestObject::getOptionalString() { - return _optionalString; -} - -void HybridTestObject::setOptionalString(const std::optional& optionalString) { - _optionalString = optionalString; -} - -double HybridTestObject::getValueThatWillThrowOnAccess() { - throw std::runtime_error("The stars are not aligned for this to work right now!"); -} - -void HybridTestObject::setValueThatWillThrowOnAccess(double valueThatWillThrowOnAccess) { - throw std::runtime_error("This value can only be set in 100000 years!"); -} - -std::variant HybridTestObject::getSomeVariant() { - return _variant; -} - -void HybridTestObject::setSomeVariant(const std::variant& variant) { - _variant = variant; -} - -std::tuple HybridTestObject::getSomeTuple() { - return _tuple; -} - -void HybridTestObject::setSomeTuple(const std::tuple& tuple) { - _tuple = tuple; -} - -std::shared_ptr HybridTestObject::getSelf() { - return shared(); -} - -// Methods -double HybridTestObject::addNumbers(double a, double b) { - return a + b; -} - -std::string HybridTestObject::addStrings(const std::string& a, const std::string& b) { - return a + b; -} - -void HybridTestObject::simpleFunc() { - // do nothing -} - -void HybridTestObject::multipleArguments(double num, const std::string& str, bool boo) { - Logger::log(LogLevel::Info, TAG, "Arguments received! num: %f | str: %s | boo: %i", num, str.c_str(), boo); -} - -std::shared_ptr HybridTestObject::createMap() { - auto map = AnyMap::make(); - map->setDouble("number", getNumberValue()); - map->setBoolean("bool", getBoolValue()); - map->setString("string", getStringValue()); - map->setBigInt("bigint", getBigintValue()); - map->setNull("null"); - std::vector array{getNumberValue(), getBoolValue(), getStringValue(), getBigintValue()}; - map->setArray("array", {getNumberValue(), getBoolValue(), getStringValue(), getBigintValue(), array}); - map->setObject("object", {{"number", getNumberValue()}, - {"bool", getBoolValue()}, - {"string", getStringValue()}, - {"bigint", getBigintValue()}, - {"null", std::monostate()}, - {"array", array}}); - return map; -} - -std::shared_ptr HybridTestObject::mapRoundtrip(const std::shared_ptr& map) { - return map; -} - -double HybridTestObject::funcThatThrows() { - throw std::runtime_error("This function will only work after sacrificing seven lambs!"); -} - -std::string HybridTestObject::tryOptionalParams(double num, bool boo, const std::optional& str) { - if (str.has_value()) { - return str.value(); - } else { - return "value omitted!"; - } -} - -std::string HybridTestObject::tryMiddleParam(double num, std::optional boo, const std::string& str) { - return str; -} - -std::variant -HybridTestObject::passVariant(const std::variant, std::vector>& either) { - if (std::holds_alternative(either)) { - return std::get(either); - } else if (std::holds_alternative(either)) { - return std::get(either); - } else { - return {"holds something else!"}; - } -} - -std::variant HybridTestObject::getVariantEnum(const std::variant& variant) { - return variant; -} - -std::variant HybridTestObject::getVariantObjects(const std::variant& variant) { - return variant; -} - -std::variant, Person> -HybridTestObject::getVariantHybrid(const std::variant, Person>& variant) { - return variant; -} - -std::variant, std::tuple> -HybridTestObject::getVariantTuple(const std::variant, std::tuple>& variant) { - return variant; -} - -std::tuple HybridTestObject::flip(const std::tuple& tuple) { - return {std::get<2>(tuple), std::get<1>(tuple), std::get<0>(tuple)}; -} - -std::tuple HybridTestObject::passTuple(const std::tuple& tuple) { - return tuple; -} - -int64_t HybridTestObject::calculateFibonacciSync(double value) { - return calculateFibonacci(value); -} - -std::future HybridTestObject::calculateFibonacciAsync(double value) { - return std::async(std::launch::async, [=]() -> int64_t { return this->calculateFibonacci(value); }); -} - -std::future HybridTestObject::wait(double seconds) { - return std::async(std::launch::async, [=]() { - std::chrono::nanoseconds nanoseconds(static_cast(seconds * 1'000'000'000)); - std::this_thread::sleep_for(nanoseconds); - }); -} - -void HybridTestObject::callCallback(const std::function& callback) { - callback(); -} - -void HybridTestObject::getValueFromJSCallback(const std::function()>& getValue) { - ThreadPool::getSharedPool()->run([=]() { - std::future future = getValue(); - future.wait(); - }); -} - -std::future HybridTestObject::getValueFromJSCallbackAndWait(const std::function()>& getValue) { - return std::async(std::launch::async, [=]() -> double { - std::future future = getValue(); - future.wait(); - double value = future.get(); - return value; - }); -} - -void HybridTestObject::callAll(const std::function& first, const std::function& second, - const std::function& third) { - first(); - second(); - third(); -} - -std::future HybridTestObject::getValueFromJsCallback(const std::function()>& callback, - const std::function& andThenCall) { - return std::async(std::launch::async, [=]() { - std::future future = callback(); - std::string jsValue = future.get(); - andThenCall(jsValue); - }); -} - -Car HybridTestObject::getCar() { - return Car(2018, "Lamborghini", "Huracan Performante", 640, Powertrain::GAS, std::nullopt); -} - -bool HybridTestObject::isCarElectric(const Car& car) { - return car.powertrain == Powertrain::ELECTRIC; -} - -std::optional HybridTestObject::getDriver(const Car& car) { - if (car.driver.has_value()) { - return car.driver.value(); - } else { - return std::nullopt; - } -} - -std::shared_ptr HybridTestObject::createArrayBuffer() { - size_t size = 1024 * 1024 * 10; // 10MB - uint8_t* buffer = new uint8_t[size]; - return std::make_shared(buffer, size, [=]() { delete[] buffer; }); -} - -double HybridTestObject::getBufferLastItem(const std::shared_ptr& buffer) { - size_t size = buffer->size(); - if (size == 0) { - throw std::runtime_error("ArrayBuffer's size is 0!"); - } - uint8_t* data = buffer->data(); - if (data == nullptr) { - throw std::runtime_error("ArrayBuffer's data is nullptr!"); - } - uint8_t lastItem = data[size - 1]; - return static_cast(lastItem); -} - -void HybridTestObject::setAllValuesTo(const std::shared_ptr& buffer, double value) { - size_t size = buffer->size(); - if (size == 0) { - throw std::runtime_error("ArrayBuffer's size is 0!"); - } - uint8_t* data = buffer->data(); - if (data == nullptr) { - throw std::runtime_error("ArrayBuffer's data is nullptr!"); - } - - for (size_t i = 0; i < size; i++) { - data[i] = static_cast(value); - } -} - -std::shared_ptr HybridTestObject::newTestObject() { - return std::make_shared(); -} - -jsi::Value HybridTestObject::rawJsiFunc(jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* args, size_t count) { - jsi::Array array(runtime, count); - for (size_t i = 0; i < count; i++) { - array.setValueAtIndex(runtime, i, jsi::Value(runtime, args[i])); - } - return array; -} - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp new file mode 100644 index 000000000..f4edad826 --- /dev/null +++ b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.cpp @@ -0,0 +1,299 @@ +// +// HybridTestObjectCpp.cpp +// NitroImage +// +// Created by Marc Rousavy on 30.07.24. +// + +#include "HybridTestObjectCpp.hpp" +#include +#include +#include +#include + +namespace margelo::nitro::image { + +// Properties +double HybridTestObjectCpp::getNumberValue() { + return _number; +} + +void HybridTestObjectCpp::setNumberValue(double numberValue) { + _number = numberValue; +} + +bool HybridTestObjectCpp::getBoolValue() { + return _bool; +} + +void HybridTestObjectCpp::setBoolValue(bool boolValue) { + _bool = boolValue; +} + +std::string HybridTestObjectCpp::getStringValue() { + return _string; +} + +void HybridTestObjectCpp::setStringValue(const std::string& stringValue) { + _string = stringValue; +} + +int64_t HybridTestObjectCpp::getBigintValue() { + return _bigint; +} + +void HybridTestObjectCpp::setBigintValue(int64_t bigintValue) { + _bigint = bigintValue; +} + +std::optional HybridTestObjectCpp::getStringOrUndefined() { + return _optionalString; +} + +void HybridTestObjectCpp::setStringOrUndefined(const std::optional& stringOrUndefined) { + _optionalString = stringOrUndefined; +} + +std::optional HybridTestObjectCpp::getStringOrNull() { + return _optionalString; +} + +void HybridTestObjectCpp::setStringOrNull(const std::optional& stringOrNull) { + _optionalString = stringOrNull; +} + +std::optional HybridTestObjectCpp::getOptionalString() { + return _optionalString; +} + +void HybridTestObjectCpp::setOptionalString(const std::optional& optionalString) { + _optionalString = optionalString; +} + +std::variant HybridTestObjectCpp::getSomeVariant() { + return _variant; +} + +void HybridTestObjectCpp::setSomeVariant(const std::variant& variant) { + _variant = variant; +} + +std::tuple HybridTestObjectCpp::getSomeTuple() { + return _tuple; +} + +void HybridTestObjectCpp::setSomeTuple(const std::tuple& tuple) { + _tuple = tuple; +} + +std::shared_ptr HybridTestObjectCpp::getThisObject() { + return shared(); +} + +// Methods +double HybridTestObjectCpp::addNumbers(double a, double b) { + return a + b; +} + +std::string HybridTestObjectCpp::addStrings(const std::string& a, const std::string& b) { + return a + b; +} + +void HybridTestObjectCpp::simpleFunc() { + // do nothing +} + +void HybridTestObjectCpp::multipleArguments(double num, const std::string& str, bool boo) { + Logger::log(LogLevel::Info, TAG, "Arguments received! num: %f | str: %s | boo: %i", num, str.c_str(), boo); +} + +std::shared_ptr HybridTestObjectCpp::createMap() { + auto map = AnyMap::make(); + map->setDouble("number", getNumberValue()); + map->setBoolean("bool", getBoolValue()); + map->setString("string", getStringValue()); + map->setBigInt("bigint", getBigintValue()); + map->setNull("null"); + std::vector array{getNumberValue(), getBoolValue(), getStringValue(), getBigintValue()}; + map->setArray("array", {getNumberValue(), getBoolValue(), getStringValue(), getBigintValue(), array}); + map->setObject("object", {{"number", getNumberValue()}, + {"bool", getBoolValue()}, + {"string", getStringValue()}, + {"bigint", getBigintValue()}, + {"null", std::monostate()}, + {"array", array}}); + return map; +} + +std::shared_ptr HybridTestObjectCpp::mapRoundtrip(const std::shared_ptr& map) { + return map; +} + +double HybridTestObjectCpp::funcThatThrows() { + throw std::runtime_error("This function will only work after sacrificing seven lambs!"); +} + +std::string HybridTestObjectCpp::tryOptionalParams(double num, bool boo, const std::optional& str) { + if (str.has_value()) { + return str.value(); + } else { + return "value omitted!"; + } +} + +std::string HybridTestObjectCpp::tryMiddleParam(double num, std::optional boo, const std::string& str) { + return str; +} + +std::variant +HybridTestObjectCpp::passVariant(const std::variant, std::vector>& either) { + if (std::holds_alternative(either)) { + return std::get(either); + } else if (std::holds_alternative(either)) { + return std::get(either); + } else { + return {"holds something else!"}; + } +} + +std::variant HybridTestObjectCpp::getVariantEnum(const std::variant& variant) { + return variant; +} + +std::variant HybridTestObjectCpp::getVariantObjects(const std::variant& variant) { + return variant; +} + +std::variant, Person> HybridTestObjectCpp::getVariantHybrid( + const std::variant, Person>& variant) { + return variant; +} + +std::variant, std::tuple> +HybridTestObjectCpp::getVariantTuple(const std::variant, std::tuple>& variant) { + return variant; +} + +std::tuple HybridTestObjectCpp::flip(const std::tuple& tuple) { + return {std::get<2>(tuple), std::get<1>(tuple), std::get<0>(tuple)}; +} + +std::tuple HybridTestObjectCpp::passTuple(const std::tuple& tuple) { + return tuple; +} + +int64_t HybridTestObjectCpp::calculateFibonacciSync(double value) { + return calculateFibonacci(value); +} + +std::future HybridTestObjectCpp::calculateFibonacciAsync(double value) { + return std::async(std::launch::async, [=]() -> int64_t { return this->calculateFibonacci(value); }); +} + +std::future HybridTestObjectCpp::wait(double seconds) { + return std::async(std::launch::async, [=]() { + std::chrono::nanoseconds nanoseconds(static_cast(seconds * 1'000'000'000)); + std::this_thread::sleep_for(nanoseconds); + }); +} + +void HybridTestObjectCpp::callCallback(const std::function& callback) { + callback(); +} + +void HybridTestObjectCpp::getValueFromJSCallback(const std::function()>& getValue) { + ThreadPool::getSharedPool()->run([=]() { + std::future future = getValue(); + future.wait(); + }); +} + +std::future HybridTestObjectCpp::getValueFromJSCallbackAndWait(const std::function()>& getValue) { + return std::async(std::launch::async, [=]() -> double { + std::future future = getValue(); + future.wait(); + double value = future.get(); + return value; + }); +} + +void HybridTestObjectCpp::callAll(const std::function& first, const std::function& second, + const std::function& third) { + first(); + second(); + third(); +} + +std::future +HybridTestObjectCpp::getValueFromJsCallback(const std::function()>& callback, + const std::function& andThenCall) { + return std::async(std::launch::async, [=]() { + std::future future = callback(); + std::string jsValue = future.get(); + andThenCall(jsValue); + }); +} + +Car HybridTestObjectCpp::getCar() { + return Car(2018, "Lamborghini", "Huracan Performante", 640, Powertrain::GAS, std::nullopt); +} + +bool HybridTestObjectCpp::isCarElectric(const Car& car) { + return car.powertrain == Powertrain::ELECTRIC; +} + +std::optional HybridTestObjectCpp::getDriver(const Car& car) { + if (car.driver.has_value()) { + return car.driver.value(); + } else { + return std::nullopt; + } +} + +std::shared_ptr HybridTestObjectCpp::createArrayBuffer() { + size_t size = 1024 * 1024 * 10; // 10MB + uint8_t* buffer = new uint8_t[size]; + return std::make_shared(buffer, size, [=]() { delete[] buffer; }); +} + +double HybridTestObjectCpp::getBufferLastItem(const std::shared_ptr& buffer) { + size_t size = buffer->size(); + if (size == 0) { + throw std::runtime_error("ArrayBuffer's size is 0!"); + } + uint8_t* data = buffer->data(); + if (data == nullptr) { + throw std::runtime_error("ArrayBuffer's data is nullptr!"); + } + uint8_t lastItem = data[size - 1]; + return static_cast(lastItem); +} + +void HybridTestObjectCpp::setAllValuesTo(const std::shared_ptr& buffer, double value) { + size_t size = buffer->size(); + if (size == 0) { + throw std::runtime_error("ArrayBuffer's size is 0!"); + } + uint8_t* data = buffer->data(); + if (data == nullptr) { + throw std::runtime_error("ArrayBuffer's data is nullptr!"); + } + + for (size_t i = 0; i < size; i++) { + data[i] = static_cast(value); + } +} + +std::shared_ptr HybridTestObjectCpp::newTestObject() { + return std::make_shared(); +} + +jsi::Value HybridTestObjectCpp::rawJsiFunc(jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* args, size_t count) { + jsi::Array array(runtime, count); + for (size_t i = 0; i < count; i++) { + array.setValueAtIndex(runtime, i, jsi::Value(runtime, args[i])); + } + return array; +} + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/cpp/HybridTestObject.hpp b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp similarity index 87% rename from packages/react-native-nitro-image/cpp/HybridTestObject.hpp rename to packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp index 10fef3687..4ef9f7ef7 100644 --- a/packages/react-native-nitro-image/cpp/HybridTestObject.hpp +++ b/packages/react-native-nitro-image/cpp/HybridTestObjectCpp.hpp @@ -1,5 +1,5 @@ // -// HybridTestObject.hpp +// HybridTestObjectCpp.hpp // NitroImage // // Created by Marc Rousavy on 30.07.24. @@ -7,16 +7,16 @@ #pragma once -#include "HybridTestObjectSpec.hpp" +#include "HybridTestObjectCppSpec.hpp" #include namespace margelo::nitro::image { using namespace facebook; -class HybridTestObject : public HybridTestObjectSpec { +class HybridTestObjectCpp : public HybridTestObjectCppSpec { public: - HybridTestObject() : HybridObject(TAG) {} + HybridTestObjectCpp() : HybridObject(TAG) {} private: double _number; @@ -53,13 +53,11 @@ class HybridTestObject : public HybridTestObjectSpec { void setStringOrNull(const std::optional& stringOrNull) override; std::optional getOptionalString() override; void setOptionalString(const std::optional& optionalString) override; - double getValueThatWillThrowOnAccess() override; - void setValueThatWillThrowOnAccess(double valueThatWillThrowOnAccess) override; std::variant getSomeVariant() override; void setSomeVariant(const std::variant& variant) override; std::tuple getSomeTuple() override; void setSomeTuple(const std::tuple& tuple) override; - std::shared_ptr getSelf() override; + std::shared_ptr getThisObject() override; public: // Methods @@ -77,8 +75,8 @@ class HybridTestObject : public HybridTestObjectSpec { std::variant getVariantEnum(const std::variant& variant) override; std::variant getVariantObjects(const std::variant& variant) override; - std::variant, Person> - getVariantHybrid(const std::variant, Person>& variant) override; + std::variant, Person> + getVariantHybrid(const std::variant, Person>& variant) override; std::variant, std::tuple> getVariantTuple(const std::variant, std::tuple>& variant) override; @@ -99,16 +97,17 @@ class HybridTestObject : public HybridTestObjectSpec { std::shared_ptr createArrayBuffer() override; double getBufferLastItem(const std::shared_ptr& buffer) override; void setAllValuesTo(const std::shared_ptr& buffer, double value) override; - std::shared_ptr newTestObject() override; + std::shared_ptr newTestObject() override; // Raw JSI functions jsi::Value rawJsiFunc(jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* args, size_t count); void loadHybridMethods() override { // call base protoype - HybridTestObjectSpec::loadHybridMethods(); + HybridTestObjectCppSpec::loadHybridMethods(); // register all methods we override here - registerHybrids(this, [](Prototype& prototype) { prototype.registerRawHybridMethod("rawJsiFunc", 0, &HybridTestObject::rawJsiFunc); }); + registerHybrids(this, + [](Prototype& prototype) { prototype.registerRawHybridMethod("rawJsiFunc", 0, &HybridTestObjectCpp::rawJsiFunc); }); } }; diff --git a/packages/react-native-nitro-image/ios/HybridSwiftKotlinTestObject.swift b/packages/react-native-nitro-image/ios/HybridSwiftKotlinTestObject.swift deleted file mode 100644 index 43db8401a..000000000 --- a/packages/react-native-nitro-image/ios/HybridSwiftKotlinTestObject.swift +++ /dev/null @@ -1,137 +0,0 @@ -// -// HybridSwiftKotlinTestObject.swift -// NitroImage -// -// Created by Marc Rousavy on 11.08.24. -// - -import Foundation -import NitroModules - -class HybridSwiftKotlinTestObject : HybridSwiftKotlinTestObjectSpec { - func call(args: CallbackHolder) throws { - args.callback() - } - - func doSomeStuff(withEnum callback: @escaping ((Powertrain, String, ArrayBufferHolder) -> Void)) throws { - DispatchQueue.global().asyncAfter(deadline: .now() + 2) { - callback(.gas, "HELLO!", .allocate(size: 2048)) - } - } - - - func getStringAsync() throws -> Promise { - return Promise.parallel { - Thread.sleep(forTimeInterval: 1) - return "hello from Swift!" - } - } - - func getCarAsync() throws -> Promise { - return Promise.parallel { - Thread.sleep(forTimeInterval: 1) - let driver = Person(name: "Marc", age: 24) - return Car(year: 2018, make: "Lamborghini", model: "Huracan", power: 640, powertrain: .gas, driver: driver) - } - } - - func getNumberAsync() throws -> Promise { - return Promise.parallel { - Thread.sleep(forTimeInterval: 1) - return 13 - } - } - - func call(callMeMaybe: ((String) -> Void)?) throws { - // do nothing - } - - func newTestObject() throws -> any HybridSwiftKotlinTestObjectSpec { - return HybridSwiftKotlinTestObject() - } - func bounceBack(obj: any HybridSwiftKotlinTestObjectSpec) throws -> any HybridSwiftKotlinTestObjectSpec { - return obj - } - - var person: Person = Person("Hello", 21) - - var car: Car? = .init(year: 2018, make: "Lamborghini", model: "Huracan", power: 640, powertrain: .gas, driver: nil) - - var powertrain: Powertrain = .gas - var oldEnum: OldEnum = .first - - var hybridContext = margelo.nitro.HybridContext() - var memorySize: Int { - return getSizeOf(self) - } - - var numberValue: Double = 0.0 - var boolValue: Bool = false - var stringValue: String = "" - var bigintValue: Int64 = 0 - var stringOrUndefined: String? = nil - var stringOrNull: String? = nil - var optionalString: String? = nil - var buffer: ArrayBufferHolder = .allocate(size: 1024, initializeToZero: true) - - func createNewBuffer(size: Double) throws -> ArrayBufferHolder { - return .allocate(size: Int(size)) - } - - func simpleFunc() throws { - // do nothing - } - - func addNumbers(a: Double, b: Double) throws -> Double { - return a + b - } - - func addStrings(a: String, b: String) throws -> String { - return a + b - } - - func multipleArguments(num: Double, str: String, boo: Bool) throws { - print("Arguments received! num: \(num) | str: \(str) | boo: \(boo)") - } - - func getNumbers() throws -> [Double] { - return [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] - } - - func getStrings() throws -> [String] { - return ["h", "e", "ll", "o"] - } - - func callCallback(callback: @escaping () -> Void) throws { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - callback() - } - } - - var someMap: AnyMapHolder = .init() - - var someRecord: Dictionary { - get { - return [ - "hello": 55.0 - ] - } - set { - - } - } - - var someArray: [String] { - get { - return ["hello"] - } - set { - - } - } - - var someOptional: String? { - get { return "Hello" } - set { } - } -} diff --git a/packages/react-native-nitro-image/ios/HybridTestObjectSwiftKotlin.swift b/packages/react-native-nitro-image/ios/HybridTestObjectSwiftKotlin.swift new file mode 100644 index 000000000..a227864fc --- /dev/null +++ b/packages/react-native-nitro-image/ios/HybridTestObjectSwiftKotlin.swift @@ -0,0 +1,162 @@ +// +// HybridTestObjectSwift.swift +// NitroImage +// +// Created by Marc Rousavy on 11.08.24. +// + +import Foundation +import NitroModules + +class HybridTestObjectSwift : HybridTestObjectSwiftKotlinSpec { + var numberValue: Double = 0.0 + + var boolValue: Bool = false + + var stringValue: String = "" + + var bigintValue: Int64 = 0 + + var stringOrUndefined: String? = nil + + var stringOrNull: String? = nil + + var optionalString: String? = nil + + func simpleFunc() throws { + // do nothing + } + + func addNumbers(a: Double, b: Double) throws -> Double { + return a + b + } + + func addStrings(a: String, b: String) throws -> String { + return a + b + } + + func multipleArguments(num: Double, str: String, boo: Bool) throws { + print("Arguments received! num: \(num) | str: \(str) | boo: \(boo)") + } + + func callCallback(callback: @escaping (() -> Void)) throws { + callback() + } + + var hybridContext: margelo.nitro.HybridContext = .init() + + var memorySize: Int { + return 0 + } + + func createMap() throws -> AnyMapHolder { + let map = AnyMapHolder() + map.setDouble(key: "number", value: numberValue) + map.setBoolean(key: "bool", value: boolValue) + map.setString(key: "string", value: stringValue) + map.setBigInt(key: "bigint", value: bigintValue) + map.setNull(key: "null") + // TODO: Arrays are not supported yet on Swift AnyMap + // map.setArray( + map.setObject(key: "object", value: [ + "number": .number(numberValue), + "bool": .bool(boolValue), + "string": .string(stringValue), + "bigint": .bool(boolValue), + "null": .null, + // TODO: Arrays are not supported yet on Swift AnyValue + // "array": .array( + ]) + return map + } + + var thisObject: any HybridTestObjectSwiftKotlinSpec { + return self + } + + func newTestObject() throws -> any HybridTestObjectSwiftKotlinSpec { + return HybridTestObjectSwift() + } + + func mapRoundtrip(map: AnyMapHolder) throws -> AnyMapHolder { + return map + } + + func funcThatThrows() throws -> Double { + // TODO: Swift functions can not throw yet! Errors are not propagated up to C++. + // throw RuntimeError.error(withMessage: "This function will only work after sacrificing seven lambs!") + return 55 + } + + func tryOptionalParams(num: Double, boo: Bool, str: String?) throws -> String { + if let str { + return str + } else { + return "value omitted!" + } + } + + func tryMiddleParam(num: Double, boo: Bool?, str: String) throws -> String { + return str + } + + func calculateFibonacciSync(value: Double) throws -> Int64 { + let n = Int64(value) + if n <= 1 { + return n + } + + var a = Int64(0) + var b = Int64(1) + for _ in 2...n { + let temp = a + b + a = b + b = temp + } + return b + } + + func calculateFibonacciAsync(value: Double) throws -> Promise { + return Promise.async { + return try self.calculateFibonacciSync(value: value) + } + } + + func wait(seconds: Double) throws -> Promise { + return Promise.async { + try await Task.sleep(nanoseconds: UInt64(seconds) * 1_000_000_000) + } + } + + func callAll(first: @escaping (() -> Void), second: @escaping (() -> Void), third: @escaping (() -> Void)) throws { + first() + second() + third() + } + + func getCar() throws -> Car { + return Car(year: 2018, make: "Lamborghini", model: "Huracán", power: 640, powertrain: .gas, driver: nil) + } + + func isCarElectric(car: Car) throws -> Bool { + return car.powertrain == .electric + } + + func getDriver(car: Car) throws -> Person? { + return car.driver + } + + func createArrayBuffer() throws -> ArrayBufferHolder { + return .allocate(size: 1024 * 1024 * 10) // 10 MB + } + + func getBufferLastItem(buffer: ArrayBufferHolder) throws -> Double { + let lastBytePointer = buffer.data.advanced(by: buffer.size - 1) + let lastByte = lastBytePointer.load(as: UInt8.self) + return Double(lastByte) + } + + func setAllValuesTo(buffer: ArrayBufferHolder, value: Double) throws { + memset(buffer.data, Int32(value), buffer.size) + } +} diff --git a/packages/react-native-nitro-image/ios/NitroImageRegistry.swift b/packages/react-native-nitro-image/ios/NitroImageRegistry.swift deleted file mode 100644 index 832a3fed6..000000000 --- a/packages/react-native-nitro-image/ios/NitroImageRegistry.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// NitroImageRegistry.swift -// NitroImage -// -// Created by Marc Rousavy on 22.07.24. -// - -import Foundation - -public class NitroImageRegistry { - public static func createImageFactory() -> HybridImageFactorySpecCxx { - let imageFactory = HybridImageFactory() - return HybridImageFactorySpecCxx(imageFactory) - } - public static func createSwiftKotlinTestObject() -> HybridSwiftKotlinTestObjectSpecCxx { - let testObject = HybridSwiftKotlinTestObject() - return HybridSwiftKotlinTestObjectSpecCxx(testObject) - } -} diff --git a/packages/react-native-nitro-image/nitro.json b/packages/react-native-nitro-image/nitro.json index 30cd3d8bb..fede5916a 100644 --- a/packages/react-native-nitro-image/nitro.json +++ b/packages/react-native-nitro-image/nitro.json @@ -12,14 +12,12 @@ "swift": "HybridImageFactory", "kotlin": "ImageFactory" }, - "TestObject": { - "cpp": "HybridTestObject" + "TestObjectCpp": { + "cpp": "HybridTestObjectCpp" }, - "SwiftKotlinTestObject": { - "swift": "HybridSwiftKotlinTestObject" - }, - "KotlinTestObject": { - "kotlin": "KotlinTestObject" + "TestObjectSwiftKotlin": { + "swift": "HybridTestObjectSwift", + "kotlin": "HybridTestObjectKotlin" } }, "ignorePaths": ["node_modules"] diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImage+autolinking.cmake b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImage+autolinking.cmake index cfcade802..342d86cab 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImage+autolinking.cmake +++ b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImage+autolinking.cmake @@ -29,13 +29,12 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridImageSpec.cpp ../nitrogen/generated/shared/c++/HybridImageFactorySpec.cpp - ../nitrogen/generated/shared/c++/HybridTestObjectSpec.cpp - ../nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.cpp - ../nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.cpp + ../nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp + ../nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp # Android-specific Nitrogen C++ sources ../nitrogen/generated/android/c++/JHybridImageSpec.cpp ../nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp - ../nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.cpp + ../nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp ) # Add all libraries required by the generated specs diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp index 3ae6548ea..e64c6bdfd 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp @@ -14,10 +14,10 @@ #include "JHybridImageSpec.hpp" #include "JFunc_void_std__string.hpp" #include "JHybridImageFactorySpec.hpp" -#include "JHybridKotlinTestObjectSpec.hpp" -#include "JFunc_void_Person.hpp" +#include "JHybridTestObjectSwiftKotlinSpec.hpp" +#include "JFunc_void.hpp" #include -#include "HybridTestObject.hpp" +#include "HybridTestObjectCpp.hpp" namespace margelo::nitro::image { @@ -31,8 +31,11 @@ int initialize(JavaVM* vm) { margelo::nitro::image::JHybridImageSpec::registerNatives(); margelo::nitro::image::JFunc_void_std__string::registerNatives(); margelo::nitro::image::JHybridImageFactorySpec::registerNatives(); - margelo::nitro::image::JHybridKotlinTestObjectSpec::registerNatives(); - margelo::nitro::image::JFunc_void_Person::registerNatives(); + margelo::nitro::image::JHybridTestObjectSwiftKotlinSpec::registerNatives(); + margelo::nitro::image::JFunc_void::registerNatives(); + margelo::nitro::image::JFunc_void::registerNatives(); + margelo::nitro::image::JFunc_void::registerNatives(); + margelo::nitro::image::JFunc_void::registerNatives(); // Register Nitro Hybrid Objects HybridObjectRegistry::registerHybridObjectConstructor( @@ -52,28 +55,28 @@ int initialize(JavaVM* vm) { } ); HybridObjectRegistry::registerHybridObjectConstructor( - "TestObject", + "TestObjectCpp", []() -> std::shared_ptr { - static_assert(std::is_default_constructible_v, - "The HybridObject \"HybridTestObject\" is not default-constructible! " + static_assert(std::is_default_constructible_v, + "The HybridObject \"HybridTestObjectCpp\" is not default-constructible! " "Create a public constructor that takes zero arguments to be able to autolink this HybridObject."); - return std::make_shared(); + return std::make_shared(); } ); HybridObjectRegistry::registerHybridObjectConstructor( - "KotlinTestObject", + "TestObjectSwiftKotlin", []() -> std::shared_ptr { - static auto javaClass = jni::findClassStatic("com/margelo/nitro/image/KotlinTestObject"); - static auto defaultConstructor = javaClass->getConstructor(); + static auto javaClass = jni::findClassStatic("com/margelo/nitro/image/HybridTestObjectKotlin"); + static auto defaultConstructor = javaClass->getConstructor(); auto instance = javaClass->newObject(defaultConstructor); #ifndef NDEBUG if (instance == nullptr) [[unlikely]] { - throw std::runtime_error("Failed to create an instance of \"JHybridKotlinTestObjectSpec\" - the constructor returned null!"); + throw std::runtime_error("Failed to create an instance of \"JHybridTestObjectSwiftKotlinSpec\" - the constructor returned null!"); } #endif auto globalRef = jni::make_global(instance); - return JNISharedPtr::make_shared_from_jni(globalRef); + return JNISharedPtr::make_shared_from_jni(globalRef); } ); }); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp new file mode 100644 index 000000000..d435e2942 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void.hpp @@ -0,0 +1,48 @@ +/// +/// JFunc_void.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include + +#include + +namespace margelo::nitro::image { + + using namespace facebook; + + /** + * C++ representation of the callback Func_void. + * This is a Kotlin `() -> Unit`, backed by a `std::function<...>`. + */ + struct JFunc_void final: public jni::HybridClass { + public: + static jni::local_ref fromCpp(const std::function& func) { + return JFunc_void::newObjectCxxArgs(func); + } + + public: + void call() { + return _func(); + } + + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void;"; + static void registerNatives() { + registerHybrid({makeNativeMethod("call", JFunc_void::call)}); + } + + private: + explicit JFunc_void(const std::function& func): _func(func) { } + + private: + friend HybridBase; + std::function _func; + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_Person.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_Person.hpp deleted file mode 100644 index a2603728a..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JFunc_void_Person.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/// -/// JFunc_void_Person.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include - -#include -#include "Person.hpp" -#include "JPerson.hpp" -#include - -namespace margelo::nitro::image { - - using namespace facebook; - - /** - * C++ representation of the callback Func_void_Person. - * This is a Kotlin `(p: Person) -> Unit`, backed by a `std::function<...>`. - */ - struct JFunc_void_Person final: public jni::HybridClass { - public: - static jni::local_ref fromCpp(const std::function& func) { - return JFunc_void_Person::newObjectCxxArgs(func); - } - - public: - void call(const jni::alias_ref& p) { - return _func(p->toCpp()); - } - - public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Func_void_Person;"; - static void registerNatives() { - registerHybrid({makeNativeMethod("call", JFunc_void_Person::call)}); - } - - private: - explicit JFunc_void_Person(const std::function& func): _func(func) { } - - private: - friend HybridBase; - std::function _func; - }; - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp index bfb543100..d593ee9fc 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp @@ -38,22 +38,22 @@ namespace margelo::nitro::image { // Methods std::shared_ptr JHybridImageFactorySpec::loadImageFromFile(const std::string& path) { - static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromFile"); + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromFile"); auto result = method(_javaPart, jni::make_jstring(path)); return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); } std::shared_ptr JHybridImageFactorySpec::loadImageFromURL(const std::string& path) { - static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromURL"); + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromURL"); auto result = method(_javaPart, jni::make_jstring(path)); return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); } std::shared_ptr JHybridImageFactorySpec::loadImageFromSystemName(const std::string& path) { - static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromSystemName"); + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* path */)>("loadImageFromSystemName"); auto result = method(_javaPart, jni::make_jstring(path)); return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); } std::shared_ptr JHybridImageFactorySpec::bounceBack(const std::shared_ptr& image) { - static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* image */)>("bounceBack"); + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* image */)>("bounceBack"); auto result = method(_javaPart, std::static_pointer_cast(image)->getJavaPart()); return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp index 52c2fa3bb..2e965fefc 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp @@ -43,12 +43,12 @@ namespace margelo::nitro::image { // Properties ImageSize JHybridImageSpec::getSize() { - static const auto method = _javaPart->getClass()->getMethod()>("getSize"); + static const auto method = _javaPart->getClass()->getMethod()>("getSize"); auto result = method(_javaPart); return result->toCpp(); } PixelFormat JHybridImageSpec::getPixelFormat() { - static const auto method = _javaPart->getClass()->getMethod()>("getPixelFormat"); + static const auto method = _javaPart->getClass()->getMethod()>("getPixelFormat"); auto result = method(_javaPart); return result->toCpp(); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.cpp deleted file mode 100644 index c2363a0e7..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/// -/// JHybridKotlinTestObjectSpec.cpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#include "JHybridKotlinTestObjectSpec.hpp" - -// Forward declaration of `Car` to properly resolve imports. -namespace margelo::nitro::image { struct Car; } -// Forward declaration of `Powertrain` to properly resolve imports. -namespace margelo::nitro::image { enum class Powertrain; } -// Forward declaration of `Person` to properly resolve imports. -namespace margelo::nitro::image { struct Person; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `AnyMap` to properly resolve imports. -namespace NitroModules { class AnyMap; } - -#include -#include -#include "Car.hpp" -#include "JCar.hpp" -#include -#include "Powertrain.hpp" -#include "JPowertrain.hpp" -#include "Person.hpp" -#include "JPerson.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include "JFunc_void_Person.hpp" - -namespace margelo::nitro::image { - - jni::local_ref JHybridKotlinTestObjectSpec::initHybrid(jni::alias_ref jThis) { - return makeCxxInstance(jThis); - } - - void JHybridKotlinTestObjectSpec::registerNatives() { - registerHybrid({ - makeNativeMethod("initHybrid", JHybridKotlinTestObjectSpec::initHybrid), - }); - } - - size_t JHybridKotlinTestObjectSpec::getExternalMemorySize() noexcept { - static const auto method = _javaPart->getClass()->getMethod("getMemorySize"); - return method(_javaPart); - } - - // Properties - double JHybridKotlinTestObjectSpec::getNumberValue() { - static const auto method = _javaPart->getClass()->getMethod("getNumberValue"); - auto result = method(_javaPart); - return result; - } - void JHybridKotlinTestObjectSpec::setNumberValue(double numberValue) { - static const auto method = _javaPart->getClass()->getMethod("setNumberValue"); - method(_javaPart, numberValue); - } - std::optional JHybridKotlinTestObjectSpec::getOptionalNumber() { - static const auto method = _javaPart->getClass()->getMethod()>("getOptionalNumber"); - auto result = method(_javaPart); - return result != nullptr ? std::make_optional(result->value()) : std::nullopt; - } - void JHybridKotlinTestObjectSpec::setOptionalNumber(std::optional optionalNumber) { - static const auto method = _javaPart->getClass()->getMethod /* optionalNumber */)>("setOptionalNumber"); - method(_javaPart, optionalNumber.has_value() ? jni::JDouble::valueOf(optionalNumber.value()) : nullptr); - } - std::vector JHybridKotlinTestObjectSpec::getPrimitiveArray() { - static const auto method = _javaPart->getClass()->getMethod()>("getPrimitiveArray"); - auto result = method(_javaPart); - return [&]() { - size_t size = result->size(); - std::vector vector; - vector.reserve(size); - result->getRegion(0, size, vector.data()); - return vector; - }(); - } - void JHybridKotlinTestObjectSpec::setPrimitiveArray(const std::vector& primitiveArray) { - static const auto method = _javaPart->getClass()->getMethod /* primitiveArray */)>("setPrimitiveArray"); - method(_javaPart, [&]() { - size_t size = primitiveArray.size(); - jni::local_ref array = jni::JArrayDouble::newArray(size); - array->setRegion(0, size, primitiveArray.data()); - return array; - }()); - } - std::vector JHybridKotlinTestObjectSpec::getCarCollection() { - static const auto method = _javaPart->getClass()->getMethod>()>("getCarCollection"); - auto result = method(_javaPart); - return [&]() { - size_t size = result->size(); - std::vector vector; - vector.reserve(size); - for (size_t i = 0; i < size; i++) { - auto element = result->getElement(i); - vector.push_back(element->toCpp()); - } - return vector; - }(); - } - void JHybridKotlinTestObjectSpec::setCarCollection(const std::vector& carCollection) { - static const auto method = _javaPart->getClass()->getMethod> /* carCollection */)>("setCarCollection"); - method(_javaPart, [&]() { - size_t size = carCollection.size(); - jni::local_ref> array = jni::JArrayClass::newArray(size); - for (size_t i = 0; i < size; i++) { - const auto& element = carCollection[i]; - array->setElement(i, *JCar::fromCpp(element)); - } - return array; - }()); - } - std::shared_ptr JHybridKotlinTestObjectSpec::getSomeBuffer() { - static const auto method = _javaPart->getClass()->getMethod()>("getSomeBuffer"); - auto result = method(_javaPart); - return result->cthis()->getArrayBuffer(); - } - void JHybridKotlinTestObjectSpec::setSomeBuffer(const std::shared_ptr& someBuffer) { - static const auto method = _javaPart->getClass()->getMethod /* someBuffer */)>("setSomeBuffer"); - method(_javaPart, JArrayBuffer::wrap(someBuffer)); - } - std::unordered_map JHybridKotlinTestObjectSpec::getSomeRecord() { - static const auto method = _javaPart->getClass()->getMethod>()>("getSomeRecord"); - auto result = method(_javaPart); - return [&]() { - std::unordered_map map; - map.reserve(result->size()); - for (const auto& entry : *result) { - map.emplace(entry.first->toStdString(), entry.second->toStdString()); - } - return map; - }(); - } - void JHybridKotlinTestObjectSpec::setSomeRecord(const std::unordered_map& someRecord) { - static const auto method = _javaPart->getClass()->getMethod> /* someRecord */)>("setSomeRecord"); - method(_javaPart, [&]() { - auto map = jni::JHashMap::create(someRecord.size()); - for (const auto& entry : someRecord) { - map->put(jni::make_jstring(entry.first), jni::make_jstring(entry.second)); - } - return map; - }()); - } - - // Methods - std::future JHybridKotlinTestObjectSpec::asyncTest() { - static const auto method = _javaPart->getClass()->getMethod()>("asyncTest"); - auto result = method(_javaPart); - return [&]() { - auto promise = std::make_shared>(); - result->cthis()->addOnResolvedListener([=](const jni::alias_ref& boxedResult) { - promise->set_value(); - }); - result->cthis()->addOnRejectedListener([=](const jni::alias_ref& message) { - std::runtime_error error(message->toStdString()); - promise->set_exception(std::make_exception_ptr(error)); - }); - return promise->get_future(); - }(); - } - std::shared_ptr JHybridKotlinTestObjectSpec::createMap() { - static const auto method = _javaPart->getClass()->getMethod()>("createMap"); - auto result = method(_javaPart); - return result->cthis()->getMap(); - } - void JHybridKotlinTestObjectSpec::addOnPersonBornListener(const std::function& callback) { - static const auto method = _javaPart->getClass()->getMethod /* callback */)>("addOnPersonBornListener"); - method(_javaPart, JFunc_void_Person::fromCpp(callback)); - } - void JHybridKotlinTestObjectSpec::something1(std::optional optional) { - static const auto method = _javaPart->getClass()->getMethod /* optional */)>("something1"); - method(_javaPart, optional.has_value() ? JPowertrain::fromCpp(optional.value()) : nullptr); - } - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.hpp deleted file mode 100644 index b12e8888c..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridKotlinTestObjectSpec.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/// -/// HybridKotlinTestObjectSpec.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include -#include "HybridKotlinTestObjectSpec.hpp" - -namespace margelo::nitro::image { - - using namespace facebook; - - class JHybridKotlinTestObjectSpec final: public jni::HybridClass, - public HybridKotlinTestObjectSpec { - public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridKotlinTestObjectSpec;"; - static jni::local_ref initHybrid(jni::alias_ref jThis); - static void registerNatives(); - - private: - // C++ constructor (called from Java via `initHybrid()`) - explicit JHybridKotlinTestObjectSpec(jni::alias_ref jThis) : - HybridObject(HybridKotlinTestObjectSpec::TAG), - _javaPart(jni::make_global(jThis)) {} - - public: - size_t getExternalMemorySize() noexcept override; - - public: - inline const jni::global_ref& getJavaPart() const noexcept { - return _javaPart; - } - - public: - // Properties - double getNumberValue() override; - void setNumberValue(double numberValue) override; - std::optional getOptionalNumber() override; - void setOptionalNumber(std::optional optionalNumber) override; - std::vector getPrimitiveArray() override; - void setPrimitiveArray(const std::vector& primitiveArray) override; - std::vector getCarCollection() override; - void setCarCollection(const std::vector& carCollection) override; - std::shared_ptr getSomeBuffer() override; - void setSomeBuffer(const std::shared_ptr& someBuffer) override; - std::unordered_map getSomeRecord() override; - void setSomeRecord(const std::unordered_map& someRecord) override; - - public: - // Methods - std::future asyncTest() override; - std::shared_ptr createMap() override; - void addOnPersonBornListener(const std::function& callback) override; - void something1(std::optional optional) override; - - private: - friend HybridBase; - using HybridBase::HybridBase; - jni::global_ref _javaPart; - }; - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp new file mode 100644 index 000000000..c7f2a3444 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.cpp @@ -0,0 +1,254 @@ +/// +/// JHybridTestObjectSwiftKotlinSpec.cpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "JHybridTestObjectSwiftKotlinSpec.hpp" + +// Forward declaration of `HybridTestObjectSwiftKotlinSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpec; } +// Forward declaration of `AnyMap` to properly resolve imports. +namespace NitroModules { class AnyMap; } +// Forward declaration of `Car` to properly resolve imports. +namespace margelo::nitro::image { struct Car; } +// Forward declaration of `Powertrain` to properly resolve imports. +namespace margelo::nitro::image { enum class Powertrain; } +// Forward declaration of `Person` to properly resolve imports. +namespace margelo::nitro::image { struct Person; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include +#include +#include +#include "HybridTestObjectSwiftKotlinSpec.hpp" +#include "JHybridTestObjectSwiftKotlinSpec.hpp" +#include +#include +#include +#include +#include +#include "Car.hpp" +#include "JCar.hpp" +#include "Powertrain.hpp" +#include "JPowertrain.hpp" +#include "Person.hpp" +#include "JPerson.hpp" +#include +#include +#include +#include "JFunc_void.hpp" + +namespace margelo::nitro::image { + + jni::local_ref JHybridTestObjectSwiftKotlinSpec::initHybrid(jni::alias_ref jThis) { + return makeCxxInstance(jThis); + } + + void JHybridTestObjectSwiftKotlinSpec::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", JHybridTestObjectSwiftKotlinSpec::initHybrid), + }); + } + + size_t JHybridTestObjectSwiftKotlinSpec::getExternalMemorySize() noexcept { + static const auto method = _javaPart->getClass()->getMethod("getMemorySize"); + return method(_javaPart); + } + + // Properties + double JHybridTestObjectSwiftKotlinSpec::getNumberValue() { + static const auto method = _javaPart->getClass()->getMethod("getNumberValue"); + auto result = method(_javaPart); + return result; + } + void JHybridTestObjectSwiftKotlinSpec::setNumberValue(double numberValue) { + static const auto method = _javaPart->getClass()->getMethod("setNumberValue"); + method(_javaPart, numberValue); + } + bool JHybridTestObjectSwiftKotlinSpec::getBoolValue() { + static const auto method = _javaPart->getClass()->getMethod("getBoolValue"); + auto result = method(_javaPart); + return result; + } + void JHybridTestObjectSwiftKotlinSpec::setBoolValue(bool boolValue) { + static const auto method = _javaPart->getClass()->getMethod("setBoolValue"); + method(_javaPart, boolValue); + } + std::string JHybridTestObjectSwiftKotlinSpec::getStringValue() { + static const auto method = _javaPart->getClass()->getMethod()>("getStringValue"); + auto result = method(_javaPart); + return result->toStdString(); + } + void JHybridTestObjectSwiftKotlinSpec::setStringValue(const std::string& stringValue) { + static const auto method = _javaPart->getClass()->getMethod /* stringValue */)>("setStringValue"); + method(_javaPart, jni::make_jstring(stringValue)); + } + int64_t JHybridTestObjectSwiftKotlinSpec::getBigintValue() { + static const auto method = _javaPart->getClass()->getMethod("getBigintValue"); + auto result = method(_javaPart); + return result; + } + void JHybridTestObjectSwiftKotlinSpec::setBigintValue(int64_t bigintValue) { + static const auto method = _javaPart->getClass()->getMethod("setBigintValue"); + method(_javaPart, bigintValue); + } + std::optional JHybridTestObjectSwiftKotlinSpec::getStringOrUndefined() { + static const auto method = _javaPart->getClass()->getMethod()>("getStringOrUndefined"); + auto result = method(_javaPart); + return result != nullptr ? std::make_optional(result->toStdString()) : std::nullopt; + } + void JHybridTestObjectSwiftKotlinSpec::setStringOrUndefined(const std::optional& stringOrUndefined) { + static const auto method = _javaPart->getClass()->getMethod /* stringOrUndefined */)>("setStringOrUndefined"); + method(_javaPart, stringOrUndefined.has_value() ? jni::make_jstring(stringOrUndefined.value()) : nullptr); + } + std::optional JHybridTestObjectSwiftKotlinSpec::getStringOrNull() { + static const auto method = _javaPart->getClass()->getMethod()>("getStringOrNull"); + auto result = method(_javaPart); + return result != nullptr ? std::make_optional(result->toStdString()) : std::nullopt; + } + void JHybridTestObjectSwiftKotlinSpec::setStringOrNull(const std::optional& stringOrNull) { + static const auto method = _javaPart->getClass()->getMethod /* stringOrNull */)>("setStringOrNull"); + method(_javaPart, stringOrNull.has_value() ? jni::make_jstring(stringOrNull.value()) : nullptr); + } + std::optional JHybridTestObjectSwiftKotlinSpec::getOptionalString() { + static const auto method = _javaPart->getClass()->getMethod()>("getOptionalString"); + auto result = method(_javaPart); + return result != nullptr ? std::make_optional(result->toStdString()) : std::nullopt; + } + void JHybridTestObjectSwiftKotlinSpec::setOptionalString(const std::optional& optionalString) { + static const auto method = _javaPart->getClass()->getMethod /* optionalString */)>("setOptionalString"); + method(_javaPart, optionalString.has_value() ? jni::make_jstring(optionalString.value()) : nullptr); + } + std::shared_ptr JHybridTestObjectSwiftKotlinSpec::getThisObject() { + static const auto method = _javaPart->getClass()->getMethod()>("getThisObject"); + auto result = method(_javaPart); + return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); + } + + // Methods + void JHybridTestObjectSwiftKotlinSpec::simpleFunc() { + static const auto method = _javaPart->getClass()->getMethod("simpleFunc"); + method(_javaPart); + } + double JHybridTestObjectSwiftKotlinSpec::addNumbers(double a, double b) { + static const auto method = _javaPart->getClass()->getMethod("addNumbers"); + auto result = method(_javaPart, a, b); + return result; + } + std::string JHybridTestObjectSwiftKotlinSpec::addStrings(const std::string& a, const std::string& b) { + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* a */, jni::alias_ref /* b */)>("addStrings"); + auto result = method(_javaPart, jni::make_jstring(a), jni::make_jstring(b)); + return result->toStdString(); + } + void JHybridTestObjectSwiftKotlinSpec::multipleArguments(double num, const std::string& str, bool boo) { + static const auto method = _javaPart->getClass()->getMethod /* str */, jboolean /* boo */)>("multipleArguments"); + method(_javaPart, num, jni::make_jstring(str), boo); + } + std::shared_ptr JHybridTestObjectSwiftKotlinSpec::createMap() { + static const auto method = _javaPart->getClass()->getMethod()>("createMap"); + auto result = method(_javaPart); + return result->cthis()->getMap(); + } + std::shared_ptr JHybridTestObjectSwiftKotlinSpec::mapRoundtrip(const std::shared_ptr& map) { + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* map */)>("mapRoundtrip"); + auto result = method(_javaPart, JAnyMap::create(map)); + return result->cthis()->getMap(); + } + double JHybridTestObjectSwiftKotlinSpec::funcThatThrows() { + static const auto method = _javaPart->getClass()->getMethod("funcThatThrows"); + auto result = method(_javaPart); + return result; + } + std::string JHybridTestObjectSwiftKotlinSpec::tryOptionalParams(double num, bool boo, const std::optional& str) { + static const auto method = _javaPart->getClass()->getMethod(double /* num */, jboolean /* boo */, jni::alias_ref /* str */)>("tryOptionalParams"); + auto result = method(_javaPart, num, boo, str.has_value() ? jni::make_jstring(str.value()) : nullptr); + return result->toStdString(); + } + std::string JHybridTestObjectSwiftKotlinSpec::tryMiddleParam(double num, std::optional boo, const std::string& str) { + static const auto method = _javaPart->getClass()->getMethod(double /* num */, jni::alias_ref /* boo */, jni::alias_ref /* str */)>("tryMiddleParam"); + auto result = method(_javaPart, num, boo.has_value() ? jni::JBoolean::valueOf(boo.value()) : nullptr, jni::make_jstring(str)); + return result->toStdString(); + } + int64_t JHybridTestObjectSwiftKotlinSpec::calculateFibonacciSync(double value) { + static const auto method = _javaPart->getClass()->getMethod("calculateFibonacciSync"); + auto result = method(_javaPart, value); + return result; + } + std::future JHybridTestObjectSwiftKotlinSpec::calculateFibonacciAsync(double value) { + static const auto method = _javaPart->getClass()->getMethod(double /* value */)>("calculateFibonacciAsync"); + auto result = method(_javaPart, value); + return [&]() { + auto promise = std::make_shared>(); + result->cthis()->addOnResolvedListener([=](const jni::alias_ref& boxedResult) { + auto result = jni::static_ref_cast(boxedResult); + promise->set_value(result->value()); + }); + result->cthis()->addOnRejectedListener([=](const jni::alias_ref& message) { + std::runtime_error error(message->toStdString()); + promise->set_exception(std::make_exception_ptr(error)); + }); + return promise->get_future(); + }(); + } + std::future JHybridTestObjectSwiftKotlinSpec::wait(double seconds) { + static const auto method = _javaPart->getClass()->getMethod(double /* seconds */)>("wait"); + auto result = method(_javaPart, seconds); + return [&]() { + auto promise = std::make_shared>(); + result->cthis()->addOnResolvedListener([=](const jni::alias_ref& boxedResult) { + promise->set_value(); + }); + result->cthis()->addOnRejectedListener([=](const jni::alias_ref& message) { + std::runtime_error error(message->toStdString()); + promise->set_exception(std::make_exception_ptr(error)); + }); + return promise->get_future(); + }(); + } + void JHybridTestObjectSwiftKotlinSpec::callCallback(const std::function& callback) { + static const auto method = _javaPart->getClass()->getMethod /* callback */)>("callCallback"); + method(_javaPart, JFunc_void::fromCpp(callback)); + } + void JHybridTestObjectSwiftKotlinSpec::callAll(const std::function& first, const std::function& second, const std::function& third) { + static const auto method = _javaPart->getClass()->getMethod /* first */, jni::alias_ref /* second */, jni::alias_ref /* third */)>("callAll"); + method(_javaPart, JFunc_void::fromCpp(first), JFunc_void::fromCpp(second), JFunc_void::fromCpp(third)); + } + Car JHybridTestObjectSwiftKotlinSpec::getCar() { + static const auto method = _javaPart->getClass()->getMethod()>("getCar"); + auto result = method(_javaPart); + return result->toCpp(); + } + bool JHybridTestObjectSwiftKotlinSpec::isCarElectric(const Car& car) { + static const auto method = _javaPart->getClass()->getMethod /* car */)>("isCarElectric"); + auto result = method(_javaPart, JCar::fromCpp(car)); + return result; + } + std::optional JHybridTestObjectSwiftKotlinSpec::getDriver(const Car& car) { + static const auto method = _javaPart->getClass()->getMethod(jni::alias_ref /* car */)>("getDriver"); + auto result = method(_javaPart, JCar::fromCpp(car)); + return result != nullptr ? std::make_optional(result->toCpp()) : std::nullopt; + } + std::shared_ptr JHybridTestObjectSwiftKotlinSpec::createArrayBuffer() { + static const auto method = _javaPart->getClass()->getMethod()>("createArrayBuffer"); + auto result = method(_javaPart); + return result->cthis()->getArrayBuffer(); + } + double JHybridTestObjectSwiftKotlinSpec::getBufferLastItem(const std::shared_ptr& buffer) { + static const auto method = _javaPart->getClass()->getMethod /* buffer */)>("getBufferLastItem"); + auto result = method(_javaPart, JArrayBuffer::wrap(buffer)); + return result; + } + void JHybridTestObjectSwiftKotlinSpec::setAllValuesTo(const std::shared_ptr& buffer, double value) { + static const auto method = _javaPart->getClass()->getMethod /* buffer */, double /* value */)>("setAllValuesTo"); + method(_javaPart, JArrayBuffer::wrap(buffer), value); + } + std::shared_ptr JHybridTestObjectSwiftKotlinSpec::newTestObject() { + static const auto method = _javaPart->getClass()->getMethod()>("newTestObject"); + auto result = method(_javaPart); + return JNISharedPtr::make_shared_from_jni(jni::make_global(result)); + } + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp new file mode 100644 index 000000000..6d1ff47f5 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridTestObjectSwiftKotlinSpec.hpp @@ -0,0 +1,87 @@ +/// +/// HybridTestObjectSwiftKotlinSpec.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include +#include "HybridTestObjectSwiftKotlinSpec.hpp" + +namespace margelo::nitro::image { + + using namespace facebook; + + class JHybridTestObjectSwiftKotlinSpec final: public jni::HybridClass, + public HybridTestObjectSwiftKotlinSpec { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec;"; + static jni::local_ref initHybrid(jni::alias_ref jThis); + static void registerNatives(); + + private: + // C++ constructor (called from Java via `initHybrid()`) + explicit JHybridTestObjectSwiftKotlinSpec(jni::alias_ref jThis) : + HybridObject(HybridTestObjectSwiftKotlinSpec::TAG), + _javaPart(jni::make_global(jThis)) {} + + public: + size_t getExternalMemorySize() noexcept override; + + public: + inline const jni::global_ref& getJavaPart() const noexcept { + return _javaPart; + } + + public: + // Properties + double getNumberValue() override; + void setNumberValue(double numberValue) override; + bool getBoolValue() override; + void setBoolValue(bool boolValue) override; + std::string getStringValue() override; + void setStringValue(const std::string& stringValue) override; + int64_t getBigintValue() override; + void setBigintValue(int64_t bigintValue) override; + std::optional getStringOrUndefined() override; + void setStringOrUndefined(const std::optional& stringOrUndefined) override; + std::optional getStringOrNull() override; + void setStringOrNull(const std::optional& stringOrNull) override; + std::optional getOptionalString() override; + void setOptionalString(const std::optional& optionalString) override; + std::shared_ptr getThisObject() override; + + public: + // Methods + void simpleFunc() override; + double addNumbers(double a, double b) override; + std::string addStrings(const std::string& a, const std::string& b) override; + void multipleArguments(double num, const std::string& str, bool boo) override; + std::shared_ptr createMap() override; + std::shared_ptr mapRoundtrip(const std::shared_ptr& map) override; + double funcThatThrows() override; + std::string tryOptionalParams(double num, bool boo, const std::optional& str) override; + std::string tryMiddleParam(double num, std::optional boo, const std::string& str) override; + int64_t calculateFibonacciSync(double value) override; + std::future calculateFibonacciAsync(double value) override; + std::future wait(double seconds) override; + void callCallback(const std::function& callback) override; + void callAll(const std::function& first, const std::function& second, const std::function& third) override; + Car getCar() override; + bool isCarElectric(const Car& car) override; + std::optional getDriver(const Car& car) override; + std::shared_ptr createArrayBuffer() override; + double getBufferLastItem(const std::shared_ptr& buffer) override; + void setAllValuesTo(const std::shared_ptr& buffer, double value) override; + std::shared_ptr newTestObject() override; + + private: + friend HybridBase; + using HybridBase::HybridBase; + jni::global_ref _javaPart; + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_Person.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void.kt similarity index 84% rename from packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_Person.kt rename to packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void.kt index fb0d27314..288738ffe 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void_Person.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Func_void.kt @@ -1,5 +1,5 @@ /// -/// Func_void_Person.kt +/// Func_void.kt /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -13,13 +13,13 @@ import com.facebook.proguard.annotations.DoNotStrip import dalvik.annotation.optimization.FastNative /** - * Represents the JavaScript callback `(p: struct) => void`. + * Represents the JavaScript callback `() => void`. * This is implemented in C++, via a `std::function<...>`. */ @DoNotStrip @Keep @Suppress("RedundantSuppression", "ConvertSecondaryConstructorToPrimary", "RedundantUnitReturnType", "KotlinJniMissingFunction", "ClassName", "unused") -class Func_void_Person { +class Func_void { @DoNotStrip @Keep private val mHybridData: HybridData @@ -34,12 +34,12 @@ class Func_void_Person { * Converts this function to a Kotlin Lambda. * This exists purely as syntactic sugar, and has minimal runtime overhead. */ - fun toLambda(): (p: Person) -> Unit = this::call + fun toLambda(): () -> Unit = this::call /** * Call the given JS callback. * @throws Throwable if the JS function itself throws an error, or if the JS function/runtime has already been deleted. */ @FastNative - external fun call(p: Person): Unit + external fun call(): Unit } diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridKotlinTestObjectSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridKotlinTestObjectSpec.kt deleted file mode 100644 index 7d4211d28..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridKotlinTestObjectSpec.kt +++ /dev/null @@ -1,112 +0,0 @@ -/// -/// HybridKotlinTestObjectSpec.kt -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -package com.margelo.nitro.image - -import android.util.Log -import androidx.annotation.Keep -import com.facebook.jni.HybridData -import com.facebook.proguard.annotations.DoNotStrip -import com.margelo.nitro.core.* - -/** - * A Kotlin class representing the KotlinTestObject HybridObject. - * Implement this abstract class to create Kotlin-based instances of KotlinTestObject. - */ -@DoNotStrip -@Keep -@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") -abstract class HybridKotlinTestObjectSpec: HybridObject() { - protected val TAG = "HybridKotlinTestObjectSpec" - - @DoNotStrip - val mHybridData: HybridData = initHybrid() - - init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side - super.updateNative(mHybridData) - } - - // Properties - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var numberValue: Double - - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var optionalNumber: Double? - - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var primitiveArray: DoubleArray - - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var carCollection: Array - - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var someBuffer: ArrayBuffer - - @get:DoNotStrip - @get:Keep - @set:DoNotStrip - @set:Keep - abstract var someRecord: Map - - // Methods - @DoNotStrip - @Keep - abstract fun asyncTest(): Promise - - @DoNotStrip - @Keep - abstract fun createMap(): AnyMap - - @DoNotStrip - @Keep - abstract fun addOnPersonBornListener(callback: (p: Person) -> Unit): Unit - - @DoNotStrip - @Keep - private fun addOnPersonBornListener(callback: Func_void_Person): Unit { - val result = addOnPersonBornListener(callback.toLambda()) - return result - } - - @DoNotStrip - @Keep - abstract fun something1(optional: Powertrain?): Unit - - private external fun initHybrid(): HybridData - - companion object { - private const val TAG = "HybridKotlinTestObjectSpec" - init { - try { - Log.i(TAG, "Loading NitroImage C++ library...") - System.loadLibrary("NitroImage") - Log.i(TAG, "Successfully loaded NitroImage C++ library!") - } catch (e: Error) { - Log.e(TAG, "Failed to load NitroImage C++ library! Is it properly installed and linked? " + - "Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e) - throw e - } - } - } -} diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt new file mode 100644 index 000000000..de68a3a28 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt @@ -0,0 +1,197 @@ +/// +/// HybridTestObjectSwiftKotlinSpec.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.image + +import android.util.Log +import androidx.annotation.Keep +import com.facebook.jni.HybridData +import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.core.* + +/** + * A Kotlin class representing the TestObjectSwiftKotlin HybridObject. + * Implement this abstract class to create Kotlin-based instances of TestObjectSwiftKotlin. + */ +@DoNotStrip +@Keep +@Suppress("RedundantSuppression", "KotlinJniMissingFunction", "PropertyName", "RedundantUnitReturnType", "unused") +abstract class HybridTestObjectSwiftKotlinSpec: HybridObject() { + protected val TAG = "HybridTestObjectSwiftKotlinSpec" + + @DoNotStrip + val mHybridData: HybridData = initHybrid() + + init { + // Pass this `HybridData` through to it's base class, + // to represent inheritance to JHybridObject on C++ side + super.updateNative(mHybridData) + } + + // Properties + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var numberValue: Double + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var boolValue: Boolean + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var stringValue: String + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var bigintValue: Long + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var stringOrUndefined: String? + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var stringOrNull: String? + + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var optionalString: String? + + @get:DoNotStrip + @get:Keep + abstract val thisObject: HybridTestObjectSwiftKotlinSpec + + // Methods + @DoNotStrip + @Keep + abstract fun simpleFunc(): Unit + + @DoNotStrip + @Keep + abstract fun addNumbers(a: Double, b: Double): Double + + @DoNotStrip + @Keep + abstract fun addStrings(a: String, b: String): String + + @DoNotStrip + @Keep + abstract fun multipleArguments(num: Double, str: String, boo: Boolean): Unit + + @DoNotStrip + @Keep + abstract fun createMap(): AnyMap + + @DoNotStrip + @Keep + abstract fun mapRoundtrip(map: AnyMap): AnyMap + + @DoNotStrip + @Keep + abstract fun funcThatThrows(): Double + + @DoNotStrip + @Keep + abstract fun tryOptionalParams(num: Double, boo: Boolean, str: String?): String + + @DoNotStrip + @Keep + abstract fun tryMiddleParam(num: Double, boo: Boolean?, str: String): String + + @DoNotStrip + @Keep + abstract fun calculateFibonacciSync(value: Double): Long + + @DoNotStrip + @Keep + abstract fun calculateFibonacciAsync(value: Double): Promise + + @DoNotStrip + @Keep + abstract fun wait(seconds: Double): Promise + + @DoNotStrip + @Keep + abstract fun callCallback(callback: () -> Unit): Unit + + @DoNotStrip + @Keep + private fun callCallback(callback: Func_void): Unit { + val result = callCallback(callback.toLambda()) + return result + } + + @DoNotStrip + @Keep + abstract fun callAll(first: () -> Unit, second: () -> Unit, third: () -> Unit): Unit + + @DoNotStrip + @Keep + private fun callAll(first: Func_void, second: Func_void, third: Func_void): Unit { + val result = callAll(first.toLambda(), second.toLambda(), third.toLambda()) + return result + } + + @DoNotStrip + @Keep + abstract fun getCar(): Car + + @DoNotStrip + @Keep + abstract fun isCarElectric(car: Car): Boolean + + @DoNotStrip + @Keep + abstract fun getDriver(car: Car): Person? + + @DoNotStrip + @Keep + abstract fun createArrayBuffer(): ArrayBuffer + + @DoNotStrip + @Keep + abstract fun getBufferLastItem(buffer: ArrayBuffer): Double + + @DoNotStrip + @Keep + abstract fun setAllValuesTo(buffer: ArrayBuffer, value: Double): Unit + + @DoNotStrip + @Keep + abstract fun newTestObject(): HybridTestObjectSwiftKotlinSpec + + private external fun initHybrid(): HybridData + + companion object { + private const val TAG = "HybridTestObjectSwiftKotlinSpec" + init { + try { + Log.i(TAG, "Loading NitroImage C++ library...") + System.loadLibrary("NitroImage") + Log.i(TAG, "Successfully loaded NitroImage C++ library!") + } catch (e: Error) { + Log.e(TAG, "Failed to load NitroImage C++ library! Is it properly installed and linked? " + + "Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e) + throw e + } + } + } +} diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp index c42f124f3..663d80c85 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp @@ -8,16 +8,12 @@ #pragma once // Forward declarations of C++ defined types -// Forward declaration of `ArrayBufferHolder` to properly resolve imports. -namespace NitroModules { class ArrayBufferHolder; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } // Forward declaration of `Car` to properly resolve imports. namespace margelo::nitro::image { struct Car; } -// Forward declaration of `HybridTestObjectSpecSwift` to properly resolve imports. -namespace margelo::nitro::image { class HybridTestObjectSpecSwift; } -// Forward declaration of `HybridTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridTestObjectSpec; } +// Forward declaration of `HybridTestObjectCppSpecSwift` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectCppSpecSwift; } +// Forward declaration of `HybridTestObjectCppSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectCppSpec; } // Forward declaration of `OldEnum` to properly resolve imports. namespace margelo::nitro::image { enum class OldEnum; } // Forward declaration of `Person` to properly resolve imports. @@ -29,11 +25,11 @@ namespace margelo::nitro::image { enum class Powertrain; } #if __has_include("Car.hpp") #include "Car.hpp" #endif -#if __has_include("HybridTestObjectSpec.hpp") - #include "HybridTestObjectSpec.hpp" +#if __has_include("HybridTestObjectCppSpec.hpp") + #include "HybridTestObjectCppSpec.hpp" #endif -#if __has_include("HybridTestObjectSpecSwift.hpp") - #include "HybridTestObjectSpecSwift.hpp" +#if __has_include("HybridTestObjectCppSpecSwift.hpp") + #include "HybridTestObjectCppSpecSwift.hpp" #endif #if __has_include("OldEnum.hpp") #include "OldEnum.hpp" @@ -44,12 +40,6 @@ namespace margelo::nitro::image { enum class Powertrain; } #if __has_include("Powertrain.hpp") #include "Powertrain.hpp" #endif -#if __has_include() - #include -#endif -#if __has_include() - #include -#endif #if __has_include() #include #endif @@ -71,9 +61,6 @@ namespace margelo::nitro::image { enum class Powertrain; } #if __has_include() #include #endif -#if __has_include() - #include -#endif #if __has_include() #include #endif @@ -254,19 +241,19 @@ namespace margelo::nitro::image::bridge::swift { } /** - * Specialized version of `std::variant, Person>`. + * Specialized version of `std::variant, Person>`. */ - using std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectSpec___Person_ = std::variant, Person>; - inline std::variant, Person> create_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectSpec___Person_(const std::shared_ptr& value) { + using std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectCppSpec___Person_ = std::variant, Person>; + inline std::variant, Person> create_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectCppSpec___Person_(const std::shared_ptr& value) { return value; } - inline std::variant, Person> create_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectSpec___Person_(const Person& value) { + inline std::variant, Person> create_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectCppSpec___Person_(const Person& value) { return value; } - inline std::shared_ptr get_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectSpec___Person__0(const std::variant, Person>& variant) { + inline std::shared_ptr get_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectCppSpec___Person__0(const std::variant, Person>& variant) { return std::get<0>(variant); } - inline Person get_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectSpec___Person__1(const std::variant, Person>& variant) { + inline Person get_std__variant_std__shared_ptr_margelo__nitro__image__HybridTestObjectCppSpec___Person__1(const std::variant, Person>& variant) { return std::get<1>(variant); } @@ -430,139 +417,5 @@ namespace margelo::nitro::image::bridge::swift { inline PromiseHolder create_PromiseHolder_std__string_() { return PromiseHolder(); } - - /** - * Specialized version of `std::unordered_map`. - */ - using std__unordered_map_std__string__double_ = std::unordered_map; - inline std::unordered_map create_std__unordered_map_std__string__double_(size_t size) { - std::unordered_map map; - map.reserve(size); - return map; - } - inline std::vector get_std__unordered_map_std__string__double__keys(const std__unordered_map_std__string__double_& map) { - std::vector keys; - keys.reserve(map.size()); - for (const auto& entry : map) { - keys.push_back(entry.first); - } - return keys; - } - - /** - * Specialized version of `std::optional`. - */ - using std__optional_Car_ = std::optional; - inline std::optional create_std__optional_Car_(const Car& value) { - return std::optional(value); - } - - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_Car_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_Car_() { - return PromiseHolder(); - } - - /** - * Specialized version of `std::function&)>`. - */ - using Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_ = std::function& /* buf */)>; - /** - * Wrapper class for a `std::function& / * buf * /)>`, this can be used from Swift. - */ - class Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer__Wrapper { - public: - explicit Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer__Wrapper(const std::function& /* buf */)>& func): function(func) {} - explicit Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer__Wrapper(std::function& /* buf */)>&& func): function(std::move(func)) {} - - void call(int value, std::string str, ArrayBufferHolder buf) const { - function(static_cast(value), str, buf.getArrayBuffer()); - } - - std::function& /* buf */)> function; - }; - inline Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_ create_Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_(void* closureHolder, void(*call)(void* /* closureHolder */, int, std::string, ArrayBufferHolder), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_([sharedClosureHolder, call](Powertrain value, const std::string& str, const std::shared_ptr& buf) -> void { - call(sharedClosureHolder.get(), static_cast(value), str, ArrayBufferHolder(buf)); - }); - } - inline std::shared_ptr share_Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_(const Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::optional`. - */ - using std__optional_double_ = std::optional; - inline std::optional create_std__optional_double_(const double& value) { - return std::optional(value); - } - - /** - * Specialized version of `std::vector`. - */ - using std__vector_Car_ = std::vector; - inline std::vector create_std__vector_Car_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::unordered_map`. - */ - using std__unordered_map_std__string__std__string_ = std::unordered_map; - inline std::unordered_map create_std__unordered_map_std__string__std__string_(size_t size) { - std::unordered_map map; - map.reserve(size); - return map; - } - inline std::vector get_std__unordered_map_std__string__std__string__keys(const std__unordered_map_std__string__std__string_& map) { - std::vector keys; - keys.reserve(map.size()); - for (const auto& entry : map) { - keys.push_back(entry.first); - } - return keys; - } - - /** - * Specialized version of `std::function`. - */ - using Func_void_Person = std::function; - /** - * Wrapper class for a `std::function`, this can be used from Swift. - */ - class Func_void_Person_Wrapper { - public: - explicit Func_void_Person_Wrapper(const std::function& func): function(func) {} - explicit Func_void_Person_Wrapper(std::function&& func): function(std::move(func)) {} - - void call(Person p) const { - function(p); - } - - std::function function; - }; - inline Func_void_Person create_Func_void_Person(void* closureHolder, void(*call)(void* /* closureHolder */, Person), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_void_Person([sharedClosureHolder, call](const Person& p) -> void { - call(sharedClosureHolder.get(), p); - }); - } - inline std::shared_ptr share_Func_void_Person(const Func_void_Person& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::optional`. - */ - using std__optional_Powertrain_ = std::optional; - inline std::optional create_std__optional_Powertrain_(const Powertrain& value) { - return std::optional(value); - } } // namespace margelo::nitro::image::bridge::swift diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp index c630f71ab..f6739aea4 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Umbrella.hpp @@ -12,16 +12,14 @@ namespace NitroModules { class AnyMap; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `CallbackHolder` to properly resolve imports. -namespace margelo::nitro::image { struct CallbackHolder; } // Forward declaration of `Car` to properly resolve imports. namespace margelo::nitro::image { struct Car; } // Forward declaration of `HybridImageSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridImageSpec; } -// Forward declaration of `HybridSwiftKotlinTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridSwiftKotlinTestObjectSpec; } -// Forward declaration of `HybridTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridTestObjectSpec; } +// Forward declaration of `HybridTestObjectCppSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectCppSpec; } +// Forward declaration of `HybridTestObjectSwiftKotlinSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpec; } // Forward declaration of `ImageFormat` to properly resolve imports. namespace margelo::nitro::image { enum class ImageFormat; } // Forward declaration of `ImageSize` to properly resolve imports. @@ -36,11 +34,10 @@ namespace margelo::nitro::image { enum class PixelFormat; } namespace margelo::nitro::image { enum class Powertrain; } // Include C++ defined types -#include "CallbackHolder.hpp" #include "Car.hpp" #include "HybridImageSpec.hpp" -#include "HybridSwiftKotlinTestObjectSpec.hpp" -#include "HybridTestObjectSpec.hpp" +#include "HybridTestObjectCppSpec.hpp" +#include "HybridTestObjectSwiftKotlinSpec.hpp" #include "ImageFormat.hpp" #include "ImageSize.hpp" #include "OldEnum.hpp" @@ -55,7 +52,6 @@ namespace margelo::nitro::image { enum class Powertrain; } #include #include #include -#include #include #include @@ -71,10 +67,10 @@ namespace margelo::nitro::image { enum class Powertrain; } // Forward declarations of Swift defined types // Forward declaration of `HybridImageSpecCxx` to properly resolve imports. namespace NitroImage { class HybridImageSpecCxx; } -// Forward declaration of `HybridSwiftKotlinTestObjectSpecCxx` to properly resolve imports. -namespace NitroImage { class HybridSwiftKotlinTestObjectSpecCxx; } -// Forward declaration of `HybridTestObjectSpecCxx` to properly resolve imports. -namespace NitroImage { class HybridTestObjectSpecCxx; } +// Forward declaration of `HybridTestObjectCppSpecCxx` to properly resolve imports. +namespace NitroImage { class HybridTestObjectCppSpecCxx; } +// Forward declaration of `HybridTestObjectSwiftKotlinSpecCxx` to properly resolve imports. +namespace NitroImage { class HybridTestObjectSwiftKotlinSpecCxx; } // Include Swift defined types #if __has_include("NitroImage-Swift.h") diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.mm b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.mm index 32b807b8d..1bedac140 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.mm +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.mm @@ -11,8 +11,8 @@ #import #include "HybridImageFactorySpecSwift.hpp" -#include "HybridTestObject.hpp" -#include "HybridSwiftKotlinTestObjectSpecSwift.hpp" +#include "HybridTestObjectCpp.hpp" +#include "HybridTestObjectSwiftKotlinSpecSwift.hpp" @interface NitroImageAutolinking : NSObject @end @@ -31,19 +31,19 @@ + (void) load { } ); HybridObjectRegistry::registerHybridObjectConstructor( - "TestObject", + "TestObjectCpp", []() -> std::shared_ptr { - static_assert(std::is_default_constructible_v, - "The HybridObject \"HybridTestObject\" is not default-constructible! " + static_assert(std::is_default_constructible_v, + "The HybridObject \"HybridTestObjectCpp\" is not default-constructible! " "Create a public constructor that takes zero arguments to be able to autolink this HybridObject."); - return std::make_shared(); + return std::make_shared(); } ); HybridObjectRegistry::registerHybridObjectConstructor( - "SwiftKotlinTestObject", + "TestObjectSwiftKotlin", []() -> std::shared_ptr { - auto swiftPart = NitroImage::NitroImageAutolinking::createSwiftKotlinTestObject(); - return std::make_shared(swiftPart); + auto swiftPart = NitroImage::NitroImageAutolinking::createTestObjectSwiftKotlin(); + return std::make_shared(swiftPart); } ); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.swift index bde233a80..ee2225895 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImageAutolinking.swift @@ -19,14 +19,14 @@ public final class NitroImageAutolinking { } /** - * Creates an instance of a Swift class that implements `HybridSwiftKotlinTestObjectSpec`, - * and wraps it in a Swift class that can directly interop with C++ (`HybridSwiftKotlinTestObjectSpecCxx`) + * Creates an instance of a Swift class that implements `HybridTestObjectSwiftKotlinSpec`, + * and wraps it in a Swift class that can directly interop with C++ (`HybridTestObjectSwiftKotlinSpecCxx`) * * This is generated by Nitrogen and will initialize the class specified - * in the `"autolinking"` property of `nitro.json` (in this case, `HybridSwiftKotlinTestObject`). + * in the `"autolinking"` property of `nitro.json` (in this case, `HybridTestObjectSwift`). */ - public static func createSwiftKotlinTestObject() -> HybridSwiftKotlinTestObjectSpecCxx { - let hybridObject = HybridSwiftKotlinTestObject() + public static func createTestObjectSwiftKotlin() -> HybridTestObjectSwiftKotlinSpecCxx { + let hybridObject = HybridTestObjectSwift() return hybridObject.createCxxBridge() } } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.hpp deleted file mode 100644 index 4ce62e94e..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.hpp +++ /dev/null @@ -1,259 +0,0 @@ -/// -/// HybridSwiftKotlinTestObjectSpecSwift.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#include "HybridSwiftKotlinTestObjectSpec.hpp" - -// Forward declaration of `HybridSwiftKotlinTestObjectSpecCxx` to properly resolve imports. -namespace NitroImage { class HybridSwiftKotlinTestObjectSpecCxx; } - -// Forward declaration of `AnyMap` to properly resolve imports. -namespace NitroModules { class AnyMap; } -// Forward declaration of `Car` to properly resolve imports. -namespace margelo::nitro::image { struct Car; } -// Forward declaration of `Powertrain` to properly resolve imports. -namespace margelo::nitro::image { enum class Powertrain; } -// Forward declaration of `Person` to properly resolve imports. -namespace margelo::nitro::image { struct Person; } -// Forward declaration of `OldEnum` to properly resolve imports. -namespace margelo::nitro::image { enum class OldEnum; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `ArrayBufferHolder` to properly resolve imports. -namespace NitroModules { class ArrayBufferHolder; } -// Forward declaration of `HybridSwiftKotlinTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridSwiftKotlinTestObjectSpec; } -// Forward declaration of `HybridSwiftKotlinTestObjectSpecSwift` to properly resolve imports. -namespace margelo::nitro::image { class HybridSwiftKotlinTestObjectSpecSwift; } -// Forward declaration of `CallbackHolder` to properly resolve imports. -namespace margelo::nitro::image { struct CallbackHolder; } - -#include -#include -#include -#include -#include -#include "Car.hpp" -#include "Powertrain.hpp" -#include "Person.hpp" -#include "OldEnum.hpp" -#include -#include -#include -#include -#include "HybridSwiftKotlinTestObjectSpec.hpp" -#include "HybridSwiftKotlinTestObjectSpecSwift.hpp" -#include "CallbackHolder.hpp" -#include -#include - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -#include "NitroImage-Swift-Cxx-Umbrella.hpp" - -namespace margelo::nitro::image { - - /** - * The C++ part of HybridSwiftKotlinTestObjectSpecCxx.swift. - * - * HybridSwiftKotlinTestObjectSpecSwift (C++) accesses HybridSwiftKotlinTestObjectSpecCxx (Swift), and might - * contain some additional bridging code for C++ <> Swift interop. - * - * Since this obviously introduces an overhead, I hope at some point in - * the future, HybridSwiftKotlinTestObjectSpecCxx can directly inherit from the C++ class HybridSwiftKotlinTestObjectSpec - * to simplify the whole structure and memory management. - */ - class HybridSwiftKotlinTestObjectSpecSwift final: public HybridSwiftKotlinTestObjectSpec { - public: - // Constructor from a Swift instance - explicit HybridSwiftKotlinTestObjectSpecSwift(const NitroImage::HybridSwiftKotlinTestObjectSpecCxx& swiftPart): - HybridObject(HybridSwiftKotlinTestObjectSpec::TAG), - _swiftPart(swiftPart) { } - - public: - // Get the Swift part - inline NitroImage::HybridSwiftKotlinTestObjectSpecCxx getSwiftPart() noexcept { return _swiftPart; } - - public: - // Get memory pressure - inline size_t getExternalMemorySize() noexcept override { - return _swiftPart.getMemorySize(); - } - - public: - // Properties - inline double getNumberValue() noexcept override { - return _swiftPart.getNumberValue(); - } - inline void setNumberValue(double numberValue) noexcept override { - _swiftPart.setNumberValue(std::forward(numberValue)); - } - inline bool getBoolValue() noexcept override { - return _swiftPart.getBoolValue(); - } - inline void setBoolValue(bool boolValue) noexcept override { - _swiftPart.setBoolValue(std::forward(boolValue)); - } - inline std::string getStringValue() noexcept override { - auto result = _swiftPart.getStringValue(); - return result; - } - inline void setStringValue(const std::string& stringValue) noexcept override { - _swiftPart.setStringValue(stringValue); - } - inline int64_t getBigintValue() noexcept override { - return _swiftPart.getBigintValue(); - } - inline void setBigintValue(int64_t bigintValue) noexcept override { - _swiftPart.setBigintValue(std::forward(bigintValue)); - } - inline std::optional getStringOrUndefined() noexcept override { - auto result = _swiftPart.getStringOrUndefined(); - return result; - } - inline void setStringOrUndefined(const std::optional& stringOrUndefined) noexcept override { - _swiftPart.setStringOrUndefined(stringOrUndefined); - } - inline std::optional getStringOrNull() noexcept override { - auto result = _swiftPart.getStringOrNull(); - return result; - } - inline void setStringOrNull(const std::optional& stringOrNull) noexcept override { - _swiftPart.setStringOrNull(stringOrNull); - } - inline std::optional getOptionalString() noexcept override { - auto result = _swiftPart.getOptionalString(); - return result; - } - inline void setOptionalString(const std::optional& optionalString) noexcept override { - _swiftPart.setOptionalString(optionalString); - } - inline std::unordered_map getSomeRecord() noexcept override { - auto result = _swiftPart.getSomeRecord(); - return result; - } - inline void setSomeRecord(const std::unordered_map& someRecord) noexcept override { - _swiftPart.setSomeRecord(someRecord); - } - inline std::vector getSomeArray() noexcept override { - auto result = _swiftPart.getSomeArray(); - return result; - } - inline void setSomeArray(const std::vector& someArray) noexcept override { - _swiftPart.setSomeArray(someArray); - } - inline std::optional getSomeOptional() noexcept override { - auto result = _swiftPart.getSomeOptional(); - return result; - } - inline void setSomeOptional(const std::optional& someOptional) noexcept override { - _swiftPart.setSomeOptional(someOptional); - } - inline std::shared_ptr getSomeMap() noexcept override { - auto result = _swiftPart.getSomeMap(); - return result; - } - inline void setSomeMap(const std::shared_ptr& someMap) noexcept override { - _swiftPart.setSomeMap(someMap); - } - inline std::optional getCar() noexcept override { - auto result = _swiftPart.getCar(); - return result; - } - inline void setCar(const std::optional& car) noexcept override { - _swiftPart.setCar(car); - } - inline Powertrain getPowertrain() noexcept override { - auto result = _swiftPart.getPowertrain(); - return static_cast(result); - } - inline void setPowertrain(Powertrain powertrain) noexcept override { - _swiftPart.setPowertrain(static_cast(powertrain)); - } - inline OldEnum getOldEnum() noexcept override { - auto result = _swiftPart.getOldEnum(); - return static_cast(result); - } - inline void setOldEnum(OldEnum oldEnum) noexcept override { - _swiftPart.setOldEnum(static_cast(oldEnum)); - } - inline std::shared_ptr getBuffer() noexcept override { - auto result = _swiftPart.getBuffer(); - return result.getArrayBuffer(); - } - inline void setBuffer(const std::shared_ptr& buffer) noexcept override { - _swiftPart.setBuffer(ArrayBufferHolder(buffer)); - } - - public: - // Methods - inline void simpleFunc() override { - _swiftPart.simpleFunc(); - } - inline double addNumbers(double a, double b) override { - auto __result = _swiftPart.addNumbers(std::forward(a), std::forward(b)); - return __result; - } - inline std::string addStrings(const std::string& a, const std::string& b) override { - auto __result = _swiftPart.addStrings(a, b); - return __result; - } - inline void multipleArguments(double num, const std::string& str, bool boo) override { - _swiftPart.multipleArguments(std::forward(num), str, std::forward(boo)); - } - inline std::vector getNumbers() override { - auto __result = _swiftPart.getNumbers(); - return __result; - } - inline std::vector getStrings() override { - auto __result = _swiftPart.getStrings(); - return __result; - } - inline void callCallback(const std::function& callback) override { - _swiftPart.callCallback(callback); - } - inline std::shared_ptr createNewBuffer(double size) override { - auto __result = _swiftPart.createNewBuffer(std::forward(size)); - return __result.getArrayBuffer(); - } - inline std::shared_ptr newTestObject() override { - auto __result = _swiftPart.newTestObject(); - return HybridContext::getOrCreate(__result); - } - inline std::shared_ptr bounceBack(const std::shared_ptr& obj) override { - auto __result = _swiftPart.bounceBack(std::static_pointer_cast(obj)->getSwiftPart()); - return HybridContext::getOrCreate(__result); - } - inline void call(const CallbackHolder& args) override { - _swiftPart.call(args); - } - inline std::future getNumberAsync() override { - auto __result = _swiftPart.getNumberAsync(); - return __result.getFuture(); - } - inline std::future getStringAsync() override { - auto __result = _swiftPart.getStringAsync(); - return __result.getFuture(); - } - inline std::future getCarAsync() override { - auto __result = _swiftPart.getCarAsync(); - return __result.getFuture(); - } - inline void doSomeStuff(const std::function& /* buf */)>& withEnum) override { - _swiftPart.doSomeStuff(withEnum); - } - - private: - NitroImage::HybridSwiftKotlinTestObjectSpecCxx _swiftPart; - }; - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.cpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.cpp similarity index 70% rename from packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.cpp rename to packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.cpp index acfbded13..aa62d4285 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridSwiftKotlinTestObjectSpecSwift.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.cpp @@ -1,11 +1,11 @@ /// -/// HybridSwiftKotlinTestObjectSpecSwift.cpp +/// HybridTestObjectSwiftKotlinSpecSwift.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo /// -#include "HybridSwiftKotlinTestObjectSpecSwift.hpp" +#include "HybridTestObjectSwiftKotlinSpecSwift.hpp" namespace margelo::nitro::image { } // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp new file mode 100644 index 000000000..417e2c34d --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridTestObjectSwiftKotlinSpecSwift.hpp @@ -0,0 +1,223 @@ +/// +/// HybridTestObjectSwiftKotlinSpecSwift.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include "HybridTestObjectSwiftKotlinSpec.hpp" + +// Forward declaration of `HybridTestObjectSwiftKotlinSpecCxx` to properly resolve imports. +namespace NitroImage { class HybridTestObjectSwiftKotlinSpecCxx; } + +// Forward declaration of `HybridTestObjectSwiftKotlinSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpec; } +// Forward declaration of `HybridTestObjectSwiftKotlinSpecSwift` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpecSwift; } +// Forward declaration of `AnyMap` to properly resolve imports. +namespace NitroModules { class AnyMap; } +// Forward declaration of `Car` to properly resolve imports. +namespace margelo::nitro::image { struct Car; } +// Forward declaration of `Powertrain` to properly resolve imports. +namespace margelo::nitro::image { enum class Powertrain; } +// Forward declaration of `Person` to properly resolve imports. +namespace margelo::nitro::image { struct Person; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `ArrayBufferHolder` to properly resolve imports. +namespace NitroModules { class ArrayBufferHolder; } + +#include +#include +#include +#include "HybridTestObjectSwiftKotlinSpec.hpp" +#include "HybridTestObjectSwiftKotlinSpecSwift.hpp" +#include +#include +#include +#include +#include "Car.hpp" +#include "Powertrain.hpp" +#include "Person.hpp" +#include +#include + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +#include "NitroImage-Swift-Cxx-Umbrella.hpp" + +namespace margelo::nitro::image { + + /** + * The C++ part of HybridTestObjectSwiftKotlinSpecCxx.swift. + * + * HybridTestObjectSwiftKotlinSpecSwift (C++) accesses HybridTestObjectSwiftKotlinSpecCxx (Swift), and might + * contain some additional bridging code for C++ <> Swift interop. + * + * Since this obviously introduces an overhead, I hope at some point in + * the future, HybridTestObjectSwiftKotlinSpecCxx can directly inherit from the C++ class HybridTestObjectSwiftKotlinSpec + * to simplify the whole structure and memory management. + */ + class HybridTestObjectSwiftKotlinSpecSwift final: public HybridTestObjectSwiftKotlinSpec { + public: + // Constructor from a Swift instance + explicit HybridTestObjectSwiftKotlinSpecSwift(const NitroImage::HybridTestObjectSwiftKotlinSpecCxx& swiftPart): + HybridObject(HybridTestObjectSwiftKotlinSpec::TAG), + _swiftPart(swiftPart) { } + + public: + // Get the Swift part + inline NitroImage::HybridTestObjectSwiftKotlinSpecCxx getSwiftPart() noexcept { return _swiftPart; } + + public: + // Get memory pressure + inline size_t getExternalMemorySize() noexcept override { + return _swiftPart.getMemorySize(); + } + + public: + // Properties + inline double getNumberValue() noexcept override { + return _swiftPart.getNumberValue(); + } + inline void setNumberValue(double numberValue) noexcept override { + _swiftPart.setNumberValue(std::forward(numberValue)); + } + inline bool getBoolValue() noexcept override { + return _swiftPart.getBoolValue(); + } + inline void setBoolValue(bool boolValue) noexcept override { + _swiftPart.setBoolValue(std::forward(boolValue)); + } + inline std::string getStringValue() noexcept override { + auto result = _swiftPart.getStringValue(); + return result; + } + inline void setStringValue(const std::string& stringValue) noexcept override { + _swiftPart.setStringValue(stringValue); + } + inline int64_t getBigintValue() noexcept override { + return _swiftPart.getBigintValue(); + } + inline void setBigintValue(int64_t bigintValue) noexcept override { + _swiftPart.setBigintValue(std::forward(bigintValue)); + } + inline std::optional getStringOrUndefined() noexcept override { + auto result = _swiftPart.getStringOrUndefined(); + return result; + } + inline void setStringOrUndefined(const std::optional& stringOrUndefined) noexcept override { + _swiftPart.setStringOrUndefined(stringOrUndefined); + } + inline std::optional getStringOrNull() noexcept override { + auto result = _swiftPart.getStringOrNull(); + return result; + } + inline void setStringOrNull(const std::optional& stringOrNull) noexcept override { + _swiftPart.setStringOrNull(stringOrNull); + } + inline std::optional getOptionalString() noexcept override { + auto result = _swiftPart.getOptionalString(); + return result; + } + inline void setOptionalString(const std::optional& optionalString) noexcept override { + _swiftPart.setOptionalString(optionalString); + } + inline std::shared_ptr getThisObject() noexcept override { + auto result = _swiftPart.getThisObject(); + return HybridContext::getOrCreate(result); + } + + public: + // Methods + inline void simpleFunc() override { + _swiftPart.simpleFunc(); + } + inline double addNumbers(double a, double b) override { + auto __result = _swiftPart.addNumbers(std::forward(a), std::forward(b)); + return __result; + } + inline std::string addStrings(const std::string& a, const std::string& b) override { + auto __result = _swiftPart.addStrings(a, b); + return __result; + } + inline void multipleArguments(double num, const std::string& str, bool boo) override { + _swiftPart.multipleArguments(std::forward(num), str, std::forward(boo)); + } + inline std::shared_ptr createMap() override { + auto __result = _swiftPart.createMap(); + return __result; + } + inline std::shared_ptr mapRoundtrip(const std::shared_ptr& map) override { + auto __result = _swiftPart.mapRoundtrip(map); + return __result; + } + inline double funcThatThrows() override { + auto __result = _swiftPart.funcThatThrows(); + return __result; + } + inline std::string tryOptionalParams(double num, bool boo, const std::optional& str) override { + auto __result = _swiftPart.tryOptionalParams(std::forward(num), std::forward(boo), str); + return __result; + } + inline std::string tryMiddleParam(double num, std::optional boo, const std::string& str) override { + auto __result = _swiftPart.tryMiddleParam(std::forward(num), boo, str); + return __result; + } + inline int64_t calculateFibonacciSync(double value) override { + auto __result = _swiftPart.calculateFibonacciSync(std::forward(value)); + return __result; + } + inline std::future calculateFibonacciAsync(double value) override { + auto __result = _swiftPart.calculateFibonacciAsync(std::forward(value)); + return __result.getFuture(); + } + inline std::future wait(double seconds) override { + auto __result = _swiftPart.wait(std::forward(seconds)); + return __result.getFuture(); + } + inline void callCallback(const std::function& callback) override { + _swiftPart.callCallback(callback); + } + inline void callAll(const std::function& first, const std::function& second, const std::function& third) override { + _swiftPart.callAll(first, second, third); + } + inline Car getCar() override { + auto __result = _swiftPart.getCar(); + return __result; + } + inline bool isCarElectric(const Car& car) override { + auto __result = _swiftPart.isCarElectric(car); + return __result; + } + inline std::optional getDriver(const Car& car) override { + auto __result = _swiftPart.getDriver(car); + return __result; + } + inline std::shared_ptr createArrayBuffer() override { + auto __result = _swiftPart.createArrayBuffer(); + return __result.getArrayBuffer(); + } + inline double getBufferLastItem(const std::shared_ptr& buffer) override { + auto __result = _swiftPart.getBufferLastItem(ArrayBufferHolder(buffer)); + return __result; + } + inline void setAllValuesTo(const std::shared_ptr& buffer, double value) override { + _swiftPart.setAllValuesTo(ArrayBufferHolder(buffer), std::forward(value)); + } + inline std::shared_ptr newTestObject() override { + auto __result = _swiftPart.newTestObject(); + return HybridContext::getOrCreate(__result); + } + + private: + NitroImage::HybridTestObjectSwiftKotlinSpecCxx _swiftPart; + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/CallbackHolder.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/CallbackHolder.swift deleted file mode 100644 index fec1dc6ff..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/CallbackHolder.swift +++ /dev/null @@ -1,82 +0,0 @@ -/// -/// CallbackHolder.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import NitroModules - -/** - * Represents an instance of `CallbackHolder`, backed by a C++ struct. - */ -public typealias CallbackHolder = margelo.nitro.image.CallbackHolder - -public extension CallbackHolder { - private typealias bridge = margelo.nitro.image.bridge.swift - - /** - * Create a new instance of `CallbackHolder`. - */ - init(callback: @escaping (() -> Void)) { - self.init({ () -> bridge.Func_void in - class ClosureHolder { - let closure: (() -> Void) - init(wrappingClosure closure: @escaping (() -> Void)) { - self.closure = closure - } - func invoke() { - self.closure() - } - } - - let closureHolder = Unmanaged.passRetained(ClosureHolder(wrappingClosure: callback)).toOpaque() - func callClosure(closureHolder: UnsafeMutableRawPointer?) -> Void { - let closure = Unmanaged.fromOpaque(closureHolder!).takeUnretainedValue() - closure.invoke() - } - func destroyClosure(_ closureHolder: UnsafeMutableRawPointer?) -> Void { - Unmanaged.fromOpaque(closureHolder!).release() - } - - return bridge.create_Func_void(closureHolder, callClosure, destroyClosure) - }()) - } - - var callback: (() -> Void) { - @inline(__always) - get { - return { () -> (() -> Void) in - let shared = bridge.share_Func_void(self.__callback) - return { () -> Void in - shared.pointee.call() - } - }() - } - @inline(__always) - set { - self.__callback = { () -> bridge.Func_void in - class ClosureHolder { - let closure: (() -> Void) - init(wrappingClosure closure: @escaping (() -> Void)) { - self.closure = closure - } - func invoke() { - self.closure() - } - } - - let closureHolder = Unmanaged.passRetained(ClosureHolder(wrappingClosure: newValue)).toOpaque() - func callClosure(closureHolder: UnsafeMutableRawPointer?) -> Void { - let closure = Unmanaged.fromOpaque(closureHolder!).takeUnretainedValue() - closure.invoke() - } - func destroyClosure(_ closureHolder: UnsafeMutableRawPointer?) -> Void { - Unmanaged.fromOpaque(closureHolder!).release() - } - - return bridge.create_Func_void(closureHolder, callClosure, destroyClosure) - }() - } - } -} diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpec.swift deleted file mode 100644 index 5fdbb5d96..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpec.swift +++ /dev/null @@ -1,76 +0,0 @@ -/// -/// HybridSwiftKotlinTestObjectSpec.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -import Foundation -import NitroModules - -/** - * A Swift protocol representing the SwiftKotlinTestObject HybridObject. - * Implement this protocol to create Swift-based instances of SwiftKotlinTestObject. - * - * When implementing this protocol, make sure to initialize `hybridContext` - example: - * ``` - * public class HybridSwiftKotlinTestObject : HybridSwiftKotlinTestObjectSpec { - * // Initialize HybridContext - * var hybridContext = margelo.nitro.HybridContext() - * - * // Return size of the instance to inform JS GC about memory pressure - * var memorySize: Int { - * return getSizeOf(self) - * } - * - * // ... - * } - * ``` - */ -public protocol HybridSwiftKotlinTestObjectSpec: HybridObjectSpec { - // Properties - var numberValue: Double { get set } - var boolValue: Bool { get set } - var stringValue: String { get set } - var bigintValue: Int64 { get set } - var stringOrUndefined: String? { get set } - var stringOrNull: String? { get set } - var optionalString: String? { get set } - var someRecord: Dictionary { get set } - var someArray: [String] { get set } - var someOptional: String? { get set } - var someMap: AnyMapHolder { get set } - var car: Car? { get set } - var powertrain: Powertrain { get set } - var oldEnum: OldEnum { get set } - var buffer: ArrayBufferHolder { get set } - - // Methods - func simpleFunc() throws -> Void - func addNumbers(a: Double, b: Double) throws -> Double - func addStrings(a: String, b: String) throws -> String - func multipleArguments(num: Double, str: String, boo: Bool) throws -> Void - func getNumbers() throws -> [Double] - func getStrings() throws -> [String] - func callCallback(callback: @escaping (() -> Void)) throws -> Void - func createNewBuffer(size: Double) throws -> ArrayBufferHolder - func newTestObject() throws -> HybridSwiftKotlinTestObjectSpec - func bounceBack(obj: HybridSwiftKotlinTestObjectSpec) throws -> HybridSwiftKotlinTestObjectSpec - func call(args: CallbackHolder) throws -> Void - func getNumberAsync() throws -> Promise - func getStringAsync() throws -> Promise - func getCarAsync() throws -> Promise - func doSomeStuff(withEnum: @escaping ((_ value: Powertrain, _ str: String, _ buf: ArrayBufferHolder) -> Void)) throws -> Void -} - -public extension HybridSwiftKotlinTestObjectSpec { - /** - * Create a new instance of HybridSwiftKotlinTestObjectSpecCxx for the given HybridSwiftKotlinTestObjectSpec. - * - * Instances of HybridSwiftKotlinTestObjectSpecCxx can be accessed from C++, and contain - * additional required bridging code for C++ <> Swift interop. - */ - func createCxxBridge() -> HybridSwiftKotlinTestObjectSpecCxx { - return HybridSwiftKotlinTestObjectSpecCxx(self) - } -} diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift new file mode 100644 index 000000000..ce200b782 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift @@ -0,0 +1,75 @@ +/// +/// HybridTestObjectSwiftKotlinSpec.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * A Swift protocol representing the TestObjectSwiftKotlin HybridObject. + * Implement this protocol to create Swift-based instances of TestObjectSwiftKotlin. + * + * When implementing this protocol, make sure to initialize `hybridContext` - example: + * ``` + * public class HybridTestObjectSwiftKotlin : HybridTestObjectSwiftKotlinSpec { + * // Initialize HybridContext + * var hybridContext = margelo.nitro.HybridContext() + * + * // Return size of the instance to inform JS GC about memory pressure + * var memorySize: Int { + * return getSizeOf(self) + * } + * + * // ... + * } + * ``` + */ +public protocol HybridTestObjectSwiftKotlinSpec: HybridObjectSpec { + // Properties + var numberValue: Double { get set } + var boolValue: Bool { get set } + var stringValue: String { get set } + var bigintValue: Int64 { get set } + var stringOrUndefined: String? { get set } + var stringOrNull: String? { get set } + var optionalString: String? { get set } + var thisObject: HybridTestObjectSwiftKotlinSpec { get } + + // Methods + func simpleFunc() throws -> Void + func addNumbers(a: Double, b: Double) throws -> Double + func addStrings(a: String, b: String) throws -> String + func multipleArguments(num: Double, str: String, boo: Bool) throws -> Void + func createMap() throws -> AnyMapHolder + func mapRoundtrip(map: AnyMapHolder) throws -> AnyMapHolder + func funcThatThrows() throws -> Double + func tryOptionalParams(num: Double, boo: Bool, str: String?) throws -> String + func tryMiddleParam(num: Double, boo: Bool?, str: String) throws -> String + func calculateFibonacciSync(value: Double) throws -> Int64 + func calculateFibonacciAsync(value: Double) throws -> Promise + func wait(seconds: Double) throws -> Promise + func callCallback(callback: @escaping (() -> Void)) throws -> Void + func callAll(first: @escaping (() -> Void), second: @escaping (() -> Void), third: @escaping (() -> Void)) throws -> Void + func getCar() throws -> Car + func isCarElectric(car: Car) throws -> Bool + func getDriver(car: Car) throws -> Person? + func createArrayBuffer() throws -> ArrayBufferHolder + func getBufferLastItem(buffer: ArrayBufferHolder) throws -> Double + func setAllValuesTo(buffer: ArrayBufferHolder, value: Double) throws -> Void + func newTestObject() throws -> HybridTestObjectSwiftKotlinSpec +} + +public extension HybridTestObjectSwiftKotlinSpec { + /** + * Create a new instance of HybridTestObjectSwiftKotlinSpecCxx for the given HybridTestObjectSwiftKotlinSpec. + * + * Instances of HybridTestObjectSwiftKotlinSpecCxx can be accessed from C++, and contain + * additional required bridging code for C++ <> Swift interop. + */ + func createCxxBridge() -> HybridTestObjectSwiftKotlinSpecCxx { + return HybridTestObjectSwiftKotlinSpecCxx(self) + } +} diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpecCxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpecCxx.swift similarity index 61% rename from packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpecCxx.swift rename to packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpecCxx.swift index e06020045..eeec6238f 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridSwiftKotlinTestObjectSpecCxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpecCxx.swift @@ -1,5 +1,5 @@ /// -/// HybridSwiftKotlinTestObjectSpecCxx.swift +/// HybridTestObjectSwiftKotlinSpecCxx.swift /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -9,7 +9,7 @@ import Foundation import NitroModules /** - * A class implementation that bridges HybridSwiftKotlinTestObjectSpec over to C++. + * A class implementation that bridges HybridTestObjectSwiftKotlinSpec over to C++. * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined. * * Also, some Swift types need to be bridged with special handling: @@ -17,7 +17,7 @@ import NitroModules * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++ */ -public final class HybridSwiftKotlinTestObjectSpecCxx { +public final class HybridTestObjectSwiftKotlinSpecCxx { /** * The Swift <> C++ bridge's namespace (`margelo::nitro::image::bridge::swift`) * from `NitroImage-Swift-Cxx-Bridge.hpp`. @@ -26,15 +26,15 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { public typealias bridge = margelo.nitro.image.bridge.swift /** - * Holds an instance of the `HybridSwiftKotlinTestObjectSpec` Swift protocol. + * Holds an instance of the `HybridTestObjectSwiftKotlinSpec` Swift protocol. */ - private(set) var implementation: HybridSwiftKotlinTestObjectSpec + private(set) var implementation: HybridTestObjectSwiftKotlinSpec /** - * Create a new `HybridSwiftKotlinTestObjectSpecCxx` that wraps the given `HybridSwiftKotlinTestObjectSpec`. + * Create a new `HybridTestObjectSwiftKotlinSpecCxx` that wraps the given `HybridTestObjectSwiftKotlinSpec`. * All properties and methods bridge to C++ types. */ - public init(_ implementation: HybridSwiftKotlinTestObjectSpec) { + public init(_ implementation: HybridTestObjectSwiftKotlinSpec) { self.implementation = implementation } @@ -172,144 +172,85 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } } - public var someRecord: bridge.std__unordered_map_std__string__double_ { + public var thisObject: HybridTestObjectSwiftKotlinSpecCxx { @inline(__always) get { - return { () -> bridge.std__unordered_map_std__string__double_ in - var map = bridge.create_std__unordered_map_std__string__double_(self.implementation.someRecord.count) - for (k, v) in self.implementation.someRecord { - map[std.string(k)] = v - } - return map - }() - } - @inline(__always) - set { - self.implementation.someRecord = { () -> Dictionary in - var dictionary = Dictionary(minimumCapacity: newValue.size()) - let keys = bridge.get_std__unordered_map_std__string__double__keys(newValue) - for key in keys { - let value = newValue[key]! - dictionary[String(key)] = value - } - return dictionary - }() + return self.implementation.thisObject.createCxxBridge() } } - - public var someArray: bridge.std__vector_std__string_ { - @inline(__always) - get { - return { () -> bridge.std__vector_std__string_ in - var vector = bridge.create_std__vector_std__string_(self.implementation.someArray.count) - for item in self.implementation.someArray { - vector.push_back(std.string(item)) - } - return vector - }() - } - @inline(__always) - set { - self.implementation.someArray = newValue.map({ val in String(val) }) + + // Methods + @inline(__always) + public func simpleFunc() -> Void { + do { + try self.implementation.simpleFunc() + return + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var someOptional: bridge.std__optional_std__string_ { - @inline(__always) - get { - return { () -> bridge.std__optional_std__string_ in - if let actualValue = self.implementation.someOptional { - return bridge.create_std__optional_std__string_(std.string(actualValue)) - } else { - return .init() - } - }() - } - @inline(__always) - set { - self.implementation.someOptional = { () -> String? in - if let actualValue = newValue.value { - return String(actualValue) - } else { - return nil - } - }() + @inline(__always) + public func addNumbers(a: Double, b: Double) -> Double { + do { + let result = try self.implementation.addNumbers(a: a, b: b) + return result + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var someMap: margelo.nitro.TSharedMap { - @inline(__always) - get { - return self.implementation.someMap.cppPart - } - @inline(__always) - set { - self.implementation.someMap = AnyMapHolder(withCppPart: newValue) + @inline(__always) + public func addStrings(a: std.string, b: std.string) -> std.string { + do { + let result = try self.implementation.addStrings(a: String(a), b: String(b)) + return std.string(result) + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var car: bridge.std__optional_Car_ { - @inline(__always) - get { - return { () -> bridge.std__optional_Car_ in - if let actualValue = self.implementation.car { - return bridge.create_std__optional_Car_(actualValue) - } else { - return .init() - } - }() - } - @inline(__always) - set { - self.implementation.car = { () -> Car? in - if let actualValue = newValue.value { - return actualValue - } else { - return nil - } - }() + @inline(__always) + public func multipleArguments(num: Double, str: std.string, boo: Bool) -> Void { + do { + try self.implementation.multipleArguments(num: num, str: String(str), boo: boo) + return + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var powertrain: Int32 { - @inline(__always) - get { - return self.implementation.powertrain.rawValue - } - @inline(__always) - set { - self.implementation.powertrain = margelo.nitro.image.Powertrain(rawValue: newValue)! + @inline(__always) + public func createMap() -> margelo.nitro.TSharedMap { + do { + let result = try self.implementation.createMap() + return result.cppPart + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var oldEnum: Int32 { - @inline(__always) - get { - return self.implementation.oldEnum.rawValue - } - @inline(__always) - set { - self.implementation.oldEnum = margelo.nitro.image.OldEnum(rawValue: newValue)! + @inline(__always) + public func mapRoundtrip(map: margelo.nitro.TSharedMap) -> margelo.nitro.TSharedMap { + do { + let result = try self.implementation.mapRoundtrip(map: AnyMapHolder(withCppPart: map)) + return result.cppPart + } catch { + let message = "\(error.localizedDescription)" + fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") } } - public var buffer: ArrayBufferHolder { - @inline(__always) - get { - return self.implementation.buffer - } - @inline(__always) - set { - self.implementation.buffer = newValue - } - } - - // Methods @inline(__always) - public func simpleFunc() -> Void { + public func funcThatThrows() -> Double { do { - try self.implementation.simpleFunc() - return + let result = try self.implementation.funcThatThrows() + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -317,10 +258,16 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func addNumbers(a: Double, b: Double) -> Double { + public func tryOptionalParams(num: Double, boo: Bool, str: bridge.std__optional_std__string_) -> std.string { do { - let result = try self.implementation.addNumbers(a: a, b: b) - return result + let result = try self.implementation.tryOptionalParams(num: num, boo: boo, str: { () -> String? in + if let actualValue = str.value { + return String(actualValue) + } else { + return nil + } + }()) + return std.string(result) } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -328,9 +275,15 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func addStrings(a: std.string, b: std.string) -> std.string { + public func tryMiddleParam(num: Double, boo: bridge.std__optional_bool_, str: std.string) -> std.string { do { - let result = try self.implementation.addStrings(a: String(a), b: String(b)) + let result = try self.implementation.tryMiddleParam(num: num, boo: { () -> Bool? in + if let actualValue = boo.value { + return actualValue + } else { + return nil + } + }(), str: String(str)) return std.string(result) } catch { let message = "\(error.localizedDescription)" @@ -339,10 +292,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func multipleArguments(num: Double, str: std.string, boo: Bool) -> Void { + public func calculateFibonacciSync(value: Double) -> Int64 { do { - try self.implementation.multipleArguments(num: num, str: String(str), boo: boo) - return + let result = try self.implementation.calculateFibonacciSync(value: value) + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -350,15 +303,15 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func getNumbers() -> bridge.std__vector_double_ { + public func calculateFibonacciAsync(value: Double) -> bridge.PromiseHolder_int64_t_ { do { - let result = try self.implementation.getNumbers() - return { () -> bridge.std__vector_double_ in - var vector = bridge.create_std__vector_double_(result.count) - for item in result { - vector.push_back(item) - } - return vector + let result = try self.implementation.calculateFibonacciAsync(value: value) + return { () -> bridge.PromiseHolder_int64_t_ in + let promiseHolder = bridge.create_PromiseHolder_int64_t_() + result + .then({ __result in promiseHolder.resolve(__result) }) + .catch({ __error in promiseHolder.reject(std.string(String(describing: __error))) }) + return promiseHolder }() } catch { let message = "\(error.localizedDescription)" @@ -367,15 +320,15 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func getStrings() -> bridge.std__vector_std__string_ { + public func wait(seconds: Double) -> bridge.PromiseHolder_void_ { do { - let result = try self.implementation.getStrings() - return { () -> bridge.std__vector_std__string_ in - var vector = bridge.create_std__vector_std__string_(result.count) - for item in result { - vector.push_back(std.string(item)) - } - return vector + let result = try self.implementation.wait(seconds: seconds) + return { () -> bridge.PromiseHolder_void_ in + let promiseHolder = bridge.create_PromiseHolder_void_() + result + .then({ __result in promiseHolder.resolve() }) + .catch({ __error in promiseHolder.reject(std.string(String(describing: __error))) }) + return promiseHolder }() } catch { let message = "\(error.localizedDescription)" @@ -400,10 +353,25 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func createNewBuffer(size: Double) -> ArrayBufferHolder { + public func callAll(first: bridge.Func_void, second: bridge.Func_void, third: bridge.Func_void) -> Void { do { - let result = try self.implementation.createNewBuffer(size: size) - return result + try self.implementation.callAll(first: { () -> (() -> Void) in + let shared = bridge.share_Func_void(first) + return { () -> Void in + shared.pointee.call() + } + }(), second: { () -> (() -> Void) in + let shared = bridge.share_Func_void(second) + return { () -> Void in + shared.pointee.call() + } + }(), third: { () -> (() -> Void) in + let shared = bridge.share_Func_void(third) + return { () -> Void in + shared.pointee.call() + } + }()) + return } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -411,10 +379,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func newTestObject() -> HybridSwiftKotlinTestObjectSpecCxx { + public func getCar() -> Car { do { - let result = try self.implementation.newTestObject() - return result.createCxxBridge() + let result = try self.implementation.getCar() + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -422,10 +390,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func bounceBack(obj: HybridSwiftKotlinTestObjectSpecCxx) -> HybridSwiftKotlinTestObjectSpecCxx { + public func isCarElectric(car: Car) -> Bool { do { - let result = try self.implementation.bounceBack(obj: obj.implementation) - return result.createCxxBridge() + let result = try self.implementation.isCarElectric(car: car) + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -433,10 +401,16 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func call(args: CallbackHolder) -> Void { + public func getDriver(car: Car) -> bridge.std__optional_Person_ { do { - try self.implementation.call(args: args) - return + let result = try self.implementation.getDriver(car: car) + return { () -> bridge.std__optional_Person_ in + if let actualValue = result { + return bridge.create_std__optional_Person_(actualValue) + } else { + return .init() + } + }() } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -444,16 +418,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func getNumberAsync() -> bridge.PromiseHolder_double_ { + public func createArrayBuffer() -> ArrayBufferHolder { do { - let result = try self.implementation.getNumberAsync() - return { () -> bridge.PromiseHolder_double_ in - let promiseHolder = bridge.create_PromiseHolder_double_() - result - .then({ __result in promiseHolder.resolve(__result) }) - .catch({ __error in promiseHolder.reject(std.string(String(describing: __error))) }) - return promiseHolder - }() + let result = try self.implementation.createArrayBuffer() + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -461,16 +429,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func getStringAsync() -> bridge.PromiseHolder_std__string_ { + public func getBufferLastItem(buffer: ArrayBufferHolder) -> Double { do { - let result = try self.implementation.getStringAsync() - return { () -> bridge.PromiseHolder_std__string_ in - let promiseHolder = bridge.create_PromiseHolder_std__string_() - result - .then({ __result in promiseHolder.resolve(std.string(__result)) }) - .catch({ __error in promiseHolder.reject(std.string(String(describing: __error))) }) - return promiseHolder - }() + let result = try self.implementation.getBufferLastItem(buffer: buffer) + return result } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -478,16 +440,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func getCarAsync() -> bridge.PromiseHolder_Car_ { + public func setAllValuesTo(buffer: ArrayBufferHolder, value: Double) -> Void { do { - let result = try self.implementation.getCarAsync() - return { () -> bridge.PromiseHolder_Car_ in - let promiseHolder = bridge.create_PromiseHolder_Car_() - result - .then({ __result in promiseHolder.resolve(__result) }) - .catch({ __error in promiseHolder.reject(std.string(String(describing: __error))) }) - return promiseHolder - }() + try self.implementation.setAllValuesTo(buffer: buffer, value: value) + return } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") @@ -495,15 +451,10 @@ public final class HybridSwiftKotlinTestObjectSpecCxx { } @inline(__always) - public func doSomeStuff(withEnum: bridge.Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_) -> Void { + public func newTestObject() -> HybridTestObjectSwiftKotlinSpecCxx { do { - try self.implementation.doSomeStuff(withEnum: { () -> ((Powertrain, String, ArrayBufferHolder) -> Void) in - let shared = bridge.share_Func_void_Powertrain_std__string_std__shared_ptr_ArrayBuffer_(withEnum) - return { (value: Powertrain, str: String, buf: ArrayBufferHolder) -> Void in - shared.pointee.call(value.rawValue, std.string(str), buf) - } - }()) - return + let result = try self.implementation.newTestObject() + return result.createCxxBridge() } catch { let message = "\(error.localizedDescription)" fatalError("Swift errors can currently not be propagated to C++! See https://github.com/swiftlang/swift/issues/75290 (Error: \(message))") diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/OldEnum.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/OldEnum.swift deleted file mode 100644 index e86f70fef..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/OldEnum.swift +++ /dev/null @@ -1,44 +0,0 @@ -/// -/// OldEnum.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -/** - * Represents the JS enum `OldEnum`, backed by a C++ enum. - */ -public typealias OldEnum = margelo.nitro.image.OldEnum - -public extension OldEnum { - /** - * Get a OldEnum for the given String value, or - * return `nil` if the given value was invalid/unknown. - */ - init?(fromString string: String) { - switch string { - case "FIRST": - self = .first - case "SECOND": - self = .second - case "THIRD": - self = .third - default: - return nil - } - } - - /** - * Get the String value this OldEnum represents. - */ - var stringValue: String { - switch self { - case .first: - return "FIRST" - case .second: - return "SECOND" - case .third: - return "THIRD" - } - } -} diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/CallbackHolder.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/CallbackHolder.hpp deleted file mode 100644 index f03c069e0..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/CallbackHolder.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/// -/// CallbackHolder.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - -#include - -namespace margelo::nitro::image { - - /** - * A struct which can be represented as a JavaScript object (CallbackHolder). - */ - struct CallbackHolder { - public: - std::function callback SWIFT_PRIVATE; - - public: - explicit CallbackHolder(std::function callback): callback(callback) {} - }; - -} // namespace margelo::nitro::image - -namespace margelo::nitro { - - using namespace margelo::nitro::image; - - // C++ CallbackHolder <> JS CallbackHolder (object) - template <> - struct JSIConverter { - static inline CallbackHolder fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return CallbackHolder( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "callback")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const CallbackHolder& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "callback", JSIConverter>::toJSI(runtime, arg.callback)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "callback"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.cpp deleted file mode 100644 index 6061111f4..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/// -/// HybridKotlinTestObjectSpec.cpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#include "HybridKotlinTestObjectSpec.hpp" - -namespace margelo::nitro::image { - - void HybridKotlinTestObjectSpec::loadHybridMethods() { - // load base methods/properties - HybridObject::loadHybridMethods(); - // load custom methods/properties - registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridGetter("numberValue", &HybridKotlinTestObjectSpec::getNumberValue); - prototype.registerHybridSetter("numberValue", &HybridKotlinTestObjectSpec::setNumberValue); - prototype.registerHybridGetter("optionalNumber", &HybridKotlinTestObjectSpec::getOptionalNumber); - prototype.registerHybridSetter("optionalNumber", &HybridKotlinTestObjectSpec::setOptionalNumber); - prototype.registerHybridGetter("primitiveArray", &HybridKotlinTestObjectSpec::getPrimitiveArray); - prototype.registerHybridSetter("primitiveArray", &HybridKotlinTestObjectSpec::setPrimitiveArray); - prototype.registerHybridGetter("carCollection", &HybridKotlinTestObjectSpec::getCarCollection); - prototype.registerHybridSetter("carCollection", &HybridKotlinTestObjectSpec::setCarCollection); - prototype.registerHybridGetter("someBuffer", &HybridKotlinTestObjectSpec::getSomeBuffer); - prototype.registerHybridSetter("someBuffer", &HybridKotlinTestObjectSpec::setSomeBuffer); - prototype.registerHybridGetter("someRecord", &HybridKotlinTestObjectSpec::getSomeRecord); - prototype.registerHybridSetter("someRecord", &HybridKotlinTestObjectSpec::setSomeRecord); - prototype.registerHybridMethod("asyncTest", &HybridKotlinTestObjectSpec::asyncTest); - prototype.registerHybridMethod("createMap", &HybridKotlinTestObjectSpec::createMap); - prototype.registerHybridMethod("addOnPersonBornListener", &HybridKotlinTestObjectSpec::addOnPersonBornListener); - prototype.registerHybridMethod("something1", &HybridKotlinTestObjectSpec::something1); - }); - } - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.hpp deleted file mode 100644 index 3ce2d5879..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridKotlinTestObjectSpec.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/// -/// HybridKotlinTestObjectSpec.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `Car` to properly resolve imports. -namespace margelo::nitro::image { struct Car; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `AnyMap` to properly resolve imports. -namespace NitroModules { class AnyMap; } -// Forward declaration of `Person` to properly resolve imports. -namespace margelo::nitro::image { struct Person; } -// Forward declaration of `Powertrain` to properly resolve imports. -namespace margelo::nitro::image { enum class Powertrain; } - -#include -#include -#include "Car.hpp" -#include -#include -#include -#include -#include -#include -#include "Person.hpp" -#include "Powertrain.hpp" - -namespace margelo::nitro::image { - - using namespace margelo::nitro; - - /** - * An abstract base class for `KotlinTestObject` - * Inherit this class to create instances of `HybridKotlinTestObjectSpec` in C++. - * @example - * ```cpp - * class HybridKotlinTestObject: public HybridKotlinTestObjectSpec { - * // ... - * }; - * ``` - */ - class HybridKotlinTestObjectSpec: public virtual HybridObject { - public: - // Constructor - explicit HybridKotlinTestObjectSpec(): HybridObject(TAG) { } - - // Destructor - virtual ~HybridKotlinTestObjectSpec() { } - - public: - // Properties - virtual double getNumberValue() = 0; - virtual void setNumberValue(double numberValue) = 0; - virtual std::optional getOptionalNumber() = 0; - virtual void setOptionalNumber(std::optional optionalNumber) = 0; - virtual std::vector getPrimitiveArray() = 0; - virtual void setPrimitiveArray(const std::vector& primitiveArray) = 0; - virtual std::vector getCarCollection() = 0; - virtual void setCarCollection(const std::vector& carCollection) = 0; - virtual std::shared_ptr getSomeBuffer() = 0; - virtual void setSomeBuffer(const std::shared_ptr& someBuffer) = 0; - virtual std::unordered_map getSomeRecord() = 0; - virtual void setSomeRecord(const std::unordered_map& someRecord) = 0; - - public: - // Methods - virtual std::future asyncTest() = 0; - virtual std::shared_ptr createMap() = 0; - virtual void addOnPersonBornListener(const std::function& callback) = 0; - virtual void something1(std::optional optional) = 0; - - protected: - // Hybrid Setup - void loadHybridMethods() override; - - protected: - // Tag for logging - static constexpr auto TAG = "KotlinTestObject"; - }; - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.cpp deleted file mode 100644 index b6f714397..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/// -/// HybridSwiftKotlinTestObjectSpec.cpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#include "HybridSwiftKotlinTestObjectSpec.hpp" - -namespace margelo::nitro::image { - - void HybridSwiftKotlinTestObjectSpec::loadHybridMethods() { - // load base methods/properties - HybridObject::loadHybridMethods(); - // load custom methods/properties - registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridGetter("numberValue", &HybridSwiftKotlinTestObjectSpec::getNumberValue); - prototype.registerHybridSetter("numberValue", &HybridSwiftKotlinTestObjectSpec::setNumberValue); - prototype.registerHybridGetter("boolValue", &HybridSwiftKotlinTestObjectSpec::getBoolValue); - prototype.registerHybridSetter("boolValue", &HybridSwiftKotlinTestObjectSpec::setBoolValue); - prototype.registerHybridGetter("stringValue", &HybridSwiftKotlinTestObjectSpec::getStringValue); - prototype.registerHybridSetter("stringValue", &HybridSwiftKotlinTestObjectSpec::setStringValue); - prototype.registerHybridGetter("bigintValue", &HybridSwiftKotlinTestObjectSpec::getBigintValue); - prototype.registerHybridSetter("bigintValue", &HybridSwiftKotlinTestObjectSpec::setBigintValue); - prototype.registerHybridGetter("stringOrUndefined", &HybridSwiftKotlinTestObjectSpec::getStringOrUndefined); - prototype.registerHybridSetter("stringOrUndefined", &HybridSwiftKotlinTestObjectSpec::setStringOrUndefined); - prototype.registerHybridGetter("stringOrNull", &HybridSwiftKotlinTestObjectSpec::getStringOrNull); - prototype.registerHybridSetter("stringOrNull", &HybridSwiftKotlinTestObjectSpec::setStringOrNull); - prototype.registerHybridGetter("optionalString", &HybridSwiftKotlinTestObjectSpec::getOptionalString); - prototype.registerHybridSetter("optionalString", &HybridSwiftKotlinTestObjectSpec::setOptionalString); - prototype.registerHybridGetter("someRecord", &HybridSwiftKotlinTestObjectSpec::getSomeRecord); - prototype.registerHybridSetter("someRecord", &HybridSwiftKotlinTestObjectSpec::setSomeRecord); - prototype.registerHybridGetter("someArray", &HybridSwiftKotlinTestObjectSpec::getSomeArray); - prototype.registerHybridSetter("someArray", &HybridSwiftKotlinTestObjectSpec::setSomeArray); - prototype.registerHybridGetter("someOptional", &HybridSwiftKotlinTestObjectSpec::getSomeOptional); - prototype.registerHybridSetter("someOptional", &HybridSwiftKotlinTestObjectSpec::setSomeOptional); - prototype.registerHybridGetter("someMap", &HybridSwiftKotlinTestObjectSpec::getSomeMap); - prototype.registerHybridSetter("someMap", &HybridSwiftKotlinTestObjectSpec::setSomeMap); - prototype.registerHybridGetter("car", &HybridSwiftKotlinTestObjectSpec::getCar); - prototype.registerHybridSetter("car", &HybridSwiftKotlinTestObjectSpec::setCar); - prototype.registerHybridGetter("powertrain", &HybridSwiftKotlinTestObjectSpec::getPowertrain); - prototype.registerHybridSetter("powertrain", &HybridSwiftKotlinTestObjectSpec::setPowertrain); - prototype.registerHybridGetter("oldEnum", &HybridSwiftKotlinTestObjectSpec::getOldEnum); - prototype.registerHybridSetter("oldEnum", &HybridSwiftKotlinTestObjectSpec::setOldEnum); - prototype.registerHybridGetter("buffer", &HybridSwiftKotlinTestObjectSpec::getBuffer); - prototype.registerHybridSetter("buffer", &HybridSwiftKotlinTestObjectSpec::setBuffer); - prototype.registerHybridMethod("simpleFunc", &HybridSwiftKotlinTestObjectSpec::simpleFunc); - prototype.registerHybridMethod("addNumbers", &HybridSwiftKotlinTestObjectSpec::addNumbers); - prototype.registerHybridMethod("addStrings", &HybridSwiftKotlinTestObjectSpec::addStrings); - prototype.registerHybridMethod("multipleArguments", &HybridSwiftKotlinTestObjectSpec::multipleArguments); - prototype.registerHybridMethod("getNumbers", &HybridSwiftKotlinTestObjectSpec::getNumbers); - prototype.registerHybridMethod("getStrings", &HybridSwiftKotlinTestObjectSpec::getStrings); - prototype.registerHybridMethod("callCallback", &HybridSwiftKotlinTestObjectSpec::callCallback); - prototype.registerHybridMethod("createNewBuffer", &HybridSwiftKotlinTestObjectSpec::createNewBuffer); - prototype.registerHybridMethod("newTestObject", &HybridSwiftKotlinTestObjectSpec::newTestObject); - prototype.registerHybridMethod("bounceBack", &HybridSwiftKotlinTestObjectSpec::bounceBack); - prototype.registerHybridMethod("call", &HybridSwiftKotlinTestObjectSpec::call); - prototype.registerHybridMethod("getNumberAsync", &HybridSwiftKotlinTestObjectSpec::getNumberAsync); - prototype.registerHybridMethod("getStringAsync", &HybridSwiftKotlinTestObjectSpec::getStringAsync); - prototype.registerHybridMethod("getCarAsync", &HybridSwiftKotlinTestObjectSpec::getCarAsync); - prototype.registerHybridMethod("doSomeStuff", &HybridSwiftKotlinTestObjectSpec::doSomeStuff); - }); - } - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.hpp deleted file mode 100644 index c0dc1c72e..000000000 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridSwiftKotlinTestObjectSpec.hpp +++ /dev/null @@ -1,128 +0,0 @@ -/// -/// HybridSwiftKotlinTestObjectSpec.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `AnyMap` to properly resolve imports. -namespace NitroModules { class AnyMap; } -// Forward declaration of `Car` to properly resolve imports. -namespace margelo::nitro::image { struct Car; } -// Forward declaration of `Powertrain` to properly resolve imports. -namespace margelo::nitro::image { enum class Powertrain; } -// Forward declaration of `OldEnum` to properly resolve imports. -namespace margelo::nitro::image { enum class OldEnum; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `HybridSwiftKotlinTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridSwiftKotlinTestObjectSpec; } -// Forward declaration of `CallbackHolder` to properly resolve imports. -namespace margelo::nitro::image { struct CallbackHolder; } - -#include -#include -#include -#include -#include -#include "Car.hpp" -#include "Powertrain.hpp" -#include "OldEnum.hpp" -#include -#include -#include -#include "HybridSwiftKotlinTestObjectSpec.hpp" -#include "CallbackHolder.hpp" -#include - -namespace margelo::nitro::image { - - using namespace margelo::nitro; - - /** - * An abstract base class for `SwiftKotlinTestObject` - * Inherit this class to create instances of `HybridSwiftKotlinTestObjectSpec` in C++. - * @example - * ```cpp - * class HybridSwiftKotlinTestObject: public HybridSwiftKotlinTestObjectSpec { - * // ... - * }; - * ``` - */ - class HybridSwiftKotlinTestObjectSpec: public virtual HybridObject { - public: - // Constructor - explicit HybridSwiftKotlinTestObjectSpec(): HybridObject(TAG) { } - - // Destructor - virtual ~HybridSwiftKotlinTestObjectSpec() { } - - public: - // Properties - virtual double getNumberValue() = 0; - virtual void setNumberValue(double numberValue) = 0; - virtual bool getBoolValue() = 0; - virtual void setBoolValue(bool boolValue) = 0; - virtual std::string getStringValue() = 0; - virtual void setStringValue(const std::string& stringValue) = 0; - virtual int64_t getBigintValue() = 0; - virtual void setBigintValue(int64_t bigintValue) = 0; - virtual std::optional getStringOrUndefined() = 0; - virtual void setStringOrUndefined(const std::optional& stringOrUndefined) = 0; - virtual std::optional getStringOrNull() = 0; - virtual void setStringOrNull(const std::optional& stringOrNull) = 0; - virtual std::optional getOptionalString() = 0; - virtual void setOptionalString(const std::optional& optionalString) = 0; - virtual std::unordered_map getSomeRecord() = 0; - virtual void setSomeRecord(const std::unordered_map& someRecord) = 0; - virtual std::vector getSomeArray() = 0; - virtual void setSomeArray(const std::vector& someArray) = 0; - virtual std::optional getSomeOptional() = 0; - virtual void setSomeOptional(const std::optional& someOptional) = 0; - virtual std::shared_ptr getSomeMap() = 0; - virtual void setSomeMap(const std::shared_ptr& someMap) = 0; - virtual std::optional getCar() = 0; - virtual void setCar(const std::optional& car) = 0; - virtual Powertrain getPowertrain() = 0; - virtual void setPowertrain(Powertrain powertrain) = 0; - virtual OldEnum getOldEnum() = 0; - virtual void setOldEnum(OldEnum oldEnum) = 0; - virtual std::shared_ptr getBuffer() = 0; - virtual void setBuffer(const std::shared_ptr& buffer) = 0; - - public: - // Methods - virtual void simpleFunc() = 0; - virtual double addNumbers(double a, double b) = 0; - virtual std::string addStrings(const std::string& a, const std::string& b) = 0; - virtual void multipleArguments(double num, const std::string& str, bool boo) = 0; - virtual std::vector getNumbers() = 0; - virtual std::vector getStrings() = 0; - virtual void callCallback(const std::function& callback) = 0; - virtual std::shared_ptr createNewBuffer(double size) = 0; - virtual std::shared_ptr newTestObject() = 0; - virtual std::shared_ptr bounceBack(const std::shared_ptr& obj) = 0; - virtual void call(const CallbackHolder& args) = 0; - virtual std::future getNumberAsync() = 0; - virtual std::future getStringAsync() = 0; - virtual std::future getCarAsync() = 0; - virtual void doSomeStuff(const std::function& /* buf */)>& withEnum) = 0; - - protected: - // Hybrid Setup - void loadHybridMethods() override; - - protected: - // Tag for logging - static constexpr auto TAG = "SwiftKotlinTestObject"; - }; - -} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp similarity index 65% rename from packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.cpp rename to packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp index 5972bf62b..a5207256b 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.cpp @@ -1,71 +1,69 @@ /// -/// HybridTestObjectSpec.cpp +/// HybridTestObjectCppSpec.cpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo /// -#include "HybridTestObjectSpec.hpp" +#include "HybridTestObjectCppSpec.hpp" namespace margelo::nitro::image { - void HybridTestObjectSpec::loadHybridMethods() { + void HybridTestObjectCppSpec::loadHybridMethods() { // load base methods/properties HybridObject::loadHybridMethods(); // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridGetter("numberValue", &HybridTestObjectSpec::getNumberValue); - prototype.registerHybridSetter("numberValue", &HybridTestObjectSpec::setNumberValue); - prototype.registerHybridGetter("boolValue", &HybridTestObjectSpec::getBoolValue); - prototype.registerHybridSetter("boolValue", &HybridTestObjectSpec::setBoolValue); - prototype.registerHybridGetter("stringValue", &HybridTestObjectSpec::getStringValue); - prototype.registerHybridSetter("stringValue", &HybridTestObjectSpec::setStringValue); - prototype.registerHybridGetter("bigintValue", &HybridTestObjectSpec::getBigintValue); - prototype.registerHybridSetter("bigintValue", &HybridTestObjectSpec::setBigintValue); - prototype.registerHybridGetter("stringOrUndefined", &HybridTestObjectSpec::getStringOrUndefined); - prototype.registerHybridSetter("stringOrUndefined", &HybridTestObjectSpec::setStringOrUndefined); - prototype.registerHybridGetter("stringOrNull", &HybridTestObjectSpec::getStringOrNull); - prototype.registerHybridSetter("stringOrNull", &HybridTestObjectSpec::setStringOrNull); - prototype.registerHybridGetter("optionalString", &HybridTestObjectSpec::getOptionalString); - prototype.registerHybridSetter("optionalString", &HybridTestObjectSpec::setOptionalString); - prototype.registerHybridGetter("valueThatWillThrowOnAccess", &HybridTestObjectSpec::getValueThatWillThrowOnAccess); - prototype.registerHybridSetter("valueThatWillThrowOnAccess", &HybridTestObjectSpec::setValueThatWillThrowOnAccess); - prototype.registerHybridGetter("someVariant", &HybridTestObjectSpec::getSomeVariant); - prototype.registerHybridSetter("someVariant", &HybridTestObjectSpec::setSomeVariant); - prototype.registerHybridGetter("someTuple", &HybridTestObjectSpec::getSomeTuple); - prototype.registerHybridSetter("someTuple", &HybridTestObjectSpec::setSomeTuple); - prototype.registerHybridGetter("self", &HybridTestObjectSpec::getSelf); - prototype.registerHybridMethod("simpleFunc", &HybridTestObjectSpec::simpleFunc); - prototype.registerHybridMethod("addNumbers", &HybridTestObjectSpec::addNumbers); - prototype.registerHybridMethod("addStrings", &HybridTestObjectSpec::addStrings); - prototype.registerHybridMethod("multipleArguments", &HybridTestObjectSpec::multipleArguments); - prototype.registerHybridMethod("createMap", &HybridTestObjectSpec::createMap); - prototype.registerHybridMethod("mapRoundtrip", &HybridTestObjectSpec::mapRoundtrip); - prototype.registerHybridMethod("funcThatThrows", &HybridTestObjectSpec::funcThatThrows); - prototype.registerHybridMethod("tryOptionalParams", &HybridTestObjectSpec::tryOptionalParams); - prototype.registerHybridMethod("tryMiddleParam", &HybridTestObjectSpec::tryMiddleParam); - prototype.registerHybridMethod("passVariant", &HybridTestObjectSpec::passVariant); - prototype.registerHybridMethod("getVariantEnum", &HybridTestObjectSpec::getVariantEnum); - prototype.registerHybridMethod("getVariantObjects", &HybridTestObjectSpec::getVariantObjects); - prototype.registerHybridMethod("getVariantHybrid", &HybridTestObjectSpec::getVariantHybrid); - prototype.registerHybridMethod("getVariantTuple", &HybridTestObjectSpec::getVariantTuple); - prototype.registerHybridMethod("flip", &HybridTestObjectSpec::flip); - prototype.registerHybridMethod("passTuple", &HybridTestObjectSpec::passTuple); - prototype.registerHybridMethod("calculateFibonacciSync", &HybridTestObjectSpec::calculateFibonacciSync); - prototype.registerHybridMethod("calculateFibonacciAsync", &HybridTestObjectSpec::calculateFibonacciAsync); - prototype.registerHybridMethod("wait", &HybridTestObjectSpec::wait); - prototype.registerHybridMethod("callCallback", &HybridTestObjectSpec::callCallback); - prototype.registerHybridMethod("getValueFromJSCallback", &HybridTestObjectSpec::getValueFromJSCallback); - prototype.registerHybridMethod("getValueFromJSCallbackAndWait", &HybridTestObjectSpec::getValueFromJSCallbackAndWait); - prototype.registerHybridMethod("callAll", &HybridTestObjectSpec::callAll); - prototype.registerHybridMethod("getValueFromJsCallback", &HybridTestObjectSpec::getValueFromJsCallback); - prototype.registerHybridMethod("getCar", &HybridTestObjectSpec::getCar); - prototype.registerHybridMethod("isCarElectric", &HybridTestObjectSpec::isCarElectric); - prototype.registerHybridMethod("getDriver", &HybridTestObjectSpec::getDriver); - prototype.registerHybridMethod("createArrayBuffer", &HybridTestObjectSpec::createArrayBuffer); - prototype.registerHybridMethod("getBufferLastItem", &HybridTestObjectSpec::getBufferLastItem); - prototype.registerHybridMethod("setAllValuesTo", &HybridTestObjectSpec::setAllValuesTo); - prototype.registerHybridMethod("newTestObject", &HybridTestObjectSpec::newTestObject); + prototype.registerHybridGetter("numberValue", &HybridTestObjectCppSpec::getNumberValue); + prototype.registerHybridSetter("numberValue", &HybridTestObjectCppSpec::setNumberValue); + prototype.registerHybridGetter("boolValue", &HybridTestObjectCppSpec::getBoolValue); + prototype.registerHybridSetter("boolValue", &HybridTestObjectCppSpec::setBoolValue); + prototype.registerHybridGetter("stringValue", &HybridTestObjectCppSpec::getStringValue); + prototype.registerHybridSetter("stringValue", &HybridTestObjectCppSpec::setStringValue); + prototype.registerHybridGetter("bigintValue", &HybridTestObjectCppSpec::getBigintValue); + prototype.registerHybridSetter("bigintValue", &HybridTestObjectCppSpec::setBigintValue); + prototype.registerHybridGetter("stringOrUndefined", &HybridTestObjectCppSpec::getStringOrUndefined); + prototype.registerHybridSetter("stringOrUndefined", &HybridTestObjectCppSpec::setStringOrUndefined); + prototype.registerHybridGetter("stringOrNull", &HybridTestObjectCppSpec::getStringOrNull); + prototype.registerHybridSetter("stringOrNull", &HybridTestObjectCppSpec::setStringOrNull); + prototype.registerHybridGetter("optionalString", &HybridTestObjectCppSpec::getOptionalString); + prototype.registerHybridSetter("optionalString", &HybridTestObjectCppSpec::setOptionalString); + prototype.registerHybridGetter("someVariant", &HybridTestObjectCppSpec::getSomeVariant); + prototype.registerHybridSetter("someVariant", &HybridTestObjectCppSpec::setSomeVariant); + prototype.registerHybridGetter("someTuple", &HybridTestObjectCppSpec::getSomeTuple); + prototype.registerHybridSetter("someTuple", &HybridTestObjectCppSpec::setSomeTuple); + prototype.registerHybridGetter("thisObject", &HybridTestObjectCppSpec::getThisObject); + prototype.registerHybridMethod("simpleFunc", &HybridTestObjectCppSpec::simpleFunc); + prototype.registerHybridMethod("addNumbers", &HybridTestObjectCppSpec::addNumbers); + prototype.registerHybridMethod("addStrings", &HybridTestObjectCppSpec::addStrings); + prototype.registerHybridMethod("multipleArguments", &HybridTestObjectCppSpec::multipleArguments); + prototype.registerHybridMethod("createMap", &HybridTestObjectCppSpec::createMap); + prototype.registerHybridMethod("mapRoundtrip", &HybridTestObjectCppSpec::mapRoundtrip); + prototype.registerHybridMethod("funcThatThrows", &HybridTestObjectCppSpec::funcThatThrows); + prototype.registerHybridMethod("tryOptionalParams", &HybridTestObjectCppSpec::tryOptionalParams); + prototype.registerHybridMethod("tryMiddleParam", &HybridTestObjectCppSpec::tryMiddleParam); + prototype.registerHybridMethod("passVariant", &HybridTestObjectCppSpec::passVariant); + prototype.registerHybridMethod("getVariantEnum", &HybridTestObjectCppSpec::getVariantEnum); + prototype.registerHybridMethod("getVariantObjects", &HybridTestObjectCppSpec::getVariantObjects); + prototype.registerHybridMethod("getVariantHybrid", &HybridTestObjectCppSpec::getVariantHybrid); + prototype.registerHybridMethod("getVariantTuple", &HybridTestObjectCppSpec::getVariantTuple); + prototype.registerHybridMethod("flip", &HybridTestObjectCppSpec::flip); + prototype.registerHybridMethod("passTuple", &HybridTestObjectCppSpec::passTuple); + prototype.registerHybridMethod("calculateFibonacciSync", &HybridTestObjectCppSpec::calculateFibonacciSync); + prototype.registerHybridMethod("calculateFibonacciAsync", &HybridTestObjectCppSpec::calculateFibonacciAsync); + prototype.registerHybridMethod("wait", &HybridTestObjectCppSpec::wait); + prototype.registerHybridMethod("callCallback", &HybridTestObjectCppSpec::callCallback); + prototype.registerHybridMethod("getValueFromJSCallback", &HybridTestObjectCppSpec::getValueFromJSCallback); + prototype.registerHybridMethod("getValueFromJSCallbackAndWait", &HybridTestObjectCppSpec::getValueFromJSCallbackAndWait); + prototype.registerHybridMethod("callAll", &HybridTestObjectCppSpec::callAll); + prototype.registerHybridMethod("getValueFromJsCallback", &HybridTestObjectCppSpec::getValueFromJsCallback); + prototype.registerHybridMethod("getCar", &HybridTestObjectCppSpec::getCar); + prototype.registerHybridMethod("isCarElectric", &HybridTestObjectCppSpec::isCarElectric); + prototype.registerHybridMethod("getDriver", &HybridTestObjectCppSpec::getDriver); + prototype.registerHybridMethod("createArrayBuffer", &HybridTestObjectCppSpec::createArrayBuffer); + prototype.registerHybridMethod("getBufferLastItem", &HybridTestObjectCppSpec::getBufferLastItem); + prototype.registerHybridMethod("setAllValuesTo", &HybridTestObjectCppSpec::setAllValuesTo); + prototype.registerHybridMethod("newTestObject", &HybridTestObjectCppSpec::newTestObject); }); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp similarity index 86% rename from packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.hpp rename to packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp index 63e50eaeb..9064c9b07 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectCppSpec.hpp @@ -1,5 +1,5 @@ /// -/// HybridTestObjectSpec.hpp +/// HybridTestObjectCppSpec.hpp /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -13,8 +13,8 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `HybridTestObjectSpec` to properly resolve imports. -namespace margelo::nitro::image { class HybridTestObjectSpec; } +// Forward declaration of `HybridTestObjectCppSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectCppSpec; } // Forward declaration of `AnyMap` to properly resolve imports. namespace NitroModules { class AnyMap; } // Forward declaration of `OldEnum` to properly resolve imports. @@ -31,7 +31,7 @@ namespace NitroModules { class ArrayBuffer; } #include #include #include -#include "HybridTestObjectSpec.hpp" +#include "HybridTestObjectCppSpec.hpp" #include #include #include "OldEnum.hpp" @@ -46,22 +46,22 @@ namespace margelo::nitro::image { using namespace margelo::nitro; /** - * An abstract base class for `TestObject` - * Inherit this class to create instances of `HybridTestObjectSpec` in C++. + * An abstract base class for `TestObjectCpp` + * Inherit this class to create instances of `HybridTestObjectCppSpec` in C++. * @example * ```cpp - * class HybridTestObject: public HybridTestObjectSpec { + * class HybridTestObjectCpp: public HybridTestObjectCppSpec { * // ... * }; * ``` */ - class HybridTestObjectSpec: public virtual HybridObject { + class HybridTestObjectCppSpec: public virtual HybridObject { public: // Constructor - explicit HybridTestObjectSpec(): HybridObject(TAG) { } + explicit HybridTestObjectCppSpec(): HybridObject(TAG) { } // Destructor - virtual ~HybridTestObjectSpec() { } + virtual ~HybridTestObjectCppSpec() { } public: // Properties @@ -79,13 +79,11 @@ namespace margelo::nitro::image { virtual void setStringOrNull(const std::optional& stringOrNull) = 0; virtual std::optional getOptionalString() = 0; virtual void setOptionalString(const std::optional& optionalString) = 0; - virtual double getValueThatWillThrowOnAccess() = 0; - virtual void setValueThatWillThrowOnAccess(double valueThatWillThrowOnAccess) = 0; virtual std::variant getSomeVariant() = 0; virtual void setSomeVariant(const std::variant& someVariant) = 0; virtual std::tuple getSomeTuple() = 0; virtual void setSomeTuple(const std::tuple& someTuple) = 0; - virtual std::shared_ptr getSelf() = 0; + virtual std::shared_ptr getThisObject() = 0; public: // Methods @@ -101,7 +99,7 @@ namespace margelo::nitro::image { virtual std::variant passVariant(const std::variant, std::vector>& either) = 0; virtual std::variant getVariantEnum(const std::variant& variant) = 0; virtual std::variant getVariantObjects(const std::variant& variant) = 0; - virtual std::variant, Person> getVariantHybrid(const std::variant, Person>& variant) = 0; + virtual std::variant, Person> getVariantHybrid(const std::variant, Person>& variant) = 0; virtual std::variant, std::tuple> getVariantTuple(const std::variant, std::tuple>& variant) = 0; virtual std::tuple flip(const std::tuple& tuple) = 0; virtual std::tuple passTuple(const std::tuple& tuple) = 0; @@ -119,7 +117,7 @@ namespace margelo::nitro::image { virtual std::shared_ptr createArrayBuffer() = 0; virtual double getBufferLastItem(const std::shared_ptr& buffer) = 0; virtual void setAllValuesTo(const std::shared_ptr& buffer, double value) = 0; - virtual std::shared_ptr newTestObject() = 0; + virtual std::shared_ptr newTestObject() = 0; protected: // Hybrid Setup @@ -127,7 +125,7 @@ namespace margelo::nitro::image { protected: // Tag for logging - static constexpr auto TAG = "TestObject"; + static constexpr auto TAG = "TestObjectCpp"; }; } // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp new file mode 100644 index 000000000..2e13653b4 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.cpp @@ -0,0 +1,56 @@ +/// +/// HybridTestObjectSwiftKotlinSpec.cpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "HybridTestObjectSwiftKotlinSpec.hpp" + +namespace margelo::nitro::image { + + void HybridTestObjectSwiftKotlinSpec::loadHybridMethods() { + // load base methods/properties + HybridObject::loadHybridMethods(); + // load custom methods/properties + registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("numberValue", &HybridTestObjectSwiftKotlinSpec::getNumberValue); + prototype.registerHybridSetter("numberValue", &HybridTestObjectSwiftKotlinSpec::setNumberValue); + prototype.registerHybridGetter("boolValue", &HybridTestObjectSwiftKotlinSpec::getBoolValue); + prototype.registerHybridSetter("boolValue", &HybridTestObjectSwiftKotlinSpec::setBoolValue); + prototype.registerHybridGetter("stringValue", &HybridTestObjectSwiftKotlinSpec::getStringValue); + prototype.registerHybridSetter("stringValue", &HybridTestObjectSwiftKotlinSpec::setStringValue); + prototype.registerHybridGetter("bigintValue", &HybridTestObjectSwiftKotlinSpec::getBigintValue); + prototype.registerHybridSetter("bigintValue", &HybridTestObjectSwiftKotlinSpec::setBigintValue); + prototype.registerHybridGetter("stringOrUndefined", &HybridTestObjectSwiftKotlinSpec::getStringOrUndefined); + prototype.registerHybridSetter("stringOrUndefined", &HybridTestObjectSwiftKotlinSpec::setStringOrUndefined); + prototype.registerHybridGetter("stringOrNull", &HybridTestObjectSwiftKotlinSpec::getStringOrNull); + prototype.registerHybridSetter("stringOrNull", &HybridTestObjectSwiftKotlinSpec::setStringOrNull); + prototype.registerHybridGetter("optionalString", &HybridTestObjectSwiftKotlinSpec::getOptionalString); + prototype.registerHybridSetter("optionalString", &HybridTestObjectSwiftKotlinSpec::setOptionalString); + prototype.registerHybridGetter("thisObject", &HybridTestObjectSwiftKotlinSpec::getThisObject); + prototype.registerHybridMethod("simpleFunc", &HybridTestObjectSwiftKotlinSpec::simpleFunc); + prototype.registerHybridMethod("addNumbers", &HybridTestObjectSwiftKotlinSpec::addNumbers); + prototype.registerHybridMethod("addStrings", &HybridTestObjectSwiftKotlinSpec::addStrings); + prototype.registerHybridMethod("multipleArguments", &HybridTestObjectSwiftKotlinSpec::multipleArguments); + prototype.registerHybridMethod("createMap", &HybridTestObjectSwiftKotlinSpec::createMap); + prototype.registerHybridMethod("mapRoundtrip", &HybridTestObjectSwiftKotlinSpec::mapRoundtrip); + prototype.registerHybridMethod("funcThatThrows", &HybridTestObjectSwiftKotlinSpec::funcThatThrows); + prototype.registerHybridMethod("tryOptionalParams", &HybridTestObjectSwiftKotlinSpec::tryOptionalParams); + prototype.registerHybridMethod("tryMiddleParam", &HybridTestObjectSwiftKotlinSpec::tryMiddleParam); + prototype.registerHybridMethod("calculateFibonacciSync", &HybridTestObjectSwiftKotlinSpec::calculateFibonacciSync); + prototype.registerHybridMethod("calculateFibonacciAsync", &HybridTestObjectSwiftKotlinSpec::calculateFibonacciAsync); + prototype.registerHybridMethod("wait", &HybridTestObjectSwiftKotlinSpec::wait); + prototype.registerHybridMethod("callCallback", &HybridTestObjectSwiftKotlinSpec::callCallback); + prototype.registerHybridMethod("callAll", &HybridTestObjectSwiftKotlinSpec::callAll); + prototype.registerHybridMethod("getCar", &HybridTestObjectSwiftKotlinSpec::getCar); + prototype.registerHybridMethod("isCarElectric", &HybridTestObjectSwiftKotlinSpec::isCarElectric); + prototype.registerHybridMethod("getDriver", &HybridTestObjectSwiftKotlinSpec::getDriver); + prototype.registerHybridMethod("createArrayBuffer", &HybridTestObjectSwiftKotlinSpec::createArrayBuffer); + prototype.registerHybridMethod("getBufferLastItem", &HybridTestObjectSwiftKotlinSpec::getBufferLastItem); + prototype.registerHybridMethod("setAllValuesTo", &HybridTestObjectSwiftKotlinSpec::setAllValuesTo); + prototype.registerHybridMethod("newTestObject", &HybridTestObjectSwiftKotlinSpec::newTestObject); + }); + } + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp new file mode 100644 index 000000000..b85ade6b0 --- /dev/null +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridTestObjectSwiftKotlinSpec.hpp @@ -0,0 +1,111 @@ +/// +/// HybridTestObjectSwiftKotlinSpec.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `HybridTestObjectSwiftKotlinSpec` to properly resolve imports. +namespace margelo::nitro::image { class HybridTestObjectSwiftKotlinSpec; } +// Forward declaration of `AnyMap` to properly resolve imports. +namespace NitroModules { class AnyMap; } +// Forward declaration of `Car` to properly resolve imports. +namespace margelo::nitro::image { struct Car; } +// Forward declaration of `Person` to properly resolve imports. +namespace margelo::nitro::image { struct Person; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include +#include +#include +#include "HybridTestObjectSwiftKotlinSpec.hpp" +#include +#include +#include +#include "Car.hpp" +#include "Person.hpp" +#include + +namespace margelo::nitro::image { + + using namespace margelo::nitro; + + /** + * An abstract base class for `TestObjectSwiftKotlin` + * Inherit this class to create instances of `HybridTestObjectSwiftKotlinSpec` in C++. + * @example + * ```cpp + * class HybridTestObjectSwiftKotlin: public HybridTestObjectSwiftKotlinSpec { + * // ... + * }; + * ``` + */ + class HybridTestObjectSwiftKotlinSpec: public virtual HybridObject { + public: + // Constructor + explicit HybridTestObjectSwiftKotlinSpec(): HybridObject(TAG) { } + + // Destructor + virtual ~HybridTestObjectSwiftKotlinSpec() { } + + public: + // Properties + virtual double getNumberValue() = 0; + virtual void setNumberValue(double numberValue) = 0; + virtual bool getBoolValue() = 0; + virtual void setBoolValue(bool boolValue) = 0; + virtual std::string getStringValue() = 0; + virtual void setStringValue(const std::string& stringValue) = 0; + virtual int64_t getBigintValue() = 0; + virtual void setBigintValue(int64_t bigintValue) = 0; + virtual std::optional getStringOrUndefined() = 0; + virtual void setStringOrUndefined(const std::optional& stringOrUndefined) = 0; + virtual std::optional getStringOrNull() = 0; + virtual void setStringOrNull(const std::optional& stringOrNull) = 0; + virtual std::optional getOptionalString() = 0; + virtual void setOptionalString(const std::optional& optionalString) = 0; + virtual std::shared_ptr getThisObject() = 0; + + public: + // Methods + virtual void simpleFunc() = 0; + virtual double addNumbers(double a, double b) = 0; + virtual std::string addStrings(const std::string& a, const std::string& b) = 0; + virtual void multipleArguments(double num, const std::string& str, bool boo) = 0; + virtual std::shared_ptr createMap() = 0; + virtual std::shared_ptr mapRoundtrip(const std::shared_ptr& map) = 0; + virtual double funcThatThrows() = 0; + virtual std::string tryOptionalParams(double num, bool boo, const std::optional& str) = 0; + virtual std::string tryMiddleParam(double num, std::optional boo, const std::string& str) = 0; + virtual int64_t calculateFibonacciSync(double value) = 0; + virtual std::future calculateFibonacciAsync(double value) = 0; + virtual std::future wait(double seconds) = 0; + virtual void callCallback(const std::function& callback) = 0; + virtual void callAll(const std::function& first, const std::function& second, const std::function& third) = 0; + virtual Car getCar() = 0; + virtual bool isCarElectric(const Car& car) = 0; + virtual std::optional getDriver(const Car& car) = 0; + virtual std::shared_ptr createArrayBuffer() = 0; + virtual double getBufferLastItem(const std::shared_ptr& buffer) = 0; + virtual void setAllValuesTo(const std::shared_ptr& buffer, double value) = 0; + virtual std::shared_ptr newTestObject() = 0; + + protected: + // Hybrid Setup + void loadHybridMethods() override; + + protected: + // Tag for logging + static constexpr auto TAG = "TestObjectSwiftKotlin"; + }; + +} // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/src/index.ts b/packages/react-native-nitro-image/src/index.ts index dddad1776..169935696 100644 --- a/packages/react-native-nitro-image/src/index.ts +++ b/packages/react-native-nitro-image/src/index.ts @@ -1,6 +1,9 @@ import { NitroModules } from 'react-native-nitro-modules' import type { ImageFactory } from './specs/ImageFactory.nitro' -import { type TestObject } from './specs/TestObject.nitro' +import { + type TestObjectCpp, + type TestObjectSwiftKotlin, +} from './specs/TestObject.nitro' export * from './specs/TestObject.nitro' export * from './specs/Image.nitro' @@ -13,12 +16,15 @@ export const ImageConstructors = NitroModules.createHybridObject('ImageFactory') /** - * The Hybrid Test Object + * The Hybrid Test Object in C++ */ -export const HybridTestObject = - NitroModules.createHybridObject('TestObject') +export const HybridTestObjectCpp = + NitroModules.createHybridObject('TestObjectCpp') -// export const HybridKotlinTestObject = -// NitroModules.createHybridObject( -// 'SwiftKotlinTestObject' -// ) +/** + * The Hybrid Test Object in Swift/Kotlin + */ +export const HybridTestObjectSwiftKotlin = + NitroModules.createHybridObject( + 'TestObjectSwiftKotlin' + ) diff --git a/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts b/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts index 2c590185f..faf108924 100644 --- a/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/TestObject.nitro.ts @@ -26,7 +26,7 @@ export interface Person { age: number } -export interface TestObject extends HybridObject<{ ios: 'c++' }> { +export interface TestObjectCpp extends HybridObject<{ ios: 'c++' }> { // Test Primitives numberValue: number boolValue: boolean @@ -47,7 +47,6 @@ export interface TestObject extends HybridObject<{ ios: 'c++' }> { mapRoundtrip(map: AnyMap): AnyMap // Errors - valueThatWillThrowOnAccess: number funcThatThrows(): number // Optional parameters @@ -63,7 +62,7 @@ export interface TestObject extends HybridObject<{ ios: 'c++' }> { // Complex variants getVariantEnum(variant: OldEnum | boolean): OldEnum | boolean getVariantObjects(variant: Person | Car): Person | Car - getVariantHybrid(variant: TestObject | Person): TestObject | Person + getVariantHybrid(variant: TestObjectCpp | Person): TestObjectCpp | Person getVariantTuple(variant: Float2 | Float3): Float2 | Float3 // Tuples @@ -97,15 +96,12 @@ export interface TestObject extends HybridObject<{ ios: 'c++' }> { setAllValuesTo(buffer: ArrayBuffer, value: number): void // Other HybridObjects - readonly self: TestObject - newTestObject(): TestObject + readonly thisObject: TestObjectCpp + newTestObject(): TestObjectCpp } -interface CallbackHolder { - callback: () => void -} - -export interface SwiftKotlinTestObject extends HybridObject<{ ios: 'swift' }> { +export interface TestObjectSwiftKotlin + extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { // Test Primitives numberValue: number boolValue: boolean @@ -121,53 +117,64 @@ export interface SwiftKotlinTestObject extends HybridObject<{ ios: 'swift' }> { addStrings(a: string, b: string): string multipleArguments(num: number, str: string, boo: boolean): void - getNumbers(): number[] - getStrings(): string[] - - callCallback(callback: () => void): void - - someRecord: Record - someArray: string[] - someOptional: string | undefined - someMap: AnyMap - - car?: Car - - powertrain: Powertrain - oldEnum: OldEnum - - buffer: ArrayBuffer - createNewBuffer(size: number): ArrayBuffer - newTestObject(): SwiftKotlinTestObject - bounceBack(obj: SwiftKotlinTestObject): SwiftKotlinTestObject - - call(args: CallbackHolder): void + // Maps + createMap(): AnyMap + mapRoundtrip(map: AnyMap): AnyMap - getNumberAsync(): Promise - getStringAsync(): Promise - getCarAsync(): Promise + // Errors + funcThatThrows(): number - doSomeStuff( - withEnum: (value: Powertrain, str: string, buf: ArrayBuffer) => void - ): void -} + // Optional parameters + tryOptionalParams(num: number, boo: boolean, str?: string): string + tryMiddleParam(num: number, boo: boolean | undefined, str: string): string -export interface KotlinTestObject extends HybridObject<{ android: 'kotlin' }> { - numberValue: number - optionalNumber?: number + // TODO: Variants are not yet supported in Swift/Kotlin! + // Variants + // someVariant: number | string + // passVariant( + // either: number | string | number[] | string[] | boolean + // ): number | string - primitiveArray: number[] - carCollection: Car[] + // TODO: Variants are not yet supported in Swift/Kotlin! + // Complex variants + // getVariantEnum(variant: OldEnum | boolean): OldEnum | boolean + // getVariantObjects(variant: Person | Car): Person | Car + // getVariantHybrid(variant: TestObjectSwiftKotlin | Person): TestObjectSwiftKotlin | Person + // getVariantTuple(variant: Float2 | Float3): Float2 | Float3 - someBuffer: ArrayBuffer + // TODO: Tuples are not yet supported in Swift/Kotlin! + // Tuples + // someTuple: [number, string] + // flip(tuple: Float3): Float3 + // passTuple(tuple: TestTuple): [number, string, boolean] - asyncTest(): Promise + // Promises + calculateFibonacciSync(value: number): bigint + calculateFibonacciAsync(value: number): Promise + wait(seconds: number): Promise - createMap(): AnyMap + // Callbacks + callCallback(callback: () => void): void + callAll(first: () => void, second: () => void, third: () => void): void + // TODO: Callbacks that return a value are not supported in Swift yet! + // getValueFromJSCallback(getValue: () => number): void + // getValueFromJSCallbackAndWait(getValue: () => number): Promise + // getValueFromJsCallback( + // callback: () => string, + // andThenCall: (valueFromJs: string) => void + // ): Promise - addOnPersonBornListener(callback: (p: Person) => void): void + // Objects + getCar(): Car + isCarElectric(car: Car): boolean + getDriver(car: Car): Person | undefined - something1(optional?: Powertrain): void + // ArrayBuffers + createArrayBuffer(): ArrayBuffer + getBufferLastItem(buffer: ArrayBuffer): number + setAllValuesTo(buffer: ArrayBuffer, value: number): void - someRecord: Record + // Other HybridObjects + readonly thisObject: TestObjectSwiftKotlin + newTestObject(): TestObjectSwiftKotlin } diff --git a/packages/react-native-nitro-modules/android/src/main/cpp/core/ByteBufferArrayBuffer.hpp b/packages/react-native-nitro-modules/android/src/main/cpp/core/ByteBufferArrayBuffer.hpp index adce2a747..9d504798e 100644 --- a/packages/react-native-nitro-modules/android/src/main/cpp/core/ByteBufferArrayBuffer.hpp +++ b/packages/react-native-nitro-modules/android/src/main/cpp/core/ByteBufferArrayBuffer.hpp @@ -21,7 +21,7 @@ using namespace facebook; class ByteBufferArrayBuffer final : public ArrayBuffer { public: explicit ByteBufferArrayBuffer(const jni::alias_ref& byteBuffer) : _byteBuffer(jni::make_global(byteBuffer)) { - _byteBuffer->order(jni::JByteOrder::bigEndian()); + _byteBuffer->order(jni::JByteOrder::nativeOrder()); } public: @@ -36,7 +36,7 @@ class ByteBufferArrayBuffer final : public ArrayBuffer { } public: - [[nodiscard]] jni::alias_ref getBuffer() const { + [[nodiscard]] const jni::global_ref& getBuffer() const { return _byteBuffer; } diff --git a/packages/react-native-nitro-modules/android/src/main/cpp/core/JArrayBuffer.hpp b/packages/react-native-nitro-modules/android/src/main/cpp/core/JArrayBuffer.hpp index b9b92c856..34712073f 100644 --- a/packages/react-native-nitro-modules/android/src/main/cpp/core/JArrayBuffer.hpp +++ b/packages/react-native-nitro-modules/android/src/main/cpp/core/JArrayBuffer.hpp @@ -68,22 +68,22 @@ class JArrayBuffer final : public jni::HybridClass { * `ByteBuffer`. In this case, `getBuffer()` will **copy** the data into a new `ByteBuffer` if * `copyIfNeeded` is `true`, and **wrap** the data into a new `ByteBuffer` if `copyIfNeeded` is false. */ - jni::alias_ref getByteBuffer(bool copyIfNeeded) { + jni::local_ref getByteBuffer(bool copyIfNeeded) { auto byteBufferArrayBuffer = std::dynamic_pointer_cast(_arrayBuffer); if (byteBufferArrayBuffer != nullptr) { // It is a `ByteBufferArrayBuffer`, which has a `ByteBuffer` underneath! - return byteBufferArrayBuffer->getBuffer(); + return jni::make_local(byteBufferArrayBuffer->getBuffer()); } else { // It is a different kind of `ArrayBuffer`, we need to copy or wrap the data. size_t size = _arrayBuffer->size(); if (copyIfNeeded) { auto buffer = jni::JByteBuffer::allocateDirect(size); - buffer->order(jni::JByteOrder::bigEndian()); + buffer->order(jni::JByteOrder::nativeOrder()); memcpy(buffer->getDirectAddress(), _arrayBuffer->data(), size); return buffer; } else { auto buffer = jni::JByteBuffer::wrapBytes(_arrayBuffer->data(), size); - buffer->order(jni::JByteOrder::bigEndian()); + buffer->order(jni::JByteOrder::nativeOrder()); return buffer; } } diff --git a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt index c545a6e5c..177c49be7 100644 --- a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt +++ b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt @@ -80,6 +80,8 @@ class ArrayBuffer { * Create a new **non-owning-** `ArrayBuffer` that holds foreign data, potentially coming from JS. */ @Suppress("unused") + @Keep + @DoNotStrip private constructor(hybridData: HybridData) { mHybridData = hybridData } @@ -94,6 +96,14 @@ class ArrayBuffer { private external fun getBufferSize(): Int companion object { + /** + * Allocate a new `ArrayBuffer` with the given [size]. + */ + fun allocate(size: Int): ArrayBuffer { + val buffer = ByteBuffer.allocateDirect(size) + return ArrayBuffer(buffer) + } + /** * Copy the given `ArrayBuffer` into a new **owning** `ArrayBuffer`. */ diff --git a/packages/template/README.md b/packages/template/README.md index ce17deba6..05265e85b 100644 --- a/packages/template/README.md +++ b/packages/template/README.md @@ -21,11 +21,11 @@ Contribute a change to this template to update it for newer React Native version - [`CMakeLists.txt`](android/CMakeLists.txt): The CMake build file to build C++ code. This contains four important pieces: 1. Creates a library called `<>` (same as in `nitro.json`) 2. Adds all Nitrogen files (`include(.../<>+autolinking.cmake)`) - 3. Adds all custom C++ files (only `HybridTestObject.cpp`) - 4. Adds a `cpp-adapter.cpp` file, which autolinks all C++ HybridObjects (only `HybridTestObject`) + 3. Adds all custom C++ files (only `HybridTestObjectCpp.cpp`) + 4. Adds a `cpp-adapter.cpp` file, which autolinks all C++ HybridObjects (only `HybridTestObjectCpp`) - [`src/main/java/com/margelo/nitro/<>/`](android/src/main/java/com/margelo/nitro/<>/): All Kotlin implementations. - [`<>Package.java`](android/src/main/java/com/margelo/nitro/<>/<>Package.java): The react-native package. You need this because the react-native CLI only adds libraries if they have a `*Package.java` file. In here, you can autolink all Kotlin HybridObjects. -- [`cpp/`](cpp): All your cross-platform implementations. (only `HybridTestObject.cpp`) +- [`cpp/`](cpp): All your cross-platform implementations. (only `HybridTestObjectCpp.cpp`) - [`ios/`](ios): All your iOS-specific implementations. - [`nitrogen/`](nitrogen): All files generated by nitrogen. You should commit this folder to git. - [`src/`](src): The TypeScript codebase. This defines all HybridObjects and loads them at runtime. diff --git a/packages/template/android/CMakeLists.txt b/packages/template/android/CMakeLists.txt index 85b2b136b..98781c2df 100644 --- a/packages/template/android/CMakeLists.txt +++ b/packages/template/android/CMakeLists.txt @@ -8,7 +8,6 @@ set (CMAKE_CXX_STANDARD 20) # Define C++ library and add all sources add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp - ../cpp/HybridTestObject.cpp ) # Add Nitrogen specs :)