| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 
							- /*
 
-  *  Created by Joachim on 16/04/2019.
 
-  *  Adapted from donated nonius code.
 
-  *
 
-  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 
-  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
-  */
 
- // User-facing chronometer
 
- #ifndef TWOBLUECUBES_CATCH_CHRONOMETER_HPP_INCLUDED
 
- #define TWOBLUECUBES_CATCH_CHRONOMETER_HPP_INCLUDED
 
- #include "catch_clock.hpp"
 
- #include "catch_optimizer.hpp"
 
- #include "detail/catch_complete_invoke.hpp"
 
- #include "../catch_meta.hpp"
 
- namespace Catch {
 
-     namespace Benchmark {
 
-         namespace Detail {
 
-             struct ChronometerConcept {
 
-                 virtual void start() = 0;
 
-                 virtual void finish() = 0;
 
-                 virtual ~ChronometerConcept() = default;
 
-             };
 
-             template <typename Clock>
 
-             struct ChronometerModel final : public ChronometerConcept {
 
-                 void start() override { started = Clock::now(); }
 
-                 void finish() override { finished = Clock::now(); }
 
-                 ClockDuration<Clock> elapsed() const { return finished - started; }
 
-                 TimePoint<Clock> started;
 
-                 TimePoint<Clock> finished;
 
-             };
 
-         } // namespace Detail
 
-         struct Chronometer {
 
-         public:
 
-             template <typename Fun>
 
-             void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); }
 
-             int runs() const { return k; }
 
-             Chronometer(Detail::ChronometerConcept& meter, int k)
 
-                 : impl(&meter)
 
-                 , k(k) {}
 
-         private:
 
-             template <typename Fun>
 
-             void measure(Fun&& fun, std::false_type) {
 
-                 measure([&fun](int) { return fun(); }, std::true_type());
 
-             }
 
-             template <typename Fun>
 
-             void measure(Fun&& fun, std::true_type) {
 
-                 Detail::optimizer_barrier();
 
-                 impl->start();
 
-                 for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i);
 
-                 impl->finish();
 
-                 Detail::optimizer_barrier();
 
-             }
 
-             Detail::ChronometerConcept* impl;
 
-             int k;
 
-         };
 
-     } // namespace Benchmark
 
- } // namespace Catch
 
- #endif // TWOBLUECUBES_CATCH_CHRONOMETER_HPP_INCLUDED
 
 
  |