diff options
Diffstat (limited to 'src/expr/expr.i')
-rw-r--r-- | src/expr/expr.i | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/expr/expr.i b/src/expr/expr.i index 34f074a6d..92ab517b1 100644 --- a/src/expr/expr.i +++ b/src/expr/expr.i @@ -1,5 +1,12 @@ %{ #include "expr/expr.h" + +#ifdef SWIGJAVA + +#include "bindings/java_iterator_adapter.h" +#include "bindings/java_stream_adapters.h" + +#endif /* SWIGJAVA */ %} %rename(apply) CVC4::ExprHashFunction::operator()(CVC4::Expr) const; @@ -29,6 +36,44 @@ namespace CVC4 { }/* CVC4::expr namespace */ }/* CVC4 namespace */ +#ifdef SWIGJAVA + +// Instead of Expr::begin() and end(), create an +// iterator() method on the Java side that returns a Java-style +// Iterator. +%ignore CVC4::Expr::begin() const; +%ignore CVC4::Expr::end() const; +%extend CVC4::Expr { + CVC4::JavaIteratorAdapter<CVC4::Expr> iterator() { + return CVC4::JavaIteratorAdapter<CVC4::Expr>(*$self); + } +} + +// Expr is "iterable" on the Java side +%typemap(javainterfaces) CVC4::Expr "java.lang.Iterable<edu.nyu.acsys.CVC4.Expr>"; + +// the JavaIteratorAdapter should not be public, and implements Iterator +%typemap(javaclassmodifiers) CVC4::JavaIteratorAdapter<CVC4::Expr> "class"; +%typemap(javainterfaces) CVC4::JavaIteratorAdapter<CVC4::Expr> "java.util.Iterator<edu.nyu.acsys.CVC4.Expr>"; +// add some functions to the Java side (do it here because there's no way to do these in C++) +%typemap(javacode) CVC4::JavaIteratorAdapter<CVC4::Expr> " + public void remove() { + throw new java.lang.UnsupportedOperationException(); + } + + public edu.nyu.acsys.CVC4.Expr 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<CVC4::Expr>::getNext() "private"; + +#endif /* SWIGJAVA */ + %include "expr/expr.h" %template(getConstTypeConstant) CVC4::Expr::getConst<CVC4::TypeConstant>; @@ -52,4 +97,13 @@ namespace CVC4 { %template(getConstString) CVC4::Expr::getConst<std::string>; %template(getConstBoolean) CVC4::Expr::getConst<bool>; +#ifdef SWIGJAVA + +%include "bindings/java_iterator_adapter.h" +%include "bindings/java_stream_adapters.h" + +%template(JavaIteratorAdapter_Expr) CVC4::JavaIteratorAdapter<CVC4::Expr>; + +#endif /* SWIGJAVA */ + %include "expr/expr.h" |