#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
namespace mtl {
template <typename ForwardIterator, typename U>
std::vector<U> map(std::function<U(typename ForwardIterator::value_type)> fn,
const ForwardIterator &input) {
std::vector<U> output;
std::transform(input.cbegin(), input.cend(), std::back_inserter(output), fn);
return std::move(output);
}
template <typename ForwardIterator, typename U>
std::vector<U> map(U (*fn)(typename ForwardIterator::value_type),
const ForwardIterator &input) {
std::function<U(typename ForwardIterator::value_type)> std_fn = fn;
return map(std_fn, input);
}
} // namespace mtl
float example_fn(int x) { return x * x; }
std::vector<int> input() { return std::vector<int>({1, 2, 3, 4}); }
std::vector<float> try_free_fn() { return mtl::map(example_fn, input()); }
std::vector<float> try_std_fn() {
return mtl::map(std::function<float(int)>(example_fn), input());
}
std::vector<float> try_lambda() {
return mtl::map(+[](int x) -> float { return x * x; }, input());
}
template <typename U>
U call(U(*fn)()) {
return fn();
}
int one() {
return 1;
}
int try_call() {
return call(+[]() -> int { return 0; });
}
int main(int argc, char** argv) {
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPHZlY3Rvcj4KCm5hbWVzcGFjZSBtdGwgewoKdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgVT4Kc3RkOjp2ZWN0b3I8VT4gbWFwKHN0ZDo6ZnVuY3Rpb248VSh0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I6OnZhbHVlX3R5cGUpPiBmbiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcndhcmRJdGVyYXRvciAmaW5wdXQpIHsKICBzdGQ6OnZlY3RvcjxVPiBvdXRwdXQ7CiAgc3RkOjp0cmFuc2Zvcm0oaW5wdXQuY2JlZ2luKCksIGlucHV0LmNlbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKG91dHB1dCksIGZuKTsKICByZXR1cm4gc3RkOjptb3ZlKG91dHB1dCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIFU+CnN0ZDo6dmVjdG9yPFU+IG1hcChVICgqZm4pKHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcjo6dmFsdWVfdHlwZSksCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IgJmlucHV0KSB7CiAgc3RkOjpmdW5jdGlvbjxVKHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcjo6dmFsdWVfdHlwZSk+IHN0ZF9mbiA9IGZuOwogIHJldHVybiBtYXAoc3RkX2ZuLCBpbnB1dCk7Cn0KCn0gLy8gbmFtZXNwYWNlIG10bAoKZmxvYXQgZXhhbXBsZV9mbihpbnQgeCkgeyByZXR1cm4geCAqIHg7IH0KCnN0ZDo6dmVjdG9yPGludD4gaW5wdXQoKSB7IHJldHVybiBzdGQ6OnZlY3RvcjxpbnQ+KHsxLCAyLCAzLCA0fSk7IH0KCnN0ZDo6dmVjdG9yPGZsb2F0PiB0cnlfZnJlZV9mbigpIHsgcmV0dXJuIG10bDo6bWFwKGV4YW1wbGVfZm4sIGlucHV0KCkpOyB9CgpzdGQ6OnZlY3RvcjxmbG9hdD4gdHJ5X3N0ZF9mbigpIHsKICByZXR1cm4gbXRsOjptYXAoc3RkOjpmdW5jdGlvbjxmbG9hdChpbnQpPihleGFtcGxlX2ZuKSwgaW5wdXQoKSk7Cn0KCnN0ZDo6dmVjdG9yPGZsb2F0PiB0cnlfbGFtYmRhKCkgewogIHJldHVybiBtdGw6Om1hcCgrW10oaW50IHgpIC0+IGZsb2F0IHsgcmV0dXJuIHggKiB4OyB9LCBpbnB1dCgpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFU+ClUgY2FsbChVKCpmbikoKSkgewogIHJldHVybiBmbigpOwp9CgppbnQgb25lKCkgewogIHJldHVybiAxOwp9CgppbnQgdHJ5X2NhbGwoKSB7CiAgcmV0dXJuIGNhbGwoK1tdKCkgLT4gaW50IHsgcmV0dXJuIDA7IH0pOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKCQp9