From 8564ff90c00cb7bce9ac7c3b758dd0f37b70257e Mon Sep 17 00:00:00 2001 From: Gonzalo Garramuno Date: Tue, 1 May 2007 06:43:56 +0000 Subject: [PATCH] Improved multimap, vector and set by rearranging some methods. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9739 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/li_std_set.i | 34 ++++++ Lib/ruby/rubycontainer.swg | 175 +++++++++++++++++-------------- Lib/ruby/std_multimap.i | 1 - Lib/ruby/std_set.i | 19 +++- Lib/ruby/std_vector.i | 2 - 5 files changed, 144 insertions(+), 87 deletions(-) create mode 100644 Examples/test-suite/li_std_set.i diff --git a/Examples/test-suite/li_std_set.i b/Examples/test-suite/li_std_set.i new file mode 100644 index 000000000..c2cdc2ebe --- /dev/null +++ b/Examples/test-suite/li_std_set.i @@ -0,0 +1,34 @@ +/** + * @file li_std_set.i + * @author gga + * @date Tue May 1 02:52:47 2007 + * + * @brief a test of set containers. + * Languages should define swig::LANGUAGE_OBJ to be + * an entity of their native pointer type which can be + * included in a STL container. + * + * For example: + * swig::LANGUAGE_OBJ is GC_VALUE in Ruby + * swig::LANGUAGE_OBJ is PyObject_ptr in python + * + * + */ + +%module li_std_set + +%include +%include +%include +%include + +%template(set_string) std::set; +%template(set_int) std::multiset; + + +%template(v_int) std::vector; + + + + +%template(LanguageSet) std::set; diff --git a/Lib/ruby/rubycontainer.swg b/Lib/ruby/rubycontainer.swg index e45ec489b..5930631f1 100644 --- a/Lib/ruby/rubycontainer.swg +++ b/Lib/ruby/rubycontainer.swg @@ -519,59 +519,6 @@ namespace swig /**** The Ruby container methods ****/ -%define %swig_container_printing_methods(Container...) - - %extend { - - VALUE inspect() - { - Container::const_iterator i = $self->begin(); - Container::const_iterator e = $self->end(); - VALUE str = rb_str_new2( swig::type_name< Container >() ); - str = rb_str_cat2( str, " [" ); - bool comma = false; - VALUE tmp; - for ( ; i != e; ++i, comma = true ) - { - if (comma) str = rb_str_cat2( str, "," ); - tmp = swig::from( *i ); - tmp = rb_obj_as_string( tmp ); - str = rb_str_buf_append( str, tmp ); - } - str = rb_str_cat2( str, "]" ); - return str; - } - - VALUE to_a() - { - Container::const_iterator i = $self->begin(); - Container::const_iterator e = $self->end(); - VALUE ary = rb_ary_new2( std::distance( i, e ) ); - VALUE tmp; - for ( ; i != e; ++i ) - { - tmp = swig::from( *i ); - rb_ary_push( ary, tmp ); - } - return ary; - } - - VALUE to_s() - { - Container::iterator i = $self->begin(); - Container::iterator e = $self->end(); - VALUE str = rb_str_new2( "" ); - VALUE tmp; - for ( ; i != e; ++i ) - { - tmp = swig::from( *i ); - tmp = rb_obj_as_string( tmp ); - str = rb_str_buf_append( str, tmp ); - } - return str; - } -} -%enddef %define %swig_container_methods(Container...) @@ -587,29 +534,72 @@ namespace swig %enddef +%define %swig_sequence_printing_methods(Sequence...) + + %extend { + + VALUE inspect() + { + Sequence::const_iterator i = $self->begin(); + Sequence::const_iterator e = $self->end(); + VALUE str = rb_str_new2( swig::type_name< Sequence >() ); + str = rb_str_cat2( str, " [" ); + bool comma = false; + VALUE tmp; + for ( ; i != e; ++i, comma = true ) + { + if (comma) str = rb_str_cat2( str, "," ); + tmp = swig::from( *i ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); + } + str = rb_str_cat2( str, "]" ); + return str; + } + + VALUE to_a() + { + Sequence::const_iterator i = $self->begin(); + Sequence::const_iterator e = $self->end(); + VALUE ary = rb_ary_new2( std::distance( i, e ) ); + VALUE tmp; + for ( ; i != e; ++i ) + { + tmp = swig::from( *i ); + rb_ary_push( ary, tmp ); + } + return ary; + } + + VALUE to_s() + { + Sequence::iterator i = $self->begin(); + Sequence::iterator e = $self->end(); + VALUE str = rb_str_new2( "" ); + VALUE tmp; + for ( ; i != e; ++i ) + { + tmp = swig::from( *i ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); + } + return str; + } +} +%enddef + + %define %swig_sequence_methods_common(Sequence...) - %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) - + %swig_sequence_iterator(%arg(Sequence)) + %swig_sequence_printing_methods(%arg(Sequence)) + %fragment("RubySequence_Base"); %extend { - VALUE pop() { - if ($self->empty()) return Qnil; - Sequence::value_type x = self->back(); - $self->pop_back(); - return swig::from< Sequence::value_type >( x ); - } - - %alias push "<<"; - const value_type push( const value_type& e ) { - $self->push_back( e ); - return e; - } - // Implementing delete requires semantics that go beyond the // default requirements of STD containers. // @@ -645,18 +635,6 @@ namespace swig return r; } - %newobject reject; - Sequence* reject() { - if ( !rb_block_given_p() ) - rb_raise( rb_eArgError, "no block given" ); - - Sequence* r = new Sequence; - std::remove_copy_if( $self->begin(), $self->end(), - std::back_inserter(*r), - swig::yield< Sequence::value_type >() ); - return r; - } - Sequence* each() { if ( !rb_block_given_p() ) @@ -674,6 +652,7 @@ namespace swig return self; } + %rename("reject!") reject_bang; %alias reject_bang "delete_if"; Sequence* reject_bang() { @@ -711,8 +690,42 @@ namespace swig } %enddef + +%define %swig_sequence_back_inserters( Sequence... ) + %extend { + + VALUE pop() { + if ($self->empty()) return Qnil; + Sequence::value_type x = self->back(); + $self->pop_back(); + return swig::from< Sequence::value_type >( x ); + } + + %alias push "<<"; + const value_type push( const value_type& e ) { + $self->push_back( e ); + return e; + } + + %newobject reject; + Sequence* reject() { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given" ); + + Sequence* r = new Sequence; + std::remove_copy_if( $self->begin(), $self->end(), + std::back_inserter(*r), + swig::yield< Sequence::value_type >() ); + return r; + } + + } +%enddef + %define %swig_sequence_methods(Sequence...) - %swig_sequence_methods_common(%arg(Sequence)) + %swig_sequence_methods_common(%arg(Sequence)); + %swig_sequence_back_inserters(%arg(Sequence)); + %extend { VALUE at(difference_type i) const { diff --git a/Lib/ruby/std_multimap.i b/Lib/ruby/std_multimap.i index d5ca18de4..9f2415df1 100644 --- a/Lib/ruby/std_multimap.i +++ b/Lib/ruby/std_multimap.i @@ -86,7 +86,6 @@ } %define %swig_multimap_methods(MultiMap...) - %swig_container_methods(%arg(MultiMap)); %swig_map_common(%arg(MultiMap)); %extend { diff --git a/Lib/ruby/std_set.i b/Lib/ruby/std_set.i index d0c3c992c..793172b32 100644 --- a/Lib/ruby/std_set.i +++ b/Lib/ruby/std_set.i @@ -36,11 +36,11 @@ %} %define %swig_set_methods(set...) - %swig_sequence_iterator(set); - %swig_container_methods(set); + %swig_sequence_methods_common(set); %extend { - const value_type& push(value_type x) { + %alias push "<<"; + value_type push(value_type x) { self->insert(x); return x; } @@ -57,4 +57,17 @@ }; %enddef +#if defined(SWIG_RUBY_AUTORENAME) + +// %mixin std::set "Enumerable"; + %rename("empty?") std::set::empty; + +#else + +// %mixin std::set "Enumerable"; + %rename("empty?") std::set::empty; + +#endif + + %include diff --git a/Lib/ruby/std_vector.i b/Lib/ruby/std_vector.i index 512991ac3..a5072351c 100644 --- a/Lib/ruby/std_vector.i +++ b/Lib/ruby/std_vector.i @@ -26,13 +26,11 @@ %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); - %swig_container_printing_methods(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); - %swig_container_printing_methods(Type); %enddef