Extend std::auto_ptr<> support to Ruby
This is trivial as exactly the same typemap as for Python can be used for Ruby too, all the differenced are abstracted by the unified typemap library.
This commit is contained in:
parent
7051753fdf
commit
7cc94808b6
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