Files
TheRock/compiler/amd-llvm/libcxx/test/support/invocable_with_telemetry.h
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

90 lines
2.7 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef TEST_SUPPORT_INVOCABLE_WITH_TELEMETRY_H
#define TEST_SUPPORT_INVOCABLE_WITH_TELEMETRY_H
#include <cassert>
#include <concepts>
#include <functional>
#include <utility>
#if TEST_STD_VER < 20
# error invocable_with_telemetry requires C++20
#else
struct invocable_telemetry {
int invocations;
int moves;
int copies;
};
template <class F>
class invocable_with_telemetry {
public:
constexpr invocable_with_telemetry(F f, invocable_telemetry& telemetry) : f_(f), telemetry_(&telemetry) {}
constexpr invocable_with_telemetry(invocable_with_telemetry&& other)
requires std::move_constructible<F>
: f_(std::move(other.f_)),
telemetry_((assert(other.telemetry_ != nullptr), std::exchange(other.telemetry_, nullptr))) {
++telemetry_->moves;
}
constexpr invocable_with_telemetry(invocable_with_telemetry const& other)
requires std::copy_constructible<F>
: f_(other.f_), telemetry_((assert(other.telemetry_ != nullptr), other.telemetry_)) {
++telemetry_->copies;
}
constexpr invocable_with_telemetry& operator=(invocable_with_telemetry&& other)
requires std::movable<F>
{
// Not using move-and-swap idiom to ensure that copies and moves remain accurate.
assert(&other != this);
assert(other.telemetry_ != nullptr);
f_ = std::move(other.f_);
telemetry_ = std::exchange(other.telemetry_, nullptr);
++telemetry_->moves;
return *this;
}
constexpr invocable_with_telemetry& operator=(invocable_with_telemetry const& other)
requires std::copyable<F>
{
// Not using copy-and-swap idiom to ensure that copies and moves remain accurate.
assert(&other != this);
assert(other.telemetry_ != nullptr);
f_ = other.f_;
telemetry_ = other.telemetry_;
++telemetry_->copies;
return *this;
}
template <class... Args>
requires std::invocable<F&, Args...>
constexpr decltype(auto) operator()(Args&&... args) noexcept(std::is_nothrow_invocable_v<F&, Args...>) {
assert(telemetry_);
++telemetry_->invocations;
return std::invoke(f_, std::forward<Args>(args)...);
}
private:
F f_ = F();
invocable_telemetry* telemetry_ = nullptr;
};
template <class F>
invocable_with_telemetry(F f, int& invocations, int& moves, int& copies) -> invocable_with_telemetry<F>;
#endif // TEST_STD_VER < 20
#endif // TEST_SUPPORT_INVOCABLE_WITH_TELEMETRY_H