Added a best case workaround for std::list::size_type vs jint problem. There's a bit of commentry added around it too for clarity.
This commit is contained in:
parent
9ade17cc50
commit
e561a78205
1 changed files with 22 additions and 3 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
|
%include <std_common.i>
|
||||||
%include <autobox.i>
|
%include <autobox.i>
|
||||||
%include <stdint.i>
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
@ -17,6 +17,18 @@
|
||||||
%javamethodmodifiers std::list::advance "private";
|
%javamethodmodifiers std::list::advance "private";
|
||||||
%javamethodmodifiers std::list::has_next "private";
|
%javamethodmodifiers std::list::has_next "private";
|
||||||
|
|
||||||
|
/*
|
||||||
|
To conform to Java Collection interface we must return int from size().
|
||||||
|
Unfortunately that loses precision from the integer types commonly used in
|
||||||
|
C++ implementations. Since we can't overload on return values the best
|
||||||
|
workaround here is to expose the real C++ size() return value to Java as a
|
||||||
|
long under a different name. We can then wrap that with a Java specific
|
||||||
|
size() implementation that at least checks and fails gracefully in the case
|
||||||
|
where we have a collection with > 2^31-1 items rather than failing
|
||||||
|
mysteriously. The wrapper implementaiton is in the javacode typemap later.
|
||||||
|
*/
|
||||||
|
%rename(realSize) std::list::size;
|
||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
template <typename T> class list {
|
template <typename T> class list {
|
||||||
public:
|
public:
|
||||||
|
|
@ -41,8 +53,7 @@ namespace std {
|
||||||
void push_back(const value_type &x);
|
void push_back(const value_type &x);
|
||||||
void push_front(const value_type &x);
|
void push_front(const value_type &x);
|
||||||
|
|
||||||
// Possible bug: jint != size_type
|
size_type size() const;
|
||||||
jint size () const;
|
|
||||||
|
|
||||||
// Although sort() is nice it makes operator<() mandatory which it probably shouldn't be
|
// Although sort() is nice it makes operator<() mandatory which it probably shouldn't be
|
||||||
//void sort();
|
//void sort();
|
||||||
|
|
@ -109,6 +120,14 @@ namespace std {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int size() {
|
||||||
|
final long val = realSize();
|
||||||
|
if (val > Integer.MAX_VALUE) {
|
||||||
|
throw new IndexOutOfBoundsException("Size of Collection $javaclassname is not representable as int");
|
||||||
|
}
|
||||||
|
return (int)val;
|
||||||
|
}
|
||||||
|
|
||||||
public ListIterator<JAVA_VALUE_TYPE> listIterator(int index) {
|
public ListIterator<JAVA_VALUE_TYPE> listIterator(int index) {
|
||||||
return new ListIterator<JAVA_VALUE_TYPE>() {
|
return new ListIterator<JAVA_VALUE_TYPE>() {
|
||||||
private JAVA_ITERATOR_TYPE pos;
|
private JAVA_ITERATOR_TYPE pos;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue