Skip to content

File HoverIndexBudget.hpp

File List > internal > HoverIndexBudget.hpp

Go to the documentation of this file

//
// SPDX-FileCopyrightText: 2026 Michal Grabarczyk
// SPDX-License-Identifier: GPL-3.0-only WITH Universal-FOSS-exception-1.0
//
// This file is also available under a separate commercial license.
// See COMMERCIAL-LICENSING.md for contact information.
//
#pragma once

#include <chrono>
#include <utility>

namespace QAccelPlot::Internal {

class HoverIndexBudget {
public:
    using CostPerRecord = std::chrono::duration<double, std::nano>;

    explicit HoverIndexBudget(CostPerRecord assumedBuildCostPerRecord);

    void reset();
    bool buildDue(int recordCount) const;
    void addScan(std::chrono::nanoseconds duration);
    void addBuild(std::chrono::nanoseconds duration, int recordCount);

    template <typename Scan> auto timeScan(Scan&& scan)
    {
        const auto start = std::chrono::steady_clock::now();
        auto result = std::forward<Scan>(scan)();
        addScan(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - start));
        return result;
    }

    template <typename Build> void timeBuild(const int recordCount, Build&& build)
    {
        const auto start = std::chrono::steady_clock::now();
        std::forward<Build>(build)();
        addBuild(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - start), recordCount);
    }

private:
    CostPerRecord buildCostPerRecord_;
    std::chrono::nanoseconds scanCost_{0};
};

} // namespace QAccelPlot::Internal