summaryrefslogtreecommitdiff
path: root/src/bindings/java_iterator_adapter.i
diff options
context:
space:
mode:
Diffstat (limited to 'src/bindings/java_iterator_adapter.i')
-rw-r--r--src/bindings/java_iterator_adapter.i75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/bindings/java_iterator_adapter.i b/src/bindings/java_iterator_adapter.i
new file mode 100644
index 000000000..5f814edd7
--- /dev/null
+++ b/src/bindings/java_iterator_adapter.i
@@ -0,0 +1,75 @@
+%{
+#include "bindings/java_iterator_adapter.h"
+%}
+
+#ifdef SWIGJAVA
+
+%define SWIG_JAVA_ITERATOR_ADAPTER(TTYPE, VTYPE)
+
+%typemap(javabody) CVC4::JavaIteratorAdapter %{
+ private long swigCPtr;
+ protected boolean swigCMemOwn;
+ private ExprManager em;
+
+ protected $javaclassname(ExprManager em, long cPtr, boolean cMemoryOwn) {
+ swigCMemOwn = cMemoryOwn;
+ swigCPtr = cPtr;
+ this.em = em;
+ }
+
+ public $javaclassname(ExprManager em, $typemap(jstype, TTYPE) t) {
+ this(t);
+ this.em = em;
+ }
+
+ protected static long getCPtr($javaclassname obj) {
+ return (obj == null) ? 0 : obj.swigCPtr;
+ }
+%}
+
+// Workaround for https://github.com/swig/swig/commit/63a5a8af88271559a7b170794b4c61c30b8934ea
+%typemap(javaconstruct) JavaIteratorAdapter<TTYPE, VTYPE> {
+ this(null, $imcall, true);
+}
+
+%typemap(javaconstruct) CVC4::JavaIteratorAdapter<TTYPE, VTYPE> {
+ this(null, $imcall, true);
+}
+
+%feature("valuewrapper") CVC4::JavaIteratorAdapter<TTYPE, VTYPE>;
+
+// the JavaIteratorAdapter should not be public, and implements Iterator
+%typemap(javaclassmodifiers) CVC4::JavaIteratorAdapter<TTYPE, VTYPE> "class";
+%typemap(javainterfaces) CVC4::JavaIteratorAdapter< TTYPE, VTYPE > "java.util.Iterator<$typemap(jstype, VTYPE)>";
+
+// add some functions to the Java side (do it here because there's no way to do these in C++)
+%typemap(javacode) CVC4::JavaIteratorAdapter<TTYPE, VTYPE> "
+ public void remove() {
+ throw new java.lang.UnsupportedOperationException();
+ }
+
+ public $typemap(jstype, VTYPE) next() {
+ if(hasNext()) {
+ return getNext();
+ } else {
+ throw new java.util.NoSuchElementException();
+ }
+ }
+"
+
+// getNext() just allows C++ iterator access from Java-side next(), make it private
+%javamethodmodifiers CVC4::JavaIteratorAdapter<TTYPE, VTYPE>::getNext() "private";
+
+%javamethodmodifiers CVC4::JavaIteratorAdapter<TTYPE, VTYPE>::JavaIteratorAdapter(const TTYPE& t) "private";
+
+%enddef
+
+%include "bindings/java_iterator_adapter.h"
+
+namespace CVC4 {
+ template<class T, class V> class JavaIteratorAdapter {
+ SWIG_JAVA_ITERATOR_ADAPTER(T, V)
+ };
+}
+
+#endif
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback