Skip to content

Simple stopwatch implementation with optional callback on destructor

License

Notifications You must be signed in to change notification settings

SiddiqSoft/TimeThis

Repository files navigation

TimeThis : Simple stopwatch for scope

CodeQL CMake Build Status

Objective

Provide for a simple utility class where we can time the operation of a code block and allow the time to be updated in an optional lambda.

auto handleHTTPMessage(auto req)
{
    if( req == HTTP_GET )
    {
        if( req == "/v1/something" )
        {
            // Consider the scenario where we would like to inform
            // the client time taken.
            auto     resp= createResponse();
            // Declaration of the lambda takes the resp object
            // and sets the header and logs to our global logger
            TimeThis tt{ [&g_logger,&resp](const auto& delta) {
                            auto ttx= std::chrono::duration_cast<milliseconds>(tt.elapsed());
                            // Set the diagnostic header
                            resp->addHeader("X-Diagnostic-Time", std::to_string(ttx.count()) );
                            // Log this response
                            g_logger->debug("Processing /v1/something took {}ms", ttx );
                        }
                     }; // notes the call function and starts the stopwatch
            // Some other work..Perhaps lookup db, etc.
            ..
            ..
            resp= ...; // set the body
            return resp;
        }
    }
}
  • Support formatter for std::format when available
  • Support use of std::source_location when available
  • Simple "api" where all of your work is in your lambda

Usage

#include "gtest/gtest.h"
#include "siddiqsoft/TimeThis.hpp"


TEST(examples, Example1)
{
    bool passTest {false};

    try
    {
        // Use initializer list-style instantiation; we do not allow move/assignment construction.
        // Note that the `()` is not required when the lambda/function takes no argument.
        siddiqsoft::TimeThis tt {[&passTest] {
            // Runs when this scope ends
            passTest = true;
        }};

        auto timeTaken= tt.elapsed();
    }
    catch (...) {
        EXPECT_TRUE(false); // if we throw then the test fails.
    }

    // Iff the lambda runs, it should be true
    EXPECT_TRUE(passTest);
}

© 2021 Siddiq Software LLC. All rights reserved.