#include <iostream>
#include <vector>
#include <string>
template <typename M, typename T> void process(M&, T&);
template <typename M, typename T>
void process_impl(M& m, const T& t) {
m.write(t);
}
template <typename M, typename T>
void process_impl(M& m, const std::vector<T>& v) {
for (const auto& t: v) {
process(m, t);
}
}
template <typename M, typename T>
void process(M& m, const T& t) {
process_impl(m, t);
}
struct media {
template <typename T> void write(const T& t) { std::cout << t << std::endl; }
};
void process(media& m, const std::string& s) {
process(m, s.size());
}
template <typename M>
struct debug_media {
template <typename T> void write(const T& t) { m.write(t); }
media m;
};
template <typename M, typename T>
void process(debug_media<M>& d, const T& t) {
std::cout << "debug: ";
process(d.m, t);
}
int main() {
{
media m;
process(m, std::vector<std::string>{"1", "22"});
}
{
debug_media<media> m;
process(m, std::vector<std::string>{"1", "22"});
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIE0sIHR5cGVuYW1lIFQ+IHZvaWQgcHJvY2VzcyhNJiwgVCYpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIE0sIHR5cGVuYW1lIFQ+CnZvaWQgcHJvY2Vzc19pbXBsKE0mIG0sIGNvbnN0IFQmIHQpIHsKICBtLndyaXRlKHQpOwp9CnRlbXBsYXRlIDx0eXBlbmFtZSBNLCB0eXBlbmFtZSBUPgp2b2lkIHByb2Nlc3NfaW1wbChNJiBtLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdikgewogIGZvciAoY29uc3QgYXV0byYgdDogdikgewogICAgcHJvY2VzcyhtLCB0KTsKICB9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBNLCB0eXBlbmFtZSBUPgp2b2lkIHByb2Nlc3MoTSYgbSwgY29uc3QgVCYgdCkgewogIHByb2Nlc3NfaW1wbChtLCB0KTsKfQoKc3RydWN0IG1lZGlhIHsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB3cml0ZShjb25zdCBUJiB0KSB7IHN0ZDo6Y291dCA8PCB0IDw8IHN0ZDo6ZW5kbDsgfQp9Owp2b2lkIHByb2Nlc3MobWVkaWEmIG0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CiAgcHJvY2VzcyhtLCBzLnNpemUoKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBNPgpzdHJ1Y3QgZGVidWdfbWVkaWEgewogIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHdyaXRlKGNvbnN0IFQmIHQpIHsgbS53cml0ZSh0KTsgfQoKICBtZWRpYSBtOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgTSwgdHlwZW5hbWUgVD4Kdm9pZCBwcm9jZXNzKGRlYnVnX21lZGlhPE0+JiBkLCBjb25zdCBUJiB0KSB7CiAgc3RkOjpjb3V0IDw8ICJkZWJ1ZzogIjsKICBwcm9jZXNzKGQubSwgdCk7Cn0KCmludCBtYWluKCkgewoJewogICAgCW1lZGlhIG07CiAgICAgICAgcHJvY2VzcyhtLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57IjEiLCAiMjIifSk7Cgl9Cgl7CiAgICAJZGVidWdfbWVkaWE8bWVkaWE+IG07CiAgICAgICAgcHJvY2VzcyhtLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57IjEiLCAiMjIifSk7Cgl9CglyZXR1cm4gMDsKfQ==