diff --git a/include/rngxx.hpp b/include/rngxx.hpp index 6c39f5e..65eba66 100644 --- a/include/rngxx.hpp +++ b/include/rngxx.hpp @@ -59,6 +59,7 @@ struct Random { template struct iterator { //TODO: Implement this in another file (has to be header because of template :/) + //XXX: C++ iterators are absolute jank. This is far harder than it should be. friend class Random; //TODO: Make this work with foreach(), and STL iterator APIs somehow @@ -70,6 +71,15 @@ struct Random inline virtual ~iterator(){} + inline T next() { return _sample(); } + + inline iterator& operator++() { return *this; } + inline iterator& operator++(int) { return *this; } + + inline T operator*() { return next(); } + + friend auto operator<=>(const iterator&, const iterator&) = default; + protected: virtual T _sample() { if (LIKELY(rng)) return rng->next(); else throw ObjectMoved(); } virtual inline void _init() {} @@ -165,7 +175,7 @@ struct Random inline T next(T max); template - inline iterator iter() { return iterator(*this); } //TODO: An iterator that yields `next()` forever. + inline iterator iter() { return iterator(*this); } //TODO: An iterator that yields `next()` forever. template constexpr inline T max_for() const; diff --git a/src/iter.cpp b/src/iter.cpp new file mode 100644 index 0000000..65d5824 --- /dev/null +++ b/src/iter.cpp @@ -0,0 +1,10 @@ +#include + +//XXX: Doing this is not going to work ... +#if 0 +void t(Random& r) +{ + for(auto&& i : r.iter()) (void)i; +} +#endif + diff --git a/src/test/main.c b/src/test/main.c index 3337081..b4e6cf8 100644 --- a/src/test/main.c +++ b/src/test/main.c @@ -6,6 +6,7 @@ #define _RNGXX_INLINE_ONLY #include + static int next(rng_t* rng, const int* min, const int* max) { int output; @@ -68,5 +69,6 @@ int main() printf("\n"); rng_free(engine); + return 0; } diff --git a/src/test/test.cpp b/src/test/test.cpp new file mode 100644 index 0000000..ba1c18e --- /dev/null +++ b/src/test/test.cpp @@ -0,0 +1,17 @@ +#include +#include +#include + +void iter(Random& rng) +{ + for(auto&& i : rng.iter()) + fmt::print("{} ", i); +} + +extern "C" { + void cpp_test() + { + auto random = new rng::crand(100); + iter(random); + } +}