Home | History | Annotate | Download | only in utility.inplace
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: c++98, c++03, c++11, c++14
     11 
     12 // <utility>
     13 
     14 // struct in_place_t {
     15 //   explicit in_place_t() = default;
     16 // };
     17 // inline constexpr in_place_t in_place{};
     18 
     19 // template <class T>
     20 //   struct in_place_type_t {
     21 //     explicit in_place_type_t() = default;
     22 //   };
     23 // template <class T>
     24 //   inline constexpr in_place_type_t<T> in_place_type{};
     25 
     26 // template <size_t I>
     27 //   struct in_place_index_t {
     28 //     explicit in_place_index_t() = default;
     29 //   };
     30 // template <size_t I>
     31 //   inline constexpr in_place_index_t<I> in_place_index{};
     32 
     33 #include <utility>
     34 #include <cassert>
     35 #include <memory>
     36 
     37 #include "test_macros.h"
     38 #include "type_id.h"
     39 
     40 template <class Tp, class Up>
     41 constexpr bool check_tag(Up) {
     42     return std::is_same<Tp, std::decay_t<Tp>>::value
     43         && std::is_same<Tp, Up>::value;
     44 }
     45 
     46 int main() {
     47     // test in_place_t
     48     {
     49         using T = std::in_place_t;
     50         static_assert(check_tag<T>(std::in_place));
     51     }
     52     // test in_place_type_t
     53     {
     54         using T1 = std::in_place_type_t<void>;
     55         using T2 = std::in_place_type_t<int>;
     56         using T3 = std::in_place_type_t<const int>;
     57         static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value);
     58         static_assert(!std::is_same<T2, T3>::value);
     59         static_assert(check_tag<T1>(std::in_place_type<void>));
     60         static_assert(check_tag<T2>(std::in_place_type<int>));
     61         static_assert(check_tag<T3>(std::in_place_type<const int>));
     62     }
     63     // test in_place_index_t
     64     {
     65         using T1 = std::in_place_index_t<0>;
     66         using T2 = std::in_place_index_t<1>;
     67         using T3 = std::in_place_index_t<static_cast<size_t>(-1)>;
     68         static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value);
     69         static_assert(!std::is_same<T2, T3>::value);
     70         static_assert(check_tag<T1>(std::in_place_index<0>));
     71         static_assert(check_tag<T2>(std::in_place_index<1>));
     72         static_assert(check_tag<T3>(std::in_place_index<static_cast<size_t>(-1)>));
     73     }
     74 }
     75