From 98b8218afdb00497a0d4373a6023e04686d1e559 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Wed, 21 Oct 2026 15:37:09 +0800 Subject: [ADT] Add function_ref to ADT Signed-off-by: Richard Qin --- rcc/include/rcc/ADT/STLFunctionalExtras.h | 112 ++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 rcc/include/rcc/ADT/STLFunctionalExtras.h (limited to 'rcc') diff --git a/rcc/include/rcc/ADT/STLFunctionalExtras.h b/rcc/include/rcc/ADT/STLFunctionalExtras.h new file mode 100644 index 0000000..71a5b85 --- /dev/null +++ b/rcc/include/rcc/ADT/STLFunctionalExtras.h @@ -0,0 +1,112 @@ +/* + R *CC-Project + + Copyright (C) 2026 Richard Qin + + This file is part of RCC-Project. + + RCC-Project is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your option) any + later version. + + RCC-Project is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + RCC-Project; see the file COPYING. If not see + . + */ + +//===- llvm/ADT/STLFunctionalExtras.h - Extras for -*- 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 . +// +// No library is required when using these functions. +// +//===----------------------------------------------------------------------===// + +#ifndef RCC_ADT_STLFUNCTIONALEXTRAS_H +#define RCC_ADT_STLFUNCTIONALEXTRAS_H + +#include "rcc/Support/Compiler.h" + +#include +#include +#include + +namespace rcc +{ + +//===----------------------------------------------------------------------===// +// Extra additions to +//===----------------------------------------------------------------------===// + +/// 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 class function_ref; + +template +class RCC_GSL_POINTER function_ref +{ + Ret (*callback) (intptr_t callable, Params... params) = nullptr; + intptr_t callable = 0; + + template + static Ret + callback_fn (intptr_t callable, Params... params) + { + return (*reinterpret_cast (callable)) ( + std::forward (params)...); + } + +public: + function_ref () = default; + function_ref (std::nullptr_t) + { + } + + template + function_ref ( + Callable &&callable RCC_LIFETIME_BOUND, + // This is not the copy-constructor. + std::enable_if_t, + function_ref>::value> * = nullptr, + // Functor must be callable and return a suitable type. + std::enable_if_t::value || + std::is_convertible () ( + std::declval ()...)), + Ret>::value> * = nullptr) + : callback (callback_fn>), + callable (reinterpret_cast (&callable)) + { + } + + Ret + operator() (Params... params) const + { + return callback (callable, std::forward (params)...); + } + + explicit + operator bool () const + { + return callback; + } +}; + +} // end namespace rcc + +#endif // RCC_ADT_STLFUNCTIONALEXTRAS_H -- cgit v1.2.3