Moving iterator functionality into nested Java class now.

This commit is contained in:
Alan Woodland 2016-05-31 20:22:39 +01:00
commit 583fdce790

View file

@ -29,13 +29,41 @@
*/ */
%rename(realSize) std::list::size; %rename(realSize) std::list::size;
%nodefaultctor std::list::iterator;
namespace std { namespace std {
template <typename T> class list { template <typename T> class list {
public: public:
struct iterator;
typedef size_t size_type; typedef size_t size_type;
typedef T value_type; typedef T value_type;
typedef T& reference; typedef T& reference;
struct iterator {
%extend {
void set_unchecked(const value_type& v) {
**$self = v;
}
iterator next_unchecked() const {
std::list<T>::iterator ret=*$self;
++ret;
return ret;
}
iterator previous_unchecked() const {
std::list<T>::iterator ret=*$self;
--ret;
return ret;
}
value_type deref_unchecked() const {
return **$self;
}
void advance_unchecked(jint index) {
std::advance(*$self, index);
}
}
};
void assign(size_type n, const value_type &val); void assign(size_type n, const value_type &val);
@ -58,15 +86,11 @@ namespace std {
// 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();
// Only for helping implement listIterator
iterator begin(); iterator begin();
iterator end();
iterator insert(iterator pos, const value_type &v); iterator insert(iterator pos, const value_type &v);
%extend { %extend {
static void set(iterator pos, const value_type& v) {
*pos = v;
}
jint previous_index(const iterator& pos) const { jint previous_index(const iterator& pos) const {
return pos == self->begin() ? -1 : std::distance(self->begin(), static_cast<std::list<T>::const_iterator>(pos)); return pos == self->begin() ? -1 : std::distance(self->begin(), static_cast<std::list<T>::const_iterator>(pos));
} }
@ -75,22 +99,6 @@ namespace std {
return pos == self->end() ? self->size() : std::distance(self->begin(), static_cast<std::list<T>::const_iterator>(pos)); return pos == self->end() ? self->size() : std::distance(self->begin(), static_cast<std::list<T>::const_iterator>(pos));
} }
static iterator next(iterator pos) {
return ++pos;
}
static iterator previous(iterator pos) {
return --pos;
}
static value_type deref(const iterator& pos) {
return *pos;
}
static void advance(iterator& pos, jint index) {
std::advance(pos, index);
}
bool has_next(const iterator& pos) const { bool has_next(const iterator& pos) const {
return pos != $self->end(); return pos != $self->end();
} }
@ -108,7 +116,7 @@ namespace std {
%typemap(javabase) std::list "AbstractSequentialList<$typemap(autobox,$1_basetype::value_type)>" %typemap(javabase) std::list "AbstractSequentialList<$typemap(autobox,$1_basetype::value_type)>"
#define JAVA_VALUE_TYPE $typemap(autobox,$1_basetype::value_type) #define JAVA_VALUE_TYPE $typemap(autobox,$1_basetype::value_type)
#define JAVA_ITERATOR_TYPE $typemap(jstype, $1_basetype::iterator) #define JAVA_ITERATOR_TYPE iterator
%typemap(javacode,noblock=1) std::list { %typemap(javacode,noblock=1) std::list {
public $javaclassname(Collection c) { public $javaclassname(Collection c) {
@ -135,7 +143,7 @@ namespace std {
private ListIterator<JAVA_VALUE_TYPE> init(int index) { private ListIterator<JAVA_VALUE_TYPE> init(int index) {
pos = $javaclassname.this.begin(); pos = $javaclassname.this.begin();
$javaclassname.advance(pos, index); pos.advance_unchecked(index);
return this; return this;
} }
@ -148,7 +156,7 @@ namespace std {
if (null==last) { if (null==last) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
$javaclassname.set(last, v); last.set_unchecked(v);
} }
public void remove() { public void remove() {
@ -172,8 +180,8 @@ namespace std {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
last = pos; last = pos;
pos = $javaclassname.previous(pos); pos = pos.previous_unchecked();
return $javaclassname.deref(last); return last.deref_unchecked();
} }
public JAVA_VALUE_TYPE next() { public JAVA_VALUE_TYPE next() {
@ -181,8 +189,8 @@ namespace std {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
last = pos; last = pos;
pos = $javaclassname.next(pos); pos = pos.next_unchecked();
return $javaclassname.deref(last); return last.deref_unchecked();
} }
public boolean hasPrevious() { public boolean hasPrevious() {