LLVM 22.0.0git
STLForwardCompat.h
Go to the documentation of this file.
1//===- STLForwardCompat.h - Library features from future STLs ------C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file contains library features backported from future STL versions.
11///
12/// These should be replaced with their STL counterparts as the C++ version LLVM
13/// is compiled with is updated.
14///
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_ADT_STLFORWARDCOMPAT_H
18#define LLVM_ADT_STLFORWARDCOMPAT_H
19
20#include <optional>
21#include <type_traits>
22
23namespace llvm {
24
25//===----------------------------------------------------------------------===//
26// Features from C++20
27//===----------------------------------------------------------------------===//
28
29template <typename T>
30struct remove_cvref // NOLINT(readability-identifier-naming)
31{
32 using type = std::remove_cv_t<std::remove_reference_t<T>>;
33};
34
35template <typename T>
36using remove_cvref_t // NOLINT(readability-identifier-naming)
38
39// TODO: Remove this in favor of std::type_identity<T> once we switch to C++23.
40template <typename T>
41struct type_identity // NOLINT(readability-identifier-naming)
42{
43 using type = T;
44};
45
46// TODO: Remove this in favor of std::type_identity_t<T> once we switch to
47// C++23.
48template <typename T>
49using type_identity_t // NOLINT(readability-identifier-naming)
51
52//===----------------------------------------------------------------------===//
53// Features from C++23
54//===----------------------------------------------------------------------===//
55
56// TODO: Remove this in favor of std::optional<T>::transform once we switch to
57// C++23.
58template <typename Optional, typename Function,
60std::optional<std::invoke_result_t<Function, Value>>
61transformOptional(Optional &&O, Function &&F) {
62 if (O) {
63 return F(*std::forward<Optional>(O));
64 }
65 return std::nullopt;
66}
67
68/// Returns underlying integer value of an enum. Backport of C++23
69/// std::to_underlying.
70template <typename Enum>
71[[nodiscard]] constexpr std::underlying_type_t<Enum> to_underlying(Enum E) {
72 return static_cast<std::underlying_type_t<Enum>>(E);
73}
74
75// A tag for constructors accepting ranges.
77 explicit from_range_t() = default;
78};
79inline constexpr from_range_t from_range{};
80} // namespace llvm
81
82#endif // LLVM_ADT_STLFORWARDCOMPAT_H
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define F(x, y, z)
Definition: MD5.cpp:55
#define T
LLVM Value Representation.
Definition: Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
constexpr from_range_t from_range
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
typename llvm::remove_cvref< T >::type remove_cvref_t
std::optional< std::invoke_result_t< Function, Value > > transformOptional(Optional &&O, Function &&F)
typename llvm::type_identity< T >::type type_identity_t
from_range_t()=default
std::remove_cv_t< std::remove_reference_t< T > > type