diff options
author | Andres Noetzli <andres.noetzli@gmail.com> | 2019-05-16 00:18:48 +0000 |
---|---|---|
committer | Aina Niemetz <aina.niemetz@gmail.com> | 2019-05-15 17:18:48 -0700 |
commit | 62d361071ea54c9b7cba882313ab4dedef6f1286 (patch) | |
tree | 2e721a2fb77769a2824955a2b47fdf8b86203da3 /src/smt | |
parent | fc8907afc08d7b418471a537f9c23e9964df82df (diff) |
Fix iterators in Java API (#3000)
Fixes #2989. SWIG 3 seems to have an issue properly resolving
`T::const_iterator::value_type` if that type itself is a `typedef`.
This is for example the case in the `UnsatCore` class, which `typedef`s
`const_iterator` to `std::vector<Expr>::const_iterator`. As a
workaround, this commit changes the `JavaIteratorAdapter` class to take
two template parameters, one of which is the `value_type`. The commit
also adds a compile-time assertion that `T::const_iterator::value_type`
can be converted to `value_type` to avoid nasty surprises. A nice
side-effect of this solution is that explicit `typemap`s are not
necessary anymore, so they are removed. Additionally, the commit adds a
`toString()` method for the Java API of `UnsatCore` and adds examples
that show and test the iteration over the unsat core and the statistics.
Iterating over `Statistics` now returns instances of `Statistic` instead
of `Object[]`, which is a bit cleaner and requires less glue code.
Diffstat (limited to 'src/smt')
-rw-r--r-- | src/smt/command.i | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/smt/command.i b/src/smt/command.i index 32bda7bba..ff8094165 100644 --- a/src/smt/command.i +++ b/src/smt/command.i @@ -28,8 +28,10 @@ %ignore CVC4::CommandSequence::begin() const; %ignore CVC4::CommandSequence::end() const; %extend CVC4::CommandSequence { - CVC4::JavaIteratorAdapter<CVC4::CommandSequence> iterator() { - return CVC4::JavaIteratorAdapter<CVC4::CommandSequence>(*$self); + CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*> iterator() + { + return CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*>( + *$self); } } @@ -37,10 +39,10 @@ %typemap(javainterfaces) CVC4::CommandSequence "java.lang.Iterable<edu.nyu.acsys.CVC4.Command>"; // the JavaIteratorAdapter should not be public, and implements Iterator -%typemap(javaclassmodifiers) CVC4::JavaIteratorAdapter<CVC4::CommandSequence> "class"; -%typemap(javainterfaces) CVC4::JavaIteratorAdapter<CVC4::CommandSequence> "java.util.Iterator<edu.nyu.acsys.CVC4.Command>"; +%typemap(javaclassmodifiers) CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*> "class"; +%typemap(javainterfaces) CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*> "java.util.Iterator<edu.nyu.acsys.CVC4.Command>"; // 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::CommandSequence> " +%typemap(javacode) CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*> " public void remove() { throw new java.lang.UnsupportedOperationException(); } @@ -54,13 +56,7 @@ } " // getNext() just allows C++ iterator access from Java-side next(), make it private -%javamethodmodifiers CVC4::JavaIteratorAdapter<CVC4::CommandSequence>::getNext() "private"; - -// map the types appropriately -%typemap(jni) CVC4::CommandSequence::const_iterator::value_type "jobject"; -%typemap(jtype) CVC4::CommandSequence::const_iterator::value_type "edu.nyu.acsys.CVC4.Command"; -%typemap(jstype) CVC4::CommandSequence::const_iterator::value_type "edu.nyu.acsys.CVC4.Command"; -%typemap(javaout) CVC4::CommandSequence::const_iterator::value_type { return $jnicall; } +%javamethodmodifiers CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*>::getNext() "private"; #endif /* SWIGJAVA */ @@ -71,6 +67,6 @@ %include "bindings/java_iterator_adapter.h" %include "bindings/java_stream_adapters.h" -%template(JavaIteratorAdapter_CommandSequence) CVC4::JavaIteratorAdapter<CVC4::CommandSequence>; +%template(JavaIteratorAdapter_CommandSequence) CVC4::JavaIteratorAdapter<CVC4::CommandSequence, CVC4::Command*>; #endif /* SWIGJAVA */ |