brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 79a9f5f Raw
74 lines · cpp
1//===----------------------------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <utility>12 13// struct in_place_t {14//   explicit in_place_t() = default;15// };16// inline constexpr in_place_t in_place{};17 18// template <class T>19//   struct in_place_type_t {20//     explicit in_place_type_t() = default;21//   };22// template <class T>23//   inline constexpr in_place_type_t<T> in_place_type{};24 25// template <size_t I>26//   struct in_place_index_t {27//     explicit in_place_index_t() = default;28//   };29// template <size_t I>30//   inline constexpr in_place_index_t<I> in_place_index{};31 32#include <cassert>33#include <memory>34#include <type_traits>35#include <utility>36 37template <class Tp, class Up>38constexpr bool check_tag(Up) {39    return std::is_same<Tp, std::decay_t<Tp>>::value40        && std::is_same<Tp, Up>::value;41}42 43int main(int, char**) {44    // test in_place_t45    {46        using T = std::in_place_t;47        static_assert(check_tag<T>(std::in_place));48    }49    // test in_place_type_t50    {51        using T1 = std::in_place_type_t<void>;52        using T2 = std::in_place_type_t<int>;53        using T3 = std::in_place_type_t<const int>;54        static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value);55        static_assert(!std::is_same<T2, T3>::value);56        static_assert(check_tag<T1>(std::in_place_type<void>));57        static_assert(check_tag<T2>(std::in_place_type<int>));58        static_assert(check_tag<T3>(std::in_place_type<const int>));59    }60    // test in_place_index_t61    {62        using T1 = std::in_place_index_t<0>;63        using T2 = std::in_place_index_t<1>;64        using T3 = std::in_place_index_t<static_cast<std::size_t>(-1)>;65        static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value);66        static_assert(!std::is_same<T2, T3>::value);67        static_assert(check_tag<T1>(std::in_place_index<0>));68        static_assert(check_tag<T2>(std::in_place_index<1>));69        static_assert(check_tag<T3>(std::in_place_index<static_cast<std::size_t>(-1)>));70    }71 72  return 0;73}74