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
This commit is contained in:
Gonzalo Garramuno 2007-05-01 06:43:56 +00:00
commit 8564ff90c0
5 changed files with 144 additions and 87 deletions

View file

@ -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 <std_string.i>
%include <std_set.i>
%include <std_multiset.i>
%include <std_vector.i>
%template(set_string) std::set<std::string>;
%template(set_int) std::multiset<int>;
%template(v_int) std::vector<int>;
%template(LanguageSet) std::set<swig::LANGUAGE_OBJ>;

View file

@ -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<Container::value_type>( *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<Container::value_type>( *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<Container::value_type>( *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<Sequence::value_type>( *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<Sequence::value_type>( *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<Sequence::value_type>( *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 {

View file

@ -86,7 +86,6 @@
}
%define %swig_multimap_methods(MultiMap...)
%swig_container_methods(%arg(MultiMap));
%swig_map_common(%arg(MultiMap));
%extend {

View file

@ -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 <std/std_set.i>

View file

@ -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