#include <boost/chrono/chrono.hpp>
#include <boost/type_traits.hpp>
#include <iostream>
#include "clock_name.hpp"
namespace boost {
namespace detail_chrono {
class steady_clock {};
class system_clock {};
}
namespace chrono {
namespace chrono_detail {
using namespace detail_chrono;
struct has_steady_clock {
template< class T > static char sfinae( typename T::rep );
template< class > static int sfinae( ... );
enum { value = sizeof sfinae< steady_clock >( 0 ) == sizeof(char) };
};
struct has_system_clock {
template< class T > static char sfinae( typename T::rep );
template< class > static int sfinae( ... );
enum { value = sizeof sfinae< system_clock >( 0 ) == sizeof(char) };
};
}
struct has_steady_clock
: integral_constant<bool, chrono_detail::has_steady_clock::value> {};
struct has_system_clock
: integral_constant<bool, chrono_detail::has_system_clock::value> {};
}
}
BOOST_STATIC_ASSERT(boost::chrono::has_system_clock::value);
#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
BOOST_STATIC_ASSERT(boost::chrono::has_steady_clock::value);
#else
BOOST_STATIC_ASSERT(!boost::chrono::has_steady_clock::value);
#endif
using namespace boost::chrono;
using namespace boost;
template <typename Clock>
void test_clock()
{
std::cout << "\n"<< name<Clock>::apply() << " test" << std::endl;
{
typename Clock::duration delay = milliseconds(5);
typename Clock::time_point start = Clock::now();
while (Clock::now() - start <= delay)
;
typename Clock::time_point stop = Clock::now();
std::cout << "5 milliseconds paused " << nanoseconds(stop - start).count() << " nanoseconds\n";
}
{
typename Clock::time_point start = Clock::now();
typename Clock::time_point stop;
std::size_t count=1;
while ((stop=Clock::now()) == start) {
++count;
}
std::cout << "After " << count << " trials, elapsed time " << nanoseconds(stop - start).count() << " nanoseconds\n";
start = Clock::now();
for (std::size_t c=count; c>0; --c) {
stop=Clock::now();;
}
std::cout << "After " << count << " trials, elapsed time " << nanoseconds(stop - start).count() << " nanoseconds\n";
}
{
typename Clock::time_point start = Clock::now();
typename Clock::time_point stop = Clock::now();
std::cout << "Resolution estimate: " << nanoseconds(stop-start).count() << " nanoseconds\n";
}
}
void test_system_clock()
{
std::cout << "system_clock test" << std::endl;
chrono::system_clock::duration delay = milliseconds(5);
chrono::system_clock::time_point start = system_clock::now();
while (chrono::system_clock::now() - start <= delay)
;
chrono::system_clock::time_point stop = system_clock::now();
chrono::system_clock::duration elapsed = stop - start;
std::cout << "paused " << nanoseconds(elapsed).count() << " nanoseconds\n";
start = chrono::system_clock::now();
stop = chrono::system_clock::now();
std::cout << "system_clock resolution estimate: " << nanoseconds(stop-start).count() << " nanoseconds\n";
}
void test_steady_clock()
{
#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
std::cout << "steady_clock test" << std::endl;
steady_clock::duration delay = milliseconds(5);
steady_clock::time_point start = steady_clock::now();
while (steady_clock::now() - start <= delay)
;
steady_clock::time_point stop = steady_clock::now();
steady_clock::duration elapsed = stop - start;
std::cout << "paused " << nanoseconds(elapsed).count() << " nanoseconds\n";
start = steady_clock::now();
stop = steady_clock::now();
std::cout << "steady_clock resolution estimate: " << nanoseconds(stop-start).count() << " nanoseconds\n";
#endif
}
void test_hi_resolution_clock()
{
std::cout << "high_resolution_clock test" << std::endl;
high_resolution_clock::duration delay = milliseconds(5);
high_resolution_clock::time_point start = high_resolution_clock::now();
while (high_resolution_clock::now() - start <= delay)
;
high_resolution_clock::time_point stop = high_resolution_clock::now();
high_resolution_clock::duration elapsed = stop - start;
std::cout << "paused " << nanoseconds(elapsed).count() << " nanoseconds\n";
start = high_resolution_clock::now();
stop = high_resolution_clock::now();
std::cout << "high_resolution_clock resolution estimate: " << nanoseconds(stop-start).count() << " nanoseconds\n";
}
int main()
{
test_system_clock();
test_steady_clock();
test_hi_resolution_clock();
test_clock<system_clock>();
#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
test_clock<steady_clock>();
#endif
test_clock<high_resolution_clock>();
return 0;
}