Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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
 
23
namespace llvm {
24
 
25
//===----------------------------------------------------------------------===//
26
//     Features from C++20
27
//===----------------------------------------------------------------------===//
28
 
29
template <typename T>
30
struct remove_cvref // NOLINT(readability-identifier-naming)
31
{
32
  using type = std::remove_cv_t<std::remove_reference_t<T>>;
33
};
34
 
35
template <typename T>
36
using remove_cvref_t // NOLINT(readability-identifier-naming)
37
    = typename llvm::remove_cvref<T>::type;
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.
45
template <typename T, typename Function>
46
auto 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.
55
template <typename T, typename Function>
56
auto 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 llvm
64
 
65
#endif // LLVM_ADT_STLFORWARDCOMPAT_H