brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · c13cb8b Raw
130 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// <any>12 13// any::swap(any &) noexcept14 15// Test swap(large, small) and swap(small, large)16 17#include <any>18#include <cassert>19 20#include "test_macros.h"21#include "any_helpers.h"22 23template <class LHS, class RHS>24void test_swap() {25    assert(LHS::count == 0);26    assert(RHS::count == 0);27    {28        std::any a1 = LHS(1);29        std::any a2 = RHS(2);30        assert(LHS::count == 1);31        assert(RHS::count == 1);32 33        a1.swap(a2);34 35        assert(LHS::count == 1);36        assert(RHS::count == 1);37 38        assertContains<RHS>(a1, 2);39        assertContains<LHS>(a2, 1);40    }41    assert(LHS::count == 0);42    assert(RHS::count == 0);43    assert(LHS::copied == 0);44    assert(RHS::copied == 0);45}46 47template <class Tp>48void test_swap_empty() {49    assert(Tp::count == 0);50    {51        std::any a1 = Tp(1);52        std::any a2;53        assert(Tp::count == 1);54 55        a1.swap(a2);56 57        assert(Tp::count == 1);58 59        assertContains<Tp>(a2, 1);60        assertEmpty(a1);61    }62    assert(Tp::count == 0);63    {64        std::any a1 = Tp(1);65        std::any a2;66        assert(Tp::count == 1);67 68        a2.swap(a1);69 70        assert(Tp::count == 1);71 72        assertContains<Tp>(a2, 1);73        assertEmpty(a1);74    }75    assert(Tp::count == 0);76    assert(Tp::copied == 0);77}78 79void test_noexcept()80{81    std::any a1;82    std::any a2;83    ASSERT_NOEXCEPT(a1.swap(a2));84}85 86void test_self_swap() {87    {88        // empty89        std::any a;90        a.swap(a);91        assertEmpty(a);92    }93    { // small94        using T = small;95        std::any a = T(42);96        T::reset();97        a.swap(a);98        assertContains<T>(a, 42);99        assert(T::count == 1);100        assert(T::copied == 0);101        LIBCPP_ASSERT(T::moved == 0);102    }103    assert(small::count == 0);104    { // large105        using T = large;106        std::any a = T(42);107        T::reset();108        a.swap(a);109        assertContains<T>(a, 42);110        assert(T::count == 1);111        assert(T::copied == 0);112        LIBCPP_ASSERT(T::moved == 0);113    }114    assert(large::count == 0);115}116 117int main(int, char**)118{119    test_noexcept();120    test_swap_empty<small>();121    test_swap_empty<large>();122    test_swap<small1, small2>();123    test_swap<large1, large2>();124    test_swap<small, large>();125    test_swap<large, small>();126    test_self_swap();127 128  return 0;129}130