#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
#include <iterator>
struct Foo
{
int value;
Foo(int value) : value(value){};
};
struct Bar
{
std::vector<Foo> values;
size_t size_foo() const {return values.size();}
Foo& get_foo(size_t index) {return values[index];}
};
template <typename TOuter, typename TInner> struct ContainerProxy;
template <typename TOuter, typename TInner>
struct ContainerIterator : public std::iterator<std::input_iterator_tag, TInner>
{
typedef std::function<TInner& (TOuter*, size_t)> getfunc_type;
TOuter& mContainerRef;
size_t mIndex;
getfunc_type mGetfunc;
ContainerIterator(TOuter& containerRef, size_t index, getfunc_type const& getFunc)
: mContainerRef(containerRef), mIndex(index), mGetfunc(getFunc)
{
}
TInner& operator*() {return mGetfunc(&mContainerRef, mIndex);}
ContainerIterator<TOuter, TInner>& operator++() {++mIndex; return *this;}
bool operator==(ContainerIterator<TOuter, TInner> const& rhs) const
{
return &mContainerRef==&rhs.mContainerRef &&
mIndex==rhs.mIndex;
}
bool operator!=(ContainerIterator<TOuter, TInner> const& rhs) const
{
return !operator==(rhs);
}
};
template <typename TOuter, typename TInner>
struct ContainerProxy
{
TOuter& mContainerRef;
typedef std::function<size_t (TOuter*)> sizefunc_type;
sizefunc_type mSizefunc;
typedef std::function<TInner& (TOuter*, size_t)> getfunc_type;
getfunc_type mGetfunc;
ContainerProxy(TOuter& containerRef, sizefunc_type sizefunc, getfunc_type getfunc) :
mContainerRef(containerRef), mSizefunc(sizefunc), mGetfunc(getfunc)
{
}
ContainerIterator<TOuter, TInner> begin() const
{
return ContainerIterator<TOuter, TInner>(mContainerRef, 0, mGetfunc);
}
ContainerIterator<TOuter, TInner> end() const
{
return ContainerIterator<TOuter, TInner>(mContainerRef, mSizefunc(&mContainerRef), mGetfunc);
}
};
int main()
{
Bar b;
b.values.push_back(Foo(1));
b.values.push_back(Foo(2));
ContainerProxy<Bar, Foo> proxy(b, &Bar::size_foo, &Bar::get_foo);
std::for_each(proxy.begin(), proxy.end(), [](Foo& f) {std::cout<<f.value<<std::endl;});
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKc3RydWN0IEZvbwp7CiAgIGludCB2YWx1ZTsKICAgRm9vKGludCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSl7fTsKfTsKCnN0cnVjdCBCYXIKewogICAgc3RkOjp2ZWN0b3I8Rm9vPiB2YWx1ZXM7CiAgICBzaXplX3Qgc2l6ZV9mb28oKSBjb25zdCB7cmV0dXJuIHZhbHVlcy5zaXplKCk7fQogICAgRm9vJiBnZXRfZm9vKHNpemVfdCBpbmRleCkge3JldHVybiB2YWx1ZXNbaW5kZXhdO30KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUT3V0ZXIsIHR5cGVuYW1lIFRJbm5lcj4gc3RydWN0IENvbnRhaW5lclByb3h5OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRPdXRlciwgdHlwZW5hbWUgVElubmVyPgpzdHJ1Y3QgQ29udGFpbmVySXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgVElubmVyPgp7CiAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248VElubmVyJiAoVE91dGVyKiwgc2l6ZV90KT4gZ2V0ZnVuY190eXBlOwogICAgVE91dGVyJiBtQ29udGFpbmVyUmVmOwogICAgc2l6ZV90IG1JbmRleDsKICAgIGdldGZ1bmNfdHlwZSBtR2V0ZnVuYzsKCiAgICBDb250YWluZXJJdGVyYXRvcihUT3V0ZXImIGNvbnRhaW5lclJlZiwgc2l6ZV90IGluZGV4LCBnZXRmdW5jX3R5cGUgY29uc3QmIGdldEZ1bmMpCgk6IG1Db250YWluZXJSZWYoY29udGFpbmVyUmVmKSwgbUluZGV4KGluZGV4KSwgbUdldGZ1bmMoZ2V0RnVuYykKICAgIHsKICAgIH0KCiAgICBUSW5uZXImIG9wZXJhdG9yKigpIHtyZXR1cm4gbUdldGZ1bmMoJm1Db250YWluZXJSZWYsIG1JbmRleCk7fQogICAgQ29udGFpbmVySXRlcmF0b3I8VE91dGVyLCBUSW5uZXI+JiBvcGVyYXRvcisrKCkgeysrbUluZGV4OyByZXR1cm4gKnRoaXM7fQoKICAgIGJvb2wgb3BlcmF0b3I9PShDb250YWluZXJJdGVyYXRvcjxUT3V0ZXIsIFRJbm5lcj4gY29uc3QmIHJocykgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gJm1Db250YWluZXJSZWY9PSZyaHMubUNvbnRhaW5lclJlZiAmJgogICAgICAgICAgICAgICBtSW5kZXg9PXJocy5tSW5kZXg7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvciE9KENvbnRhaW5lckl0ZXJhdG9yPFRPdXRlciwgVElubmVyPiBjb25zdCYgcmhzKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaHMpOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRPdXRlciwgdHlwZW5hbWUgVElubmVyPgpzdHJ1Y3QgQ29udGFpbmVyUHJveHkKewogICAgVE91dGVyJiBtQ29udGFpbmVyUmVmOwoKICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxzaXplX3QgKFRPdXRlciopPiBzaXplZnVuY190eXBlOwogICAgc2l6ZWZ1bmNfdHlwZSBtU2l6ZWZ1bmM7CgogICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPFRJbm5lciYgKFRPdXRlciosIHNpemVfdCk+IGdldGZ1bmNfdHlwZTsKICAgIGdldGZ1bmNfdHlwZSBtR2V0ZnVuYzsKCgogICAgQ29udGFpbmVyUHJveHkoVE91dGVyJiBjb250YWluZXJSZWYsIHNpemVmdW5jX3R5cGUgc2l6ZWZ1bmMsIGdldGZ1bmNfdHlwZSBnZXRmdW5jKSA6CiAgICAgICAgbUNvbnRhaW5lclJlZihjb250YWluZXJSZWYpLCBtU2l6ZWZ1bmMoc2l6ZWZ1bmMpLCBtR2V0ZnVuYyhnZXRmdW5jKQogICAgewogICAgfQoKICAgIENvbnRhaW5lckl0ZXJhdG9yPFRPdXRlciwgVElubmVyPiBiZWdpbigpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIENvbnRhaW5lckl0ZXJhdG9yPFRPdXRlciwgVElubmVyPihtQ29udGFpbmVyUmVmLCAwLCBtR2V0ZnVuYyk7CiAgICB9CgogICAgQ29udGFpbmVySXRlcmF0b3I8VE91dGVyLCBUSW5uZXI+IGVuZCgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIENvbnRhaW5lckl0ZXJhdG9yPFRPdXRlciwgVElubmVyPihtQ29udGFpbmVyUmVmLCBtU2l6ZWZ1bmMoJm1Db250YWluZXJSZWYpLCBtR2V0ZnVuYyk7CiAgICB9Cn07CgoKaW50IG1haW4oKQp7CiAgICBCYXIgYjsKICAgIGIudmFsdWVzLnB1c2hfYmFjayhGb28oMSkpOwogICAgYi52YWx1ZXMucHVzaF9iYWNrKEZvbygyKSk7CgogICAgQ29udGFpbmVyUHJveHk8QmFyLCBGb28+IHByb3h5KGIsICZCYXI6OnNpemVfZm9vLCAmQmFyOjpnZXRfZm9vKTsKCiAgICBzdGQ6OmZvcl9lYWNoKHByb3h5LmJlZ2luKCksIHByb3h5LmVuZCgpLCBbXShGb28mIGYpIHtzdGQ6OmNvdXQ8PGYudmFsdWU8PHN0ZDo6ZW5kbDt9KTsKfQ==