diff --git a/src/autobox.i b/src/autobox.i new file mode 100644 index 00000000..8e93006f --- /dev/null +++ b/src/autobox.i @@ -0,0 +1,12 @@ +// Java typemaps for autoboxing in return types of generics +%define AUTOBOX(CTYPE, JTYPE) +%typemap(autobox) CTYPE, const CTYPE&, CTYPE& "JTYPE" +%enddef +AUTOBOX(double, Double) +AUTOBOX(float, Float) +AUTOBOX(boolean, Boolean) +AUTOBOX(signed char, Byte) +AUTOBOX(short, Short) +AUTOBOX(int, Integer) +AUTOBOX(long, Long) +AUTOBOX(SWIGTYPE, $typemap(jstype,$1_basetype)) \ No newline at end of file diff --git a/src/bma250e/javaupm_bma250e.i b/src/bma250e/javaupm_bma250e.i index b2009802..2b9d0eee 100644 --- a/src/bma250e/javaupm_bma250e.i +++ b/src/bma250e/javaupm_bma250e.i @@ -1,10 +1,23 @@ %module javaupm_bma250e %include "../upm.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %ignore getAccelerometer(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) upm::BMA250E { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "bma250e_defs.h" diff --git a/src/bmg160/javaupm_bmg160.i b/src/bmg160/javaupm_bmg160.i index c404500a..6a331083 100644 --- a/src/bmg160/javaupm_bmg160.i +++ b/src/bmg160/javaupm_bmg160.i @@ -1,10 +1,23 @@ %module javaupm_bmg160 %include "../upm.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %ignore getGyroscope(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) SWIGTYPE { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "bmg160_defs.h" diff --git a/src/bmm150/javaupm_bmm150.i b/src/bmm150/javaupm_bmm150.i index bb5d624f..67a7f746 100644 --- a/src/bmm150/javaupm_bmm150.i +++ b/src/bmm150/javaupm_bmm150.i @@ -1,10 +1,23 @@ %module javaupm_bmm150 %include "../upm.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %ignore getMagnetometer(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) SWIGTYPE { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "bmm150_defs.h" diff --git a/src/bmx055/javaupm_bmx055.i b/src/bmx055/javaupm_bmx055.i index ca065426..0a7e1037 100644 --- a/src/bmx055/javaupm_bmx055.i +++ b/src/bmx055/javaupm_bmx055.i @@ -2,7 +2,7 @@ %include "../upm.i" %include "cpointer.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %apply int {mraa::Edge}; @@ -10,6 +10,19 @@ %ignore getMagnetometer(float *, float *, float *); %ignore getGyroscope(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) SWIGTYPE { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "bmg160_defs.h" diff --git a/src/lsm303agr/javaupm_lsm303agr.i b/src/lsm303agr/javaupm_lsm303agr.i index 22ec10ac..23dc6ffd 100644 --- a/src/lsm303agr/javaupm_lsm303agr.i +++ b/src/lsm303agr/javaupm_lsm303agr.i @@ -1,11 +1,24 @@ %module javaupm_lsm303agr %include "../upm.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %ignore getMagnetometer(float *, float *, float *); %ignore getAccelerometer(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) SWIGTYPE { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "lsm303agr_defs.h" diff --git a/src/lsm303d/javaupm_lsm303d.i b/src/lsm303d/javaupm_lsm303d.i index f651ee87..98de7c7b 100644 --- a/src/lsm303d/javaupm_lsm303d.i +++ b/src/lsm303d/javaupm_lsm303d.i @@ -1,11 +1,24 @@ %module javaupm_lsm303d %include "../upm.i" %include "typemaps.i" -%include "std_vector.i" +%include "../upm_stdvector.i" %ignore getMagnetometer(float *, float *, float *); %ignore getAccelerometer(float *, float *, float *); +%typemap(javaimports) SWIGTYPE %{ +import java.util.AbstractList; +import java.lang.Float; +%} + +%typemap(javaout) SWIGTYPE { + return new $&javaclassname($jnicall, true); +} +%typemap(javaout) std::vector { + return (AbstractList)(new $&javaclassname($jnicall, true)); +} +%typemap(jstype) std::vector "AbstractList" + %template(floatVector) std::vector; %include "lsm303d_defs.h" diff --git a/src/upm_stdvector.i b/src/upm_stdvector.i new file mode 100644 index 00000000..4596f3b4 --- /dev/null +++ b/src/upm_stdvector.i @@ -0,0 +1,61 @@ +%include "autobox.i" + +%{ +#include +#include +%} + +%include +%include + +namespace std { + + template class vector { + public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; + vector(); + vector(size_type n); + vector(const vector& o); + size_type capacity() const; + void reserve(size_type n); + %rename(isEmpty) empty; + bool empty() const; + void clear(); + void push_back(const value_type& x); + %extend { + const_reference get_impl(int i) throw (std::out_of_range) { + // at will throw if needed, swig will handle + return self->at(i); + } + value_type set(int i, const value_type& VECTOR_VALUE_IN) throw (std::out_of_range) { + const T old = $self->at(i); + $self->at(i) = VECTOR_VALUE_IN; + return old; + } + int32_t size() const { + return $self->size(); + } + void removeRange(int32_t from, int32_t to) { + $self->erase($self->begin()+from, $self->begin()+to); + } + } + }; +} + +%typemap(javabase) std::vector "java.util.AbstractList<$typemap(autobox,$1_basetype::value_type)>" +%typemap(javainterface) std::vector "java.util.RandomAccess" +%typemap(jstype) std::vector set "$typemap(autobox,$1_basetype)" +%typemap(jstype) std::vector &VECTOR_VALUE_IN "$typemap(autobox,$1_basetype)" +%typemap(javacode) std::vector %{ + $javaclassname(java.util.Collection<$typemap(autobox,$1_basetype::value_type)> e) { + this.reserve(e.size()); + for($typemap(autobox,$1_basetype::value_type) value : e) { + this.push_back(value); + } + } + public $typemap(autobox,$1_basetype::value_type) get(int idx) { + return get_impl(idx); + } +%} \ No newline at end of file