getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of takeKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of takeKlassUniquePtr should have been an error"); $kin = NULL; # Should not fail, even though already deleted checkCount(0); $kin = new Klass("KlassInput"); $exception_thrown = false; $notowned = get_not_owned_ptr($kin); try { takeKlassUniquePtr($notowned); } catch (TypeError $e) { check::equal($e->getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of takeKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of takeKlassUniquePtr should have been an error"); checkCount(1); $kin = NULL; checkCount(0); $kini = new KlassInheritance("KlassInheritanceInput"); checkCount(1); $s = takeKlassUniquePtr($kini); checkCount(0); check::equal($s, "KlassInheritanceInput", "Incorrect string: $s"); try { is_nullptr($kini); check::fail("is_nullptr check"); } catch (TypeError $e) { } $kini = NULL; # Should not fail, even though already deleted checkCount(0); takeKlassUniquePtr(NULL); takeKlassUniquePtr(make_null()); checkCount(0); # overloaded parameters check::equal(overloadTest(), 0, "overloadTest failed"); check::equal(overloadTest(NULL), 1, "overloadTest failed"); check::equal(overloadTest(new Klass("over")), 1, "overloadTest failed"); checkCount(0); # #### INPUT BY RVALUE REF #### # unique_ptr as input $kin = new Klass("KlassInput"); checkCount(1); $s = moveKlassUniquePtr($kin); checkCount(0); check::equal($s, "KlassInput", "Incorrect string: $s"); try { is_nullptr($kin); check::fail("is_nullptr check"); } catch (TypeError $e) { } $kin = NULL; # Should not fail, even though already deleted checkCount(0); $kin = new Klass("KlassInput"); checkCount(1); $s = moveKlassUniquePtr($kin); checkCount(0); check::equal($s, "KlassInput", "Incorrect string: $s"); try { is_nullptr($kin); check::fail("is_nullptr check"); } catch (TypeError $e) { } $exception_thrown = false; try { moveKlassUniquePtr($kin); } catch (TypeError $e) { check::equal($e->getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of moveKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of moveKlassUniquePtr should have been an error"); $kin = NULL; # Should not fail, even though already deleted checkCount(0); $kin = new Klass("KlassInput"); $exception_thrown = false; $notowned = get_not_owned_ptr($kin); try { moveKlassUniquePtr($notowned); } catch (TypeError $e) { check::equal($e->getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of moveKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of moveKlassUniquePtr should have been an error"); checkCount(1); $kin = NULL; checkCount(0); $kini = new KlassInheritance("KlassInheritanceInput"); checkCount(1); $s = moveKlassUniquePtr($kini); checkCount(0); check::equal($s, "KlassInheritanceInput", "Incorrect string: $s"); try { is_nullptr($kini); check::fail("is_nullptr check"); } catch (TypeError $e) { } $kini = NULL; # Should not fail, even though already deleted checkCount(0); moveKlassUniquePtr(NULL); moveKlassUniquePtr(make_null()); checkCount(0); # overloaded parameters check::equal(moveOverloadTest(), 0, "moveOverloadTest failed"); check::equal(moveOverloadTest(NULL), 1, "moveOverloadTest failed"); check::equal(moveOverloadTest(new Klass("over")), 1, "moveOverloadTest failed"); checkCount(0); # #### INPUT BY NON-CONST LVALUE REF #### # unique_ptr as input $kin = new Klass("KlassInput"); checkCount(1); $s = moveRefKlassUniquePtr($kin); checkCount(0); check::equal($s, "KlassInput", "Incorrect string: $s"); try { is_nullptr($kin); check::fail("is_nullptr check"); } catch (TypeError $e) { } $kin = NULL; # Should not fail, even though already deleted checkCount(0); $kin = new Klass("KlassInput"); checkCount(1); $s = moveRefKlassUniquePtr($kin); checkCount(0); check::equal($s, "KlassInput", "Incorrect string: $s"); try { is_nullptr($kin); check::fail("is_nullptr check"); } catch (TypeError $e) { } $exception_thrown = false; try { moveRefKlassUniquePtr($kin); } catch (TypeError $e) { check::equal($e->getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of moveRefKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of moveRefKlassUniquePtr should have been an error"); $kin = NULL; # Should not fail, even though already deleted checkCount(0); $kin = new Klass("KlassInput"); $exception_thrown = false; $notowned = get_not_owned_ptr($kin); try { moveRefKlassUniquePtr($notowned); } catch (TypeError $e) { check::equal($e->getMessage(), "Cannot release ownership as memory is not owned for argument 1 of SWIGTYPE_p_Klass of moveRefKlassUniquePtr", "Unexpected exception: {$e->getMessage()}"); $exception_thrown = true; } check::equal($exception_thrown, true, "double usage of moveRefKlassUniquePtr should have been an error"); checkCount(1); $kin = NULL; checkCount(0); $kini = new KlassInheritance("KlassInheritanceInput"); checkCount(1); $s = moveRefKlassUniquePtr($kini); checkCount(0); check::equal($s, "KlassInheritanceInput", "Incorrect string: $s"); try { is_nullptr($kini); check::fail("is_nullptr check"); } catch (TypeError $e) { } $kini = NULL; # Should not fail, even though already deleted checkCount(0); moveRefKlassUniquePtr(NULL); moveRefKlassUniquePtr(make_null()); checkCount(0); # overloaded parameters check::equal(moveRefOverloadTest(), 0, "moveRefOverloadTest failed"); check::equal(moveRefOverloadTest(NULL), 1, "moveRefOverloadTest failed"); check::equal(moveRefOverloadTest(new Klass("over")), 1, "moveRefOverloadTest failed"); checkCount(0); # #### INPUT BY CONST LVALUE REF #### # unique_ptr as input $kin = new Klass("KlassInput"); checkCount(1); $s = useRefKlassUniquePtr($kin); checkCount(1); check::equal($s, "KlassInput", "Incorrect string: $s"); $kin = NULL; checkCount(0); $kini = new KlassInheritance("KlassInheritanceInput"); checkCount(1); $s = useRefKlassUniquePtr($kini); checkCount(1); check::equal($s, "KlassInheritanceInput", "Incorrect string: $s"); $kini = NULL; checkCount(0); useRefKlassUniquePtr(NULL); useRefKlassUniquePtr(make_null()); checkCount(0); # overloaded parameters check::equal(useRefOverloadTest(), 0, "useRefOverloadTest failed"); check::equal(useRefOverloadTest(NULL), 1, "useRefOverloadTest failed"); $kin = new Klass("over"); check::equal(useRefOverloadTest($kin), 1, "useRefOverloadTest failed"); checkCount(1); $kin = NULL; checkCount(0); # unique_ptr as output $k1 = makeKlassUniquePtr("first"); $k2 = makeKlassUniquePtr("second"); checkCount(2); $k1 = NULL; checkCount(1); check::equal($k2->getLabel(), "second", "proper label"); $k2 = NULL; checkCount(0); check::equal(makeNullUniquePtr(), NULL); # unique_ptr as output (rvalue ref) $k1 = makeRVRKlassUniquePtr("first"); check::equal($k1->getLabel(), "first", "proper label"); check::equal(makeRVRKlassUniquePtr(NULL), NULL); # unique_ptr as output (lvalue ref) $k1 = makeRefKlassUniquePtr("lvalueref"); check::equal($k1->getLabel(), "lvalueref", "proper label"); check::equal(makeRefKlassUniquePtr(NULL), NULL); check::done();