From 02b615c8704aeda9a94cf5457c9c78de847c911a Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sun, 1 Nov 2026 02:12:34 +0800 Subject: Move support code into CoreLib --- .../include/CoreLib/ADT/STLFunctionalExtras.h | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 libsupport/include/CoreLib/ADT/STLFunctionalExtras.h (limited to 'libsupport/include/CoreLib/ADT/STLFunctionalExtras.h') diff --git a/libsupport/include/CoreLib/ADT/STLFunctionalExtras.h b/libsupport/include/CoreLib/ADT/STLFunctionalExtras.h new file mode 100644 index 0000000..993acc0 --- /dev/null +++ b/libsupport/include/CoreLib/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 "CoreLib/Compiler/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