summaryrefslogtreecommitdiff
path: root/share/swig/2.0.11/ruby/rubycontainer_extended.swg
diff options
context:
space:
mode:
Diffstat (limited to 'share/swig/2.0.11/ruby/rubycontainer_extended.swg')
-rw-r--r--share/swig/2.0.11/ruby/rubycontainer_extended.swg134
1 files changed, 134 insertions, 0 deletions
diff --git a/share/swig/2.0.11/ruby/rubycontainer_extended.swg b/share/swig/2.0.11/ruby/rubycontainer_extended.swg
new file mode 100644
index 0000000..7514ba2
--- /dev/null
+++ b/share/swig/2.0.11/ruby/rubycontainer_extended.swg
@@ -0,0 +1,134 @@
+/* -----------------------------------------------------------------------------
+ * 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 );
+