140 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++0310 11// <functional>12 13// class function<R(ArgTypes...)>14 15// template <MoveConstructible R, MoveConstructible ... ArgTypes>16// void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;17 18#include <functional>19#include <cstdlib>20#include <cassert>21 22#include "test_macros.h"23#include "count_new.h"24 25class A26{27 int data_[10];28public:29 static int count;30 31 explicit A(int j)32 {33 ++count;34 data_[0] = j;35 }36 37 A(const A& a)38 {39 ++count;40 for (int i = 0; i < 10; ++i)41 data_[i] = a.data_[i];42 }43 44 ~A() {--count;}45 46 int operator()(int i) const47 {48 for (int j = 0; j < 10; ++j)49 i += data_[j];50 return i;51 }52 53 int id() const {return data_[0];}54};55 56int A::count = 0;57 58int g(int) {return 0;}59int h(int) {return 1;}60 61int main(int, char**)62{63 globalMemCounter.reset();64 assert(globalMemCounter.checkOutstandingNewEq(0));65 {66 std::function<int(int)> f1 = A(1);67 std::function<int(int)> f2 = A(2);68#if TEST_STD_VER >= 1169 static_assert(noexcept(swap(f1, f2)), "" );70#endif71 assert(A::count == 2);72 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(2));73 RTTI_ASSERT(f1.target<A>()->id() == 1);74 RTTI_ASSERT(f2.target<A>()->id() == 2);75 swap(f1, f2);76 assert(A::count == 2);77 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(2));78 RTTI_ASSERT(f1.target<A>()->id() == 2);79 RTTI_ASSERT(f2.target<A>()->id() == 1);80 }81 assert(A::count == 0);82 assert(globalMemCounter.checkOutstandingNewEq(0));83 {84 std::function<int(int)> f1 = A(1);85 std::function<int(int)> f2 = g;86#if TEST_STD_VER >= 1187 static_assert(noexcept(swap(f1, f2)), "" );88#endif89 assert(A::count == 1);90 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));91 RTTI_ASSERT(f1.target<A>()->id() == 1);92 RTTI_ASSERT(*f2.target<int(*)(int)>() == g);93 swap(f1, f2);94 assert(A::count == 1);95 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));96 RTTI_ASSERT(*f1.target<int(*)(int)>() == g);97 RTTI_ASSERT(f2.target<A>()->id() == 1);98 }99 assert(A::count == 0);100 assert(globalMemCounter.checkOutstandingNewEq(0));101 {102 std::function<int(int)> f1 = g;103 std::function<int(int)> f2 = A(1);104#if TEST_STD_VER >= 11105 static_assert(noexcept(swap(f1, f2)), "" );106#endif107 assert(A::count == 1);108 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));109 RTTI_ASSERT(*f1.target<int(*)(int)>() == g);110 RTTI_ASSERT(f2.target<A>()->id() == 1);111 swap(f1, f2);112 assert(A::count == 1);113 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(1));114 RTTI_ASSERT(f1.target<A>()->id() == 1);115 RTTI_ASSERT(*f2.target<int(*)(int)>() == g);116 }117 assert(A::count == 0);118 assert(globalMemCounter.checkOutstandingNewEq(0));119 {120 std::function<int(int)> f1 = g;121 std::function<int(int)> f2 = h;122#if TEST_STD_VER >= 11123 static_assert(noexcept(swap(f1, f2)), "" );124#endif125 assert(A::count == 0);126 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(0));127 RTTI_ASSERT(*f1.target<int(*)(int)>() == g);128 RTTI_ASSERT(*f2.target<int(*)(int)>() == h);129 swap(f1, f2);130 assert(A::count == 0);131 assert(globalMemCounter.checkOutstandingNewLessThanOrEqual(0));132 RTTI_ASSERT(*f1.target<int(*)(int)>() == h);133 RTTI_ASSERT(*f2.target<int(*)(int)>() == g);134 }135 assert(A::count == 0);136 assert(globalMemCounter.checkOutstandingNewEq(0));137 138 return 0;139}140