Home | History | Annotate | Download | only in any.modifiers
      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
     11 
     12 // <experimental/any>
     13 
     14 // any::swap(any &) noexcept
     15 
     16 // Test swap(large, small) and swap(small, large)
     17 
     18 #include <experimental/any>
     19 #include <cassert>
     20 
     21 #include "experimental_any_helpers.h"
     22 
     23 using std::experimental::any;
     24 using std::experimental::any_cast;
     25 
     26 template <class LHS, class RHS>
     27 void test_swap() {
     28     assert(LHS::count == 0);
     29     assert(RHS::count == 0);
     30     {
     31         any a1((LHS(1)));
     32         any a2(RHS{2});
     33         assert(LHS::count == 1);
     34         assert(RHS::count == 1);
     35 
     36         a1.swap(a2);
     37 
     38         assert(LHS::count == 1);
     39         assert(RHS::count == 1);
     40 
     41         assertContains<RHS>(a1, 2);
     42         assertContains<LHS>(a2, 1);
     43     }
     44     assert(LHS::count == 0);
     45     assert(RHS::count == 0);
     46     assert(LHS::copied == 0);
     47     assert(RHS::copied == 0);
     48 }
     49 
     50 template <class Tp>
     51 void test_swap_empty() {
     52     assert(Tp::count == 0);
     53     {
     54         any a1((Tp(1)));
     55         any a2;
     56         assert(Tp::count == 1);
     57 
     58         a1.swap(a2);
     59 
     60         assert(Tp::count == 1);
     61 
     62         assertContains<Tp>(a2, 1);
     63         assertEmpty(a1);
     64     }
     65     assert(Tp::count == 0);
     66     {
     67         any a1((Tp(1)));
     68         any a2;
     69         assert(Tp::count == 1);
     70 
     71         a2.swap(a1);
     72 
     73         assert(Tp::count == 1);
     74 
     75         assertContains<Tp>(a2, 1);
     76         assertEmpty(a1);
     77     }
     78     assert(Tp::count == 0);
     79     assert(Tp::copied == 0);
     80 }
     81 
     82 void test_noexcept()
     83 {
     84     any a1;
     85     any a2;
     86     static_assert(
     87         noexcept(a1.swap(a2))
     88       , "any::swap(any&) must be noexcept"
     89       );
     90 }
     91 
     92 int main()
     93 {
     94     test_noexcept();
     95     test_swap_empty<small>();
     96     test_swap_empty<large>();
     97     test_swap<small1, small2>();
     98     test_swap<large1, large2>();
     99     test_swap<small, large>();
    100     test_swap<large, small>();
    101 }
    102