Add std::auto_ptr support for Perl based on std::unique_ptr

This commit is contained in:
William S Fulton 2022-07-12 09:41:56 +01:00
commit 2bba78f757
4 changed files with 43 additions and 1 deletions

View file

@ -7,6 +7,12 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
Version 4.1.0 (in progress) Version 4.1.0 (in progress)
=========================== ===========================
2022-07-12: wsfulton
[Perl] Add std::auto_ptr support in std_auto_ptr.i library file.
2022-07-12: erezgeva
[Perl] Add std::unique_ptr support in std_unique_ptr.i library file.
2022-07-07: olly 2022-07-07: olly
[xml] #2213 XML has been moved to "Experimental" target language [xml] #2213 XML has been moved to "Experimental" target language
status. It's not in good shape and is likely to be removed unless status. It's not in good shape and is likely to be removed unless

View file

@ -12,7 +12,7 @@
#endif #endif
%} %}
#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGRUBY) #if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGPYTHON) || defined(SWIGRUBY) || defined(SWIGPERL)
%include "std_auto_ptr.i" %include "std_auto_ptr.i"

View file

@ -0,0 +1,17 @@
use strict;
use warnings;
use Test::More tests => 6;
BEGIN { use_ok('li_std_auto_ptr') }
require_ok('li_std_auto_ptr');
my $k1 = li_std_auto_ptr::makeKlassAutoPtr("first");
my $k2 = li_std_auto_ptr::makeKlassAutoPtr("second");
is(li_std_auto_ptr::Klass::getTotal_count, 2, "have 2 pointers");
undef $k1;
is(li_std_auto_ptr::Klass::getTotal_count, 1, "left 1 pointer");
is($k2->getLabel, "second", "proper label");
undef $k2;
is(li_std_auto_ptr::Klass::getTotal_count, 0, "remove all pointers");

19
Lib/perl5/std_auto_ptr.i Normal file
View file

@ -0,0 +1,19 @@
/* -----------------------------------------------------------------------------
* std_auto_ptr.i
*
* The typemaps here allow handling 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 {};
}