clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
77 lines
2.6 KiB
C++
77 lines
2.6 KiB
C++
//===- llvm/ADT/STLFunctionalExtras.h - Extras for <functional> -*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains some extension to <functional>.
|
|
//
|
|
// No library is required when using these functions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ADT_STLFUNCTIONALEXTRAS_H
|
|
#define LLVM_ADT_STLFUNCTIONALEXTRAS_H
|
|
|
|
#include "llvm/ADT/STLForwardCompat.h"
|
|
|
|
#include <cstdint>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
namespace llvm {
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Extra additions to <functional>
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// An efficient, type-erasing, non-owning reference to a callable. This is
|
|
/// intended for use as the type of a function parameter that is not used
|
|
/// after the function in question returns.
|
|
///
|
|
/// This class does not own the callable, so it is not in general safe to store
|
|
/// a function_ref.
|
|
template<typename Fn> class function_ref;
|
|
|
|
template<typename Ret, typename ...Params>
|
|
class function_ref<Ret(Params...)> {
|
|
Ret (*callback)(intptr_t callable, Params ...params) = nullptr;
|
|
intptr_t callable;
|
|
|
|
template<typename Callable>
|
|
static Ret callback_fn(intptr_t callable, Params ...params) {
|
|
return (*reinterpret_cast<Callable*>(callable))(
|
|
std::forward<Params>(params)...);
|
|
}
|
|
|
|
public:
|
|
function_ref() = default;
|
|
function_ref(std::nullptr_t) {}
|
|
|
|
template <typename Callable>
|
|
function_ref(
|
|
Callable &&callable,
|
|
// This is not the copy-constructor.
|
|
std::enable_if_t<!std::is_same<remove_cvref_t<Callable>,
|
|
function_ref>::value> * = nullptr,
|
|
// Functor must be callable and return a suitable type.
|
|
std::enable_if_t<std::is_void<Ret>::value ||
|
|
std::is_convertible<decltype(std::declval<Callable>()(
|
|
std::declval<Params>()...)),
|
|
Ret>::value> * = nullptr)
|
|
: callback(callback_fn<std::remove_reference_t<Callable>>),
|
|
callable(reinterpret_cast<intptr_t>(&callable)) {}
|
|
|
|
Ret operator()(Params ...params) const {
|
|
return callback(callable, std::forward<Params>(params)...);
|
|
}
|
|
|
|
explicit operator bool() const { return callback; }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_ADT_STLFUNCTIONALEXTRAS_H
|