Mostly in STL copy constructors. Best to have parameter names as they make their way into the wrappers in some target languages.
134 lines
3.5 KiB
Text
134 lines
3.5 KiB
Text
/* -----------------------------------------------------------------------------
|
|
* rubycontainer_extended.swg
|
|
*
|
|
* This file contains additional functions that make containers
|
|
* behave closer to ruby primitive types.
|
|
* However, some of these functions place some restrictions on
|
|
* the underlying object inside of the container and the iterator
|
|
* (that it has to have an == comparison function, that it has to have
|
|
* an = assignment operator, etc).
|
|
* ----------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Macro used to add extend functions that require operator== in object.
|
|
*
|
|
* @param Container STL container
|
|
* @param Type class inside container
|
|
*
|
|
*/
|
|
%define %swig_container_with_equal_operator( Container, Type )
|
|
|
|
VALUE __delete__( const Type& val ) {
|
|
VALUE r = Qnil;
|
|
Container<Type >::iterator e = $self->end();
|
|
Container<Type >::iterator i = std::remove( $self->begin(), e, val );
|
|
// remove dangling elements now
|
|
$self->erase( i, e );
|
|
|
|
if ( i != e )
|
|
r = swig::from< Type >( val );
|
|
else if ( rb_block_given_p() )
|
|
r = rb_yield(Qnil);
|
|
return r;
|
|
}
|
|
|
|
%enddef // end of %swig_container_with_equal_operator
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Macro used to add extend functions that require the assignment
|
|
* operator (ie. = ) of contained class
|
|
*
|
|
* @param Container STL container
|
|
* @param Type class inside container
|
|
*
|
|
*/
|
|
|
|
%define %swig_container_with_assignment( Container, Type )
|
|
|
|
|
|
//
|
|
// map! -- the equivalent of std::transform
|
|
//
|
|
Container< Type >* map_bang() {
|
|
|
|
if ( !rb_block_given_p() )
|
|
rb_raise( rb_eArgError, "No block given" );
|
|
|
|
VALUE r = Qnil;
|
|
Container< Type >::iterator i = $self->begin();
|
|
Container< Type >::iterator e = $self->end();
|
|
|
|
try {
|
|
for ( ; i != e; ++i )
|
|
{
|
|
r = swig::from< Type >( *i );
|
|
r = rb_yield( r );
|
|
*i = swig::as< Type >( r );
|
|
}
|
|
}
|
|
catch (const std::invalid_argument&)
|
|
{
|
|
rb_raise(rb_eTypeError,
|
|
"Yield block did not return a valid element for " "Container");
|
|
}
|
|
|
|
return $self;
|
|
}
|
|
|
|
|
|
%enddef // end of %swig_container_with_assignment
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Macro used to add all extended functions to a container
|
|
*
|
|
* @param Container STL container
|
|
* @param Type class inside container
|
|
*
|
|
*/
|
|
%define %swig_container_extend( Container, Type )
|
|
|
|
%extend Container< Type > {
|
|
|
|
%swig_container_with_assignment( %arg(Container), Type );
|
|
%swig_container_with_equal_operator( %arg(Container), Type );
|
|
|
|
}
|
|
|
|
%enddef
|
|
|
|
|
|
/**
|
|
* Private macro used to add all extended functions to C/C++
|
|
* primitive types
|
|
*
|
|
* @param Container an STL container, like std::vector (with no class template)
|
|
*
|
|
*/
|
|
%define %__swig_container_extend_primtypes( Container )
|
|
|
|
%swig_container_extend( %arg( Container ), bool );
|
|
%swig_container_extend( %arg( Container ), char );
|
|
%swig_container_extend( %arg( Container ), short );
|
|
%swig_container_extend( %arg( Container ), int );
|
|
%swig_container_extend( %arg( Container ), unsigned short );
|
|
%swig_container_extend( %arg( Container ), unsigned int );
|
|
%swig_container_extend( %arg( Container ), float );
|
|
%swig_container_extend( %arg( Container ), double );
|
|
%swig_container_extend( %arg( Container ), std::complex );
|
|
%swig_container_extend( %arg( Container ), std::string );
|
|
%swig_container_extend( %arg( Container ), swig::GC_VALUE );
|
|
|
|
%enddef
|
|
|
|
|
|
%__swig_container_extend_primtypes( std::vector );
|
|
%__swig_container_extend_primtypes( std::deque );
|
|
%__swig_container_extend_primtypes( std::list );
|
|
|