Add Java support for std::unique<T> for input parameters.

This works by transferring ownership of the underlying C++ memory
from the target language proxy class to an instance of the unique_ptr
which is passed to the wrapped function via std::move.

The proxy class has a new swigRelease() method which sets the
underlying C++ pointer for the proxy class to null, so working
in much the same way as std::unique_ptr::release(). Any attempt at
using the proxy class will be the same as if the delete() function
has been called on the proxy class. That is, using a C++ null pointer,
when a non-null pointer is usually expected.

This commit relies on the previous commit that uses std::move
on the temporary variable used for the wrapped function's input parameter
as std::unique_ptr is not copyable, it has move-only semantics.
This commit is contained in:
William S Fulton 2022-07-08 18:04:20 +01:00
commit 6b361bf050
5 changed files with 94 additions and 1 deletions

View file

@ -2,6 +2,7 @@
#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGRUBY) || defined(SWIGPERL)
%include "std_string.i"
%include "std_unique_ptr.i"
%unique_ptr(Klass)
@ -22,7 +23,7 @@ public:
const char* getLabel() const { return m_label.c_str(); }
~Klass()
virtual ~Klass()
{
SwigExamples::Lock lock(critical_section);
total_count--;
@ -44,6 +45,24 @@ int Klass::total_count = 0;
%inline %{
// Virtual inheritance used as this usually results in different values for Klass* and KlassInheritance*
// for testing class inheritance and unique_ptr
struct KlassInheritance : virtual Klass {
KlassInheritance(const char* label) : Klass(label) {
// std::cout << "ptrs.... " << std::hex << (Klass*)this << " " << (KlassInheritance*)this << std::endl;
}
};
#if defined(SWIGJAVA)
std::string takeKlassUniquePtr(std::unique_ptr<Klass> k) {
return std::string(k->getLabel());
}
#endif
bool is_nullptr(Klass *p) {
return p == nullptr;
}
std::unique_ptr<Klass> makeKlassUniquePtr(const char* label) {
return std::unique_ptr<Klass>(new Klass(label));
}