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:
parent
163efb1923
commit
8564ff90c0
5 changed files with 144 additions and 87 deletions
34
Examples/test-suite/li_std_set.i
Normal file
34
Examples/test-suite/li_std_set.i
Normal 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>;
|
||||||
|
|
@ -519,59 +519,6 @@ namespace swig
|
||||||
/**** The Ruby container methods ****/
|
/**** 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...)
|
%define %swig_container_methods(Container...)
|
||||||
|
|
||||||
|
|
@ -587,29 +534,72 @@ namespace swig
|
||||||
|
|
||||||
%enddef
|
%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...)
|
%define %swig_sequence_methods_common(Sequence...)
|
||||||
%swig_sequence_iterator(%arg(Sequence))
|
|
||||||
%swig_container_methods(%arg(Sequence))
|
%swig_container_methods(%arg(Sequence))
|
||||||
|
%swig_sequence_iterator(%arg(Sequence))
|
||||||
|
%swig_sequence_printing_methods(%arg(Sequence))
|
||||||
|
|
||||||
%fragment("RubySequence_Base");
|
%fragment("RubySequence_Base");
|
||||||
|
|
||||||
|
|
||||||
%extend {
|
%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
|
// Implementing delete requires semantics that go beyond the
|
||||||
// default requirements of STD containers.
|
// default requirements of STD containers.
|
||||||
//
|
//
|
||||||
|
|
@ -645,18 +635,6 @@ namespace swig
|
||||||
return r;
|
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()
|
Sequence* each()
|
||||||
{
|
{
|
||||||
if ( !rb_block_given_p() )
|
if ( !rb_block_given_p() )
|
||||||
|
|
@ -674,6 +652,7 @@ namespace swig
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
%rename("reject!") reject_bang;
|
%rename("reject!") reject_bang;
|
||||||
%alias reject_bang "delete_if";
|
%alias reject_bang "delete_if";
|
||||||
Sequence* reject_bang() {
|
Sequence* reject_bang() {
|
||||||
|
|
@ -711,8 +690,42 @@ namespace swig
|
||||||
}
|
}
|
||||||
%enddef
|
%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...)
|
%define %swig_sequence_methods(Sequence...)
|
||||||
%swig_sequence_methods_common(%arg(Sequence))
|
%swig_sequence_methods_common(%arg(Sequence));
|
||||||
|
%swig_sequence_back_inserters(%arg(Sequence));
|
||||||
|
|
||||||
%extend {
|
%extend {
|
||||||
|
|
||||||
VALUE at(difference_type i) const {
|
VALUE at(difference_type i) const {
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
%define %swig_multimap_methods(MultiMap...)
|
%define %swig_multimap_methods(MultiMap...)
|
||||||
%swig_container_methods(%arg(MultiMap));
|
|
||||||
%swig_map_common(%arg(MultiMap));
|
%swig_map_common(%arg(MultiMap));
|
||||||
|
|
||||||
%extend {
|
%extend {
|
||||||
|
|
|
||||||
|
|
@ -36,11 +36,11 @@
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%define %swig_set_methods(set...)
|
%define %swig_set_methods(set...)
|
||||||
%swig_sequence_iterator(set);
|
%swig_sequence_methods_common(set);
|
||||||
%swig_container_methods(set);
|
|
||||||
|
|
||||||
%extend {
|
%extend {
|
||||||
const value_type& push(value_type x) {
|
%alias push "<<";
|
||||||
|
value_type push(value_type x) {
|
||||||
self->insert(x);
|
self->insert(x);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
@ -57,4 +57,17 @@
|
||||||
};
|
};
|
||||||
%enddef
|
%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>
|
%include <std/std_set.i>
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,11 @@
|
||||||
%define %swig_vector_methods(Type...)
|
%define %swig_vector_methods(Type...)
|
||||||
%swig_sequence_methods(Type)
|
%swig_sequence_methods(Type)
|
||||||
%swig_sequence_front_inserters(Type);
|
%swig_sequence_front_inserters(Type);
|
||||||
%swig_container_printing_methods(Type);
|
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
%define %swig_vector_methods_val(Type...)
|
%define %swig_vector_methods_val(Type...)
|
||||||
%swig_sequence_methods_val(Type);
|
%swig_sequence_methods_val(Type);
|
||||||
%swig_sequence_front_inserters(Type);
|
%swig_sequence_front_inserters(Type);
|
||||||
%swig_container_printing_methods(Type);
|
|
||||||
%enddef
|
%enddef
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue