Skip to content

File global_stats.hpp

File List > backends > cxx > include > zmbt > model > global_stats.hpp

Go to the documentation of this file

#ifndef ZMBT_MODEL_GLOBAL_STATS_HPP_
#define ZMBT_MODEL_GLOBAL_STATS_HPP_

#include <atomic>
#include <chrono>
#include <cstdint>

namespace zmbt
{
namespace flags
{

class InjectionTime
{
  public:
    static void add(std::chrono::nanoseconds const duration) noexcept
    {
        counter().fetch_add(static_cast<std::uint64_t>(duration.count()), std::memory_order_relaxed);
    }

    static std::uint64_t value() noexcept
    {
        return counter().load(std::memory_order_relaxed);
    }

    static void reset() noexcept
    {
        counter().store(0, std::memory_order_relaxed);
    }

  private:
    static std::atomic<std::uint64_t>& counter() noexcept
    {
        static auto* accumulator = new std::atomic<std::uint64_t>(0);
        return *accumulator;
    }
};

class RecordingTime
{
  public:
    static void add(std::chrono::nanoseconds const duration) noexcept
    {
        counter().fetch_add(static_cast<std::uint64_t>(duration.count()), std::memory_order_relaxed);
    }

    static std::uint64_t value() noexcept
    {
        return counter().load(std::memory_order_relaxed);
    }

    static void reset() noexcept
    {
        counter().store(0, std::memory_order_relaxed);
    }

  private:
    static std::atomic<std::uint64_t>& counter() noexcept
    {
        static auto* accumulator = new std::atomic<std::uint64_t>(0);
        return *accumulator;
    }
};

class ConversionTime
{
  public:
    static void add(std::chrono::nanoseconds const duration) noexcept
    {
        counter().fetch_add(static_cast<std::uint64_t>(duration.count()), std::memory_order_relaxed);
    }

    static std::uint64_t value() noexcept
    {
        return counter().load(std::memory_order_relaxed);
    }

    static void reset() noexcept
    {
        counter().store(0, std::memory_order_relaxed);
    }

  private:
    static std::atomic<std::uint64_t>& counter() noexcept
    {
        static auto* accumulator = new std::atomic<std::uint64_t>(0);
        return *accumulator;
    }
};

} // namespace flags
} // namespace zmbt

#endif