mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
337d1f312b
Differential Revision: https://reviews.llvm.org/D100671
83 lines
2.7 KiB
C++
83 lines
2.7 KiB
C++
//===- STLForwardCompat.h - Library features from future STLs ------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 library features backported from future STL versions.
|
|
//
|
|
// These should be replaced with their STL counterparts as the C++ version LLVM
|
|
// is compiled with is updated.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ADT_STLFORWARDCOMPAT_H
|
|
#define LLVM_ADT_STLFORWARDCOMPAT_H
|
|
|
|
#include <type_traits>
|
|
|
|
namespace llvm {
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Features from C++17
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
template <typename T>
|
|
struct negation // NOLINT(readability-identifier-naming)
|
|
: std::integral_constant<bool, !bool(T::value)> {};
|
|
|
|
template <typename...>
|
|
struct conjunction // NOLINT(readability-identifier-naming)
|
|
: std::true_type {};
|
|
template <typename B1> struct conjunction<B1> : B1 {};
|
|
template <typename B1, typename... Bn>
|
|
struct conjunction<B1, Bn...>
|
|
: std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
|
|
|
|
template <typename...>
|
|
struct disjunction // NOLINT(readability-identifier-naming)
|
|
: std::false_type {};
|
|
template <typename B1> struct disjunction<B1> : B1 {};
|
|
template <typename B1, typename... Bn>
|
|
struct disjunction<B1, Bn...>
|
|
: std::conditional<bool(B1::value), B1, disjunction<Bn...>>::type {};
|
|
|
|
struct in_place_t // NOLINT(readability-identifier-naming)
|
|
{
|
|
explicit in_place_t() = default;
|
|
};
|
|
/// \warning This must not be odr-used, as it cannot be made \c inline in C++14.
|
|
constexpr in_place_t in_place; // NOLINT(readability-identifier-naming)
|
|
|
|
template <typename T>
|
|
struct in_place_type_t // NOLINT(readability-identifier-naming)
|
|
{
|
|
explicit in_place_type_t() = default;
|
|
};
|
|
|
|
template <std::size_t I>
|
|
struct in_place_index_t // NOLINT(readability-identifier-naming)
|
|
{
|
|
explicit in_place_index_t() = default;
|
|
};
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Features from C++20
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
template <typename T>
|
|
struct remove_cvref // NOLINT(readability-identifier-naming)
|
|
{
|
|
using type = std::remove_cv_t<std::remove_reference_t<T>>;
|
|
};
|
|
|
|
template <typename T>
|
|
using remove_cvref_t // NOLINT(readability-identifier-naming)
|
|
= typename llvm::remove_cvref<T>::type;
|
|
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_ADT_STLFORWARDCOMPAT_H
|