#include <iostream>
#include <functional>
struct protocol_callbacks
{
using func_t = std::function<int(uint8_t*, size_t)>;
protocol_callbacks(func_t a_reader, func_t a_writer) :
reader(a_reader),
writer(a_writer) {}
func_t reader;
func_t writer;
};
int writer(uint8_t*, size_t)
{
std::cout << "function writer\n";
return 0;
}
int reader(uint8_t*, size_t)
{
std::cout << "function writer\n";
return 0;
}
int bad_writer(uint16_t*, size_t) { return 0; }
int main ()
{
int x = 9;
protocol_callbacks pc1(reader, writer);
protocol_callbacks pc2([=](uint8_t*, size_t)
{
std::cout << "lambda reader: " << x << "\n";
return 0;
},
[=](uint8_t*, size_t)
{
std::cout << "lambda writer: " << x << "\n";
return 0;
});
pc1.reader(nullptr, 0);
pc1.writer(nullptr, 0);
pc2.reader(nullptr, 0);
pc2.writer(nullptr, 0);
//protocol_callbacks pc3(bad_writer, reader);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBwcm90b2NvbF9jYWxsYmFja3MKewogICAgdXNpbmcgZnVuY190ID0gc3RkOjpmdW5jdGlvbjxpbnQodWludDhfdCosIHNpemVfdCk+OwoKICAgIHByb3RvY29sX2NhbGxiYWNrcyhmdW5jX3QgYV9yZWFkZXIsIGZ1bmNfdCBhX3dyaXRlcikgOgogICAgICAgIHJlYWRlcihhX3JlYWRlciksCiAgICAgICAgd3JpdGVyKGFfd3JpdGVyKSB7fQogICAgZnVuY190IHJlYWRlcjsKICAgIGZ1bmNfdCB3cml0ZXI7Cn07CgppbnQgd3JpdGVyKHVpbnQ4X3QqLCBzaXplX3QpCnsKICAgIHN0ZDo6Y291dCA8PCAiZnVuY3Rpb24gd3JpdGVyXG4iOwogICAgcmV0dXJuIDA7Cn0KaW50IHJlYWRlcih1aW50OF90Kiwgc2l6ZV90KQp7CiAgICBzdGQ6OmNvdXQgPDwgImZ1bmN0aW9uIHdyaXRlclxuIjsKICAgIHJldHVybiAwOwp9CgppbnQgYmFkX3dyaXRlcih1aW50MTZfdCosIHNpemVfdCkgeyByZXR1cm4gMDsgfQoKaW50IG1haW4gKCkKewogICAgaW50IHggPSA5OwogICAgcHJvdG9jb2xfY2FsbGJhY2tzIHBjMShyZWFkZXIsIHdyaXRlcik7CiAgICBwcm90b2NvbF9jYWxsYmFja3MgcGMyKFs9XSh1aW50OF90Kiwgc2l6ZV90KQogICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImxhbWJkYSByZWFkZXI6ICIgPDwgeCA8PCAiXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XSh1aW50OF90Kiwgc2l6ZV90KQogICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImxhbWJkYSB3cml0ZXI6ICIgPDwgeCA8PCAiXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgIHBjMS5yZWFkZXIobnVsbHB0ciwgMCk7CiAgICBwYzEud3JpdGVyKG51bGxwdHIsIDApOwoKICAgIHBjMi5yZWFkZXIobnVsbHB0ciwgMCk7CiAgICBwYzIud3JpdGVyKG51bGxwdHIsIDApOwogICAgLy9wcm90b2NvbF9jYWxsYmFja3MgcGMzKGJhZF93cml0ZXIsIHJlYWRlcik7Cn0K