| /* ----------------------------------------------------------------------------- | |
| * 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 ); | |