Merge branch 'ruby-autoptr'
* ruby-autoptr: Extend std::auto_ptr<> support to Ruby
This commit is contained in:
commit
ebc324dfd5
4 changed files with 64 additions and 1 deletions
3
CHANGES
3
CHANGES
|
|
@ -8,6 +8,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
|||
Version 4.0.1 (21 Aug 2019)
|
||||
===========================
|
||||
|
||||
2019-09-09: vadz
|
||||
[Ruby] Add std::auto_ptr<> typemaps.
|
||||
|
||||
2019-08-20: TekuConcept
|
||||
[Javascript] #1535 Add %native support to Javascript.
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
#endif
|
||||
%}
|
||||
|
||||
#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON)
|
||||
#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGRUBY)
|
||||
|
||||
%include "std_auto_ptr.i"
|
||||
|
||||
|
|
|
|||
43
Examples/test-suite/ruby/li_std_auto_ptr_runme.rb
Normal file
43
Examples/test-suite/ruby/li_std_auto_ptr_runme.rb
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'swig_assert'
|
||||
|
||||
require 'li_std_auto_ptr'
|
||||
|
||||
k1 = Li_std_auto_ptr::makeKlassAutoPtr("first")
|
||||
k2 = Li_std_auto_ptr::makeKlassAutoPtr("second")
|
||||
swig_assert_equal_simple(Li_std_auto_ptr::Klass::getTotal_count(), 2)
|
||||
|
||||
k1 = nil
|
||||
GC.start
|
||||
|
||||
# GC can need a few runs to actually collect the object.
|
||||
100.times do ||
|
||||
next if Li_std_auto_ptr::Klass::getTotal_count() == 2
|
||||
|
||||
swig_assert_equal_simple(Li_std_auto_ptr::Klass::getTotal_count(), 1)
|
||||
break
|
||||
end
|
||||
|
||||
swig_assert_equal_simple(k2.getLabel(), "second")
|
||||
|
||||
if Li_std_auto_ptr::Klass::getTotal_count() != 1
|
||||
STDERR.puts "GC failed to collect the first object, count still #{Li_std_auto_ptr::Klass::getTotal_count()}"
|
||||
|
||||
# Skip the rest of the test as it's not going to work correctly anyhow.
|
||||
exit
|
||||
end
|
||||
|
||||
k2 = nil
|
||||
GC.start
|
||||
|
||||
100.times do ||
|
||||
next if Li_std_auto_ptr::Klass::getTotal_count() == 1
|
||||
|
||||
swig_assert_equal_simple(Li_std_auto_ptr::Klass::getTotal_count(), 0)
|
||||
break
|
||||
end
|
||||
|
||||
if Li_std_auto_ptr::Klass::getTotal_count() != 0
|
||||
STDERR.puts "GC failed to collect the second object, count still #{Li_std_auto_ptr::Klass::getTotal_count()}"
|
||||
end
|
||||
17
Lib/ruby/std_auto_ptr.i
Normal file
17
Lib/ruby/std_auto_ptr.i
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
The typemaps here allow to handle functions returning std::auto_ptr<>,
|
||||
which is the most common use of this type. If you have functions taking it
|
||||
as parameter, these typemaps can't be used for them and you need to do
|
||||
something else (e.g. use shared_ptr<> which SWIG supports fully).
|
||||
*/
|
||||
|
||||
%define %auto_ptr(TYPE)
|
||||
%typemap (out) std::auto_ptr<TYPE > %{
|
||||
%set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags));
|
||||
%}
|
||||
%template() std::auto_ptr<TYPE >;
|
||||
%enddef
|
||||
|
||||
namespace std {
|
||||
template <class T> class auto_ptr {};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue