#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>
#include <vector>
struct Sender {
template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level send stuff
}
return (end - begin);
}
};
struct Receiver {
template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level receive stuff
}
return (end - begin);
}
};
template<typename Fn>
struct Bar
{
protected:
Fn _fn;
public:
Bar(Fn fn) : _fn(std::move(fn)) { }
template<typename Container>
std::size_t call_fn(Container & container)
{
return _fn(std::begin(container), std::end(container));
}
};
template<typename Fn>
auto create_bar(Fn && fn) -> Bar<typename std::remove_reference<Fn>::type> {
return { std::forward<Fn>(fn) };
}
template<typename Iter>
std::size_t my_foo(Iter begin, Iter end) {
return (end - begin);
}
int main(int argc, char ** argv) {
typedef typename std::vector<int>::iterator iter;
// functors
auto functor = create_bar(Sender());
// lambdas
auto lambda = create_bar([](iter begin, iter end) -> std::size_t { return (end - begin); });
// plain old functions
auto function = create_bar(&my_foo<iter>);
std::vector<int> tmp = { 0, 1, 2, 5};
std::cout << "Functor: " << functor.call_fn(tmp) << std::endl;
std::cout << "Lambda: " << lambda.call_fn(tmp) << std::endl;
std::cout << "Function: " << function.call_fn(tmp) << std::endl;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IFNlbmRlciB7CgogIHRlbXBsYXRlPHR5cGVuYW1lIEl0ZXI+CiAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShJdGVyIGJlZ2luLCBJdGVyIGVuZCkgewogICAgZm9yKEl0ZXIgY3VyID0gYmVnaW47IGN1ciAhPSBlbmQ7ICsrY3VyKSB7CiAgICAgIC8vIHlvdXIgbG93LWxldmVsIHNlbmQgc3R1ZmYKICAgIH0KICAgIHJldHVybiAoZW5kIC0gYmVnaW4pOwogIH0KfTsKCnN0cnVjdCBSZWNlaXZlciB7CgogIHRlbXBsYXRlPHR5cGVuYW1lIEl0ZXI+CiAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShJdGVyIGJlZ2luLCBJdGVyIGVuZCkgewogICAgZm9yKEl0ZXIgY3VyID0gYmVnaW47IGN1ciAhPSBlbmQ7ICsrY3VyKSB7CiAgICAgIC8vIHlvdXIgbG93LWxldmVsIHJlY2VpdmUgc3R1ZmYKICAgIH0KICAgIHJldHVybiAoZW5kIC0gYmVnaW4pOwogIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEZuPgpzdHJ1Y3QgQmFyCnsKcHJvdGVjdGVkOgogIEZuIF9mbjsKcHVibGljOgogIEJhcihGbiBmbikgOiBfZm4oc3RkOjptb3ZlKGZuKSkgeyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lcj4KICBzdGQ6OnNpemVfdCBjYWxsX2ZuKENvbnRhaW5lciAmIGNvbnRhaW5lcikKICB7CiAgICByZXR1cm4gX2ZuKHN0ZDo6YmVnaW4oY29udGFpbmVyKSwgc3RkOjplbmQoY29udGFpbmVyKSk7CiAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRm4+CmF1dG8gY3JlYXRlX2JhcihGbiAmJiBmbikgLT4gQmFyPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxGbj46OnR5cGU+IHsKICByZXR1cm4geyBzdGQ6OmZvcndhcmQ8Rm4+KGZuKSB9Owp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyPgpzdGQ6OnNpemVfdCBteV9mb28oSXRlciBiZWdpbiwgSXRlciBlbmQpIHsKICByZXR1cm4gKGVuZCAtIGJlZ2luKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikgewogIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgaXRlcjsKICAvLyBmdW5jdG9ycwogIGF1dG8gZnVuY3RvciA9IGNyZWF0ZV9iYXIoU2VuZGVyKCkpOwogIC8vIGxhbWJkYXMKICBhdXRvIGxhbWJkYSA9IGNyZWF0ZV9iYXIoW10oaXRlciBiZWdpbiwgaXRlciBlbmQpIC0+IHN0ZDo6c2l6ZV90IHsgcmV0dXJuIChlbmQgLSBiZWdpbik7IH0pOwogIC8vIHBsYWluIG9sZCBmdW5jdGlvbnMKICBhdXRvIGZ1bmN0aW9uID0gY3JlYXRlX2JhcigmbXlfZm9vPGl0ZXI+KTsKICAKICBzdGQ6OnZlY3RvcjxpbnQ+IHRtcCA9IHsgMCwgMSwgMiwgNX07CgogIHN0ZDo6Y291dCA8PCAiRnVuY3RvcjogIiA8PCBmdW5jdG9yLmNhbGxfZm4odG1wKSA8PCBzdGQ6OmVuZGw7CiAgc3RkOjpjb3V0IDw8ICJMYW1iZGE6ICIgPDwgbGFtYmRhLmNhbGxfZm4odG1wKSA8PCBzdGQ6OmVuZGw7CiAgc3RkOjpjb3V0IDw8ICJGdW5jdGlvbjogIiA8PCBmdW5jdGlvbi5jYWxsX2ZuKHRtcCkgPDwgc3RkOjplbmRsOwoKICByZXR1cm4gMDsKfQ==