#include <iostream>
#include <list>
#include <functional>
#include <type_traits>
using namespace std;
#include <chrono>
#include <iostream>
#include <type_traits>
#include <utility>
// Executes fn with arguments args and returns the time needed
// and the result of f if it is not void
template <class R, class... Args>
auto timer(R (*fn)(Args...), Args... args)
-> std::pair<double, R> {
static_assert(!std::is_void<decltype(fn(args...))>::value,
"Call timer_void if return type is void!");
auto start = std::chrono::high_resolution_clock::now();
auto ret = fn(args...);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
return { elapsed_seconds.count(), ret };
}
// If fn returns void, only the time is returned
template < class... Args>
auto timer(void (*fn)(Args...), Args... args)
-> double {
static_assert(std::is_void<decltype(fn(args...))>::value,
"Call timer for non void return type");
auto start = std::chrono::high_resolution_clock::now();
fn(args...);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
return elapsed_seconds.count();
}
int func1()
{
cout << "F1" << endl;
}
void func2()
{
cout << "F2" << endl;
}
int main () {
timer(func1);
timer(func2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPHV0aWxpdHk+CgovLyBFeGVjdXRlcyBmbiB3aXRoIGFyZ3VtZW50cyBhcmdzIGFuZCByZXR1cm5zIHRoZSB0aW1lIG5lZWRlZAovLyBhbmQgdGhlIHJlc3VsdCBvZiBmIGlmIGl0IGlzIG5vdCB2b2lkCnRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcy4uLiBBcmdzPgphdXRvIHRpbWVyKFIgKCpmbikoQXJncy4uLiksIEFyZ3MuLi4gYXJncykKICAgIC0+IHN0ZDo6cGFpcjxkb3VibGUsIFI+IHsKICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3ZvaWQ8ZGVjbHR5cGUoZm4oYXJncy4uLikpPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAiQ2FsbCB0aW1lcl92b2lkIGlmIHJldHVybiB0eXBlIGlzIHZvaWQhIik7CiAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIGF1dG8gcmV0ID0gZm4oYXJncy4uLik7CiAgYXV0byBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICByZXR1cm4geyBlbGFwc2VkX3NlY29uZHMuY291bnQoKSwgcmV0IH07Cn0KCi8vIElmIGZuIHJldHVybnMgdm9pZCwgb25seSB0aGUgdGltZSBpcyByZXR1cm5lZAp0ZW1wbGF0ZSA8IGNsYXNzLi4uIEFyZ3M+CmF1dG8gdGltZXIodm9pZCAoKmZuKShBcmdzLi4uKSwgQXJncy4uLiBhcmdzKQogICAgLT4gZG91YmxlIHsKICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdm9pZDxkZWNsdHlwZShmbihhcmdzLi4uKSk+Ojp2YWx1ZSwKICAgICAgICAgICAgICAgICJDYWxsIHRpbWVyIGZvciBub24gdm9pZCByZXR1cm4gdHlwZSIpOwogIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICBmbihhcmdzLi4uKTsKICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OwogIHJldHVybiBlbGFwc2VkX3NlY29uZHMuY291bnQoKTsKfQoKaW50IGZ1bmMxKCkKewogICAgY291dCA8PCAiRjEiIDw8IGVuZGw7Cn0KCnZvaWQgZnVuYzIoKQp7CiAgICBjb3V0IDw8ICJGMiIgPDwgZW5kbDsKfQoKaW50IG1haW4gKCkgewogICAgCiAgICB0aW1lcihmdW5jMSk7CiAgICAKICAgIHRpbWVyKGZ1bmMyKTsKCn0=