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 ****/
|
||||
|
||||
|
||||
%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 {
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@
|
|||
}
|
||||
|
||||
%define %swig_multimap_methods(MultiMap...)
|
||||
%swig_container_methods(%arg(MultiMap));
|
||||
%swig_map_common(%arg(MultiMap));
|
||||
|
||||
%extend {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue