#include <algorithm>
#include <string>
struct sort_algo {
template <typename It>
void operator()(It f, It l) const { std::sort(f,l); }
};
struct makeheap_algo {
template <typename It>
void operator()(It f, It l) const { std::make_heap(f,l); }
};
struct reverse_algo {
template <typename It>
void operator()(It f, It l) const { std::reverse(f,l); }
};
template <typename It, typename Algo>
void benchmark(It begin, It end, Algo algorithm)
{
for (unsigned long i=0; i < (1ul<<10); ++i)
algorithm(begin, end); // TODO add timing
}
int main()
{
std::string hello = "hello world";
int data[] = { 1, 3, 7, -9, 0 };
benchmark(hello.begin(), hello.end(), sort_algo());
benchmark(hello.begin(), hello.end(), makeheap_algo());
benchmark(hello.begin(), hello.end(), reverse_algo());
benchmark(data, data+5, sort_algo());
benchmark(data, data+5, makeheap_algo());
benchmark(data, data+5, reverse_algo());
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHN0cmluZz4KCnN0cnVjdCBzb3J0X2FsZ28gewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0PgogICAgdm9pZCBvcGVyYXRvcigpKEl0IGYsIEl0IGwpIGNvbnN0IHsgc3RkOjpzb3J0KGYsbCk7IH0KfTsKCnN0cnVjdCBtYWtlaGVhcF9hbGdvIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdD4KICAgIHZvaWQgb3BlcmF0b3IoKShJdCBmLCBJdCBsKSBjb25zdCB7IHN0ZDo6bWFrZV9oZWFwKGYsbCk7IH0KfTsKCnN0cnVjdCByZXZlcnNlX2FsZ28gewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0PgogICAgdm9pZCBvcGVyYXRvcigpKEl0IGYsIEl0IGwpIGNvbnN0IHsgc3RkOjpyZXZlcnNlKGYsbCk7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBJdCwgdHlwZW5hbWUgQWxnbz4KICAgIHZvaWQgYmVuY2htYXJrKEl0IGJlZ2luLCBJdCBlbmQsIEFsZ28gYWxnb3JpdGhtKQp7CiAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaT0wOyBpIDwgKDF1bDw8MTApOyArK2kpCiAgICAgICAgYWxnb3JpdGhtKGJlZ2luLCBlbmQpOyAvLyBUT0RPIGFkZCB0aW1pbmcKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnN0cmluZyBoZWxsbyA9ICJoZWxsbyB3b3JsZCI7CiAgICBpbnQgZGF0YVtdID0geyAxLCAzLCA3LCAtOSwgMCB9OwoKICAgIGJlbmNobWFyayhoZWxsby5iZWdpbigpLCBoZWxsby5lbmQoKSwgc29ydF9hbGdvKCkpOwogICAgYmVuY2htYXJrKGhlbGxvLmJlZ2luKCksIGhlbGxvLmVuZCgpLCBtYWtlaGVhcF9hbGdvKCkpOwogICAgYmVuY2htYXJrKGhlbGxvLmJlZ2luKCksIGhlbGxvLmVuZCgpLCByZXZlcnNlX2FsZ28oKSk7CgogICAgYmVuY2htYXJrKGRhdGEsIGRhdGErNSwgc29ydF9hbGdvKCkpOwogICAgYmVuY2htYXJrKGRhdGEsIGRhdGErNSwgbWFrZWhlYXBfYWxnbygpKTsKICAgIGJlbmNobWFyayhkYXRhLCBkYXRhKzUsIHJldmVyc2VfYWxnbygpKTsKfQo=