Fix delete_if (reject!) for the STL container wrappers.

Previously they would sometimes seg fault or not work.
This commit is contained in:
William S Fulton 2013-03-29 06:28:15 +00:00
parent 38b2b95c30
commit 2e0d1b12dc
5 changed files with 46 additions and 21 deletions

View File

@ -5,6 +5,10 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 2.0.10 (in progress)
============================
2013-03-29: wsfulton
[Ruby] Fix delete_if (reject!) for the STL container wrappers which previously would
sometimes seg fault or not work.
2013-03-19: wsfulton
[C#, Java, D] Fix seg fault in SWIG using directors when class and virtual method names are
the same except being in different namespaces when the %nspace feature is not being used.

View File

@ -61,3 +61,7 @@ s.to_a == [1,[1,2],'hello'] # sort order: s.sort {|a,b| a.hash <=> b.hash}
EOF
iv = Set_int.new([0,1,2,3,4,5,6])
iv.delete_if { |x| x == 0 || x == 3 || x == 6 }
swig_assert_equal(iv.to_s, '1245', binding)

View File

@ -64,6 +64,11 @@ y = average([1, 2, 3, 4])
half([10, 10.5, 11, 11.5])
EOF
iv = IntVector.new([0,1,2,3,4,5,6])
iv.delete_if { |x| x == 0 || x == 3 || x == 6 }
swig_assert_equal(iv.to_s, '1245', binding)
dv = DoubleVector.new(10)
swig_assert( "dv.respond_to? :each_with_index", binding )

View File

@ -677,27 +677,6 @@ namespace swig
return r;
}
%alias reject_bang "delete_if";
Sequence* reject_bang() {
if ( !rb_block_given_p() )
rb_raise( rb_eArgError, "no block given" );
Sequence::iterator i = self->begin();
Sequence::iterator e = self->end();
for ( ; i != e; )
{
VALUE r = swig::from< Sequence::value_type >(*i);
if ( RTEST( rb_yield(r) ) ) {
$self->erase(i++);
e = self->end();
} else {
++i;
}
}
return self;
}
VALUE delete_at(difference_type i) {
VALUE r = Qnil;
try {
@ -757,6 +736,19 @@ namespace swig
}
%enddef
%define %swig_sequence_methods_extra(Sequence...)
%extend {
%alias reject_bang "delete_if";
Sequence* reject_bang() {
if ( !rb_block_given_p() )
rb_raise( rb_eArgError, "no block given" );
$self->erase( std::remove_if( $self->begin(), $self->end(),
swig::yield< Sequence::value_type >() ), $self->end() );
return $self;
}
}
%enddef
/**
* Macro used to add functions for Sequences
@ -764,6 +756,7 @@ namespace swig
*/
%define %swig_sequence_methods(Sequence...)
%swig_sequence_methods_common(%arg(Sequence));
%swig_sequence_methods_extra(%arg(Sequence));
%swig_sequence_back_inserters(%arg(Sequence));
%extend {

View File

@ -152,10 +152,29 @@
}
%}
%define %swig_sequence_methods_extra_set(Sequence...)
%extend {
%alias reject_bang "delete_if";
Sequence* reject_bang() {
if ( !rb_block_given_p() )
rb_raise( rb_eArgError, "no block given" );
for ( Sequence::iterator i = $self->begin(); i != $self->end(); ) {
VALUE r = swig::from< Sequence::value_type >(*i);
Sequence::iterator current = i++;
if ( RTEST( rb_yield(r) ) )
$self->erase(current);
}
return self;
}
}
%enddef
%define %swig_set_methods(set...)
%swig_sequence_methods_common(%arg(set));
%swig_sequence_methods_extra_set(%arg(set));
%fragment("RubyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="RubySequence_Cont") {}