#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
template <class F>
class generator{
public:
//typedefs required for iterator-use
typedef typename F::value_type value_type;
typedef typename F::step_type step_type;
typedef value_type * pointer;
typedef value_type & reference;
typedef typename F::size_type size_type;
typedef typename F::difference_type difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
generator(value_type init, step_type step) : t(init), step(step){}
generator<F> &operator++() {
t += step; return *this;
}
generator<F> &
operator+=(size_type n)
{
t += n * step;
return *this;
}
generator<F>
operator+(size_type n)
{
return generator(*this) += n;
}
value_type operator*() const {
return f(t);
}
friend bool operator==(const generator<F> &lhs, const generator<F> &rhs){
return lhs.t == rhs.t;
}
friend bool operator!=(const generator<F> &lhs, const generator<F> &rhs){
return !(lhs == rhs);
}
private:
value_type t;
value_type step;
F f;
};
template <typename T>
struct simple_generator_function
{
typedef T value_type;
typedef T step_type;
typedef T difference_type;
typedef size_t size_type;
};
template <typename T>
struct square_generator : public simple_generator_function<T> {
T operator()(T t) const{
return t * t;
}
};
int main(void) {
using int_sqg = generator<square_generator<int>>;
int_sqg gen(1, 1);
vector<int> v(gen, gen+10);
copy(begin(v), end(v), ostream_iterator<int>(cout, ","));
cout << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2xhc3MgRj4KY2xhc3MgZ2VuZXJhdG9yewpwdWJsaWM6Ci8vdHlwZWRlZnMgcmVxdWlyZWQgZm9yIGl0ZXJhdG9yLXVzZQp0eXBlZGVmIHR5cGVuYW1lIEY6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKdHlwZWRlZiB0eXBlbmFtZSBGOjpzdGVwX3R5cGUgc3RlcF90eXBlOwp0eXBlZGVmIHZhbHVlX3R5cGUgKiBwb2ludGVyOwp0eXBlZGVmIHZhbHVlX3R5cGUgJiByZWZlcmVuY2U7CnR5cGVkZWYgdHlwZW5hbWUgRjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKdHlwZWRlZiB0eXBlbmFtZSBGOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwp0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CgpnZW5lcmF0b3IodmFsdWVfdHlwZSBpbml0LCBzdGVwX3R5cGUgc3RlcCkgOiB0KGluaXQpLCBzdGVwKHN0ZXApe30KCmdlbmVyYXRvcjxGPiAmb3BlcmF0b3IrKygpIHsKICAgIHQgKz0gc3RlcDsgcmV0dXJuICp0aGlzOwp9CgpnZW5lcmF0b3I8Rj4gJgpvcGVyYXRvcis9KHNpemVfdHlwZSBuKQp7CiAgICB0ICs9IG4gKiBzdGVwOwogICAgcmV0dXJuICp0aGlzOwp9CgpnZW5lcmF0b3I8Rj4Kb3BlcmF0b3IrKHNpemVfdHlwZSBuKQp7CiAgICByZXR1cm4gZ2VuZXJhdG9yKCp0aGlzKSArPSBuOwp9Cgp2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKICAgIHJldHVybiBmKHQpOwp9CgpmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGdlbmVyYXRvcjxGPiAmbGhzLCBjb25zdCBnZW5lcmF0b3I8Rj4gJnJocyl7CiAgICAgICAgcmV0dXJuIGxocy50ID09IHJocy50Owp9CmZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZ2VuZXJhdG9yPEY+ICZsaHMsIGNvbnN0IGdlbmVyYXRvcjxGPiAmcmhzKXsKICAgICAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKfQpwcml2YXRlOgogICAgdmFsdWVfdHlwZSB0OwogICAgdmFsdWVfdHlwZSBzdGVwOwogICAgRiBmOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBzdHJ1Y3Qgc2ltcGxlX2dlbmVyYXRvcl9mdW5jdGlvbgogICAgewogICAgICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwogICAgICAgIHR5cGVkZWYgVCBzdGVwX3R5cGU7CiAgICAgICAgdHlwZWRlZiBUIGRpZmZlcmVuY2VfdHlwZTsKICAgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBzcXVhcmVfZ2VuZXJhdG9yIDogcHVibGljIHNpbXBsZV9nZW5lcmF0b3JfZnVuY3Rpb248VD4gewogICAgCiAgICAgICAgVCBvcGVyYXRvcigpKFQgdCkgY29uc3R7CiAgICAgICAgICAgIHJldHVybiB0ICogdDsKICAgICAgICB9CiAgICB9OwoKCmludCBtYWluKHZvaWQpIHsKICAgICAgICB1c2luZyBpbnRfc3FnID0gZ2VuZXJhdG9yPHNxdWFyZV9nZW5lcmF0b3I8aW50Pj47CiAgICAgICAgaW50X3NxZyBnZW4oMSwgMSk7CiAgICAgICAgdmVjdG9yPGludD4gdihnZW4sIGdlbisxMCk7CiAgICAgICAgY29weShiZWdpbih2KSwgZW5kKHYpLCBvc3RyZWFtX2l0ZXJhdG9yPGludD4oY291dCwgIiwiKSk7CiAgICAgICAgY291dCA8PCAnXG4nOwogICAgfQ==
1,4,9,16,25,36,49,64,81,100,