#include <iterator> // for std::begin/std::end
#include <utility> // for std::declval
template<class Iter>
class java_iter_wrapper
{
public:
typedef typename std::iterator_traits<Iter>::value_type value_type;
typedef typename std::iterator_traits<Iter>::reference reference;
java_iter_wrapper(Iter b, Iter e)
: beg_(b), end_(e)
{}
bool hasNext() const {return beg_!=end_;}
reference next() {return *beg_++;}
private:
Iter beg_, end_;
};
namespace jih { // java iterator helper
using std::begin;
using std::end;
template<class Container>
using CppIterOf = decltype(begin(std::declval<Container&>()));
}
template<class Container>
java_iter_wrapper<jih::CppIterOf<Container>> get_java_iter(Container& c)
{
using std::begin;
using std::end;
return java_iter_wrapper<jih::CppIterOf<Container>>(begin(c),end(c));
}
// ---- Anwendungsbeispiel ----
#include <iostream>
#include <vector>
int main()
{
using namespace std;
vector<int> foo = {2,3,5,7};
auto jit = get_java_iter(foo);
while (jit.hasNext()) {
int z = jit.next();
cout << z << endl;
}
}
I2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBmb3Igc3RkOjpiZWdpbi9zdGQ6OmVuZAojaW5jbHVkZSA8dXRpbGl0eT4gIC8vIGZvciBzdGQ6OmRlY2x2YWwKCnRlbXBsYXRlPGNsYXNzIEl0ZXI+CmNsYXNzIGphdmFfaXRlcl93cmFwcGVyCnsKcHVibGljOgogICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKCiAgICBqYXZhX2l0ZXJfd3JhcHBlcihJdGVyIGIsIEl0ZXIgZSkKICAgIDogYmVnXyhiKSwgZW5kXyhlKQogICAge30KCiAgICBib29sIGhhc05leHQoKSBjb25zdCB7cmV0dXJuIGJlZ18hPWVuZF87fQoKICAgIHJlZmVyZW5jZSBuZXh0KCkge3JldHVybiAqYmVnXysrO30KCnByaXZhdGU6CiAgICBJdGVyIGJlZ18sIGVuZF87Cn07CgpuYW1lc3BhY2UgamloIHsgLy8gamF2YSBpdGVyYXRvciBoZWxwZXIKICAgIHVzaW5nIHN0ZDo6YmVnaW47CiAgICB1c2luZyBzdGQ6OmVuZDsKCiAgICB0ZW1wbGF0ZTxjbGFzcyBDb250YWluZXI+CiAgICB1c2luZyBDcHBJdGVyT2YgPSBkZWNsdHlwZShiZWdpbihzdGQ6OmRlY2x2YWw8Q29udGFpbmVyJj4oKSkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBDb250YWluZXI+CmphdmFfaXRlcl93cmFwcGVyPGppaDo6Q3BwSXRlck9mPENvbnRhaW5lcj4+IGdldF9qYXZhX2l0ZXIoQ29udGFpbmVyJiBjKQp7CiAgICB1c2luZyBzdGQ6OmJlZ2luOwogICAgdXNpbmcgc3RkOjplbmQ7CiAgICByZXR1cm4gamF2YV9pdGVyX3dyYXBwZXI8amloOjpDcHBJdGVyT2Y8Q29udGFpbmVyPj4oYmVnaW4oYyksZW5kKGMpKTsKfQoKLy8gLS0tLSBBbndlbmR1bmdzYmVpc3BpZWwgLS0tLQoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKaW50IG1haW4oKQp7CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgdmVjdG9yPGludD4gZm9vID0gezIsMyw1LDd9OwogICAgYXV0byBqaXQgPSBnZXRfamF2YV9pdGVyKGZvbyk7CiAgICB3aGlsZSAoaml0Lmhhc05leHQoKSkgewogICAgICAgIGludCB6ID0gaml0Lm5leHQoKTsKICAgICAgICBjb3V0IDw8IHogPDwgZW5kbDsKICAgIH0KfQo=