Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  66.