WPILibC++ 2024.3.2
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 WPIUTIL_WPI_STLFORWARDCOMPAT_H
18#define WPIUTIL_WPI_STLFORWARDCOMPAT_H
19
20#include <optional>
21#include <type_traits>
22
23namespace wpi {
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//===----------------------------------------------------------------------===//
40// Features from C++23
41//===----------------------------------------------------------------------===//
42
43// TODO: Remove this in favor of std::optional<T>::transform once we switch to
44// C++23.
45template <typename T, typename Function>
46auto transformOptional(const std::optional<T> &O, const Function &F)
47 -> std::optional<decltype(F(*O))> {
48 if (O)
49 return F(*O);
50 return std::nullopt;
51}
52
53// TODO: Remove this in favor of std::optional<T>::transform once we switch to
54// C++23.
55template <typename T, typename Function>
56auto transformOptional(std::optional<T> &&O, const Function &F)
57 -> std::optional<decltype(F(*std::move(O)))> {
58 if (O)
59 return F(*std::move(O));
60 return std::nullopt;
61}
62
63} // namespace wpi
64
65#endif // WPIUTIL_WPI_STLFORWARDCOMPAT_H
static constexpr const unit_t< compound_unit< charge::coulomb, inverse< substance::mol > > > F(N_A *e)
Faraday constant.
Definition: ntcore_cpp.h:26
auto transformOptional(const std::optional< T > &O, const Function &F) -> std::optional< decltype(F(*O))>
Definition: STLForwardCompat.h:46
Definition: STLForwardCompat.h:31
std::remove_cv_t< std::remove_reference_t< T > > type
Definition: STLForwardCompat.h:32
typename wpi::remove_cvref< T >::type remove_cvref_t
Definition: STLForwardCompat.h:37