1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <functional> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// class function<R(ArgTypes...)> 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// function& operator=(const function& f); 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <functional> 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 1989e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#include "test_macros.h" 204eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier#include "count_new.hpp" 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 22152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierclass A { 23152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier int data_[10]; 24152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantpublic: 26152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier static int count; 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 28152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier A() { 29152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier ++count; 30152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier for (int i = 0; i < 10; ++i) 31152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier data_[i] = i; 32152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 34152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier A(const A &) { ++count; } 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 36152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier ~A() { --count; } 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 38152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier int operator()(int i) const { 39152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier for (int j = 0; j < 10; ++j) 40152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier i += data_[j]; 41152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier return i; 42152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint A::count = 0; 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 47152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierint g0() { return 0; } 48152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierint g(int) { return 0; } 49152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierint g2(int, int) { return 2; } 50152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierint g3(int, int, int) { return 3; } 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 52152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselierint main() { 53152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 54152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f = A(); 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 574eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1)); 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f.target<A>()); 59152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f.target<int (*)(int)>() == 0); 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f2; 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant f2 = f; 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 2); 634eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(2)); 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f2.target<A>()); 65152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f2.target<int (*)(int)>() == 0); 66152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 67152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(A::count == 0); 68152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 69152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f = g; 714eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 72152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f.target<int (*)(int)>()); 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f.target<A>() == 0); 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f2; 75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant f2 = f; 764eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 77152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f2.target<int (*)(int)>()); 78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f2.target<A>() == 0); 79152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 80152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 81152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 82c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f; 834eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 84152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f.target<int (*)(int)>() == 0); 85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f.target<A>() == 0); 86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f2; 87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant f2 = f; 884eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 89152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f2.target<int (*)(int)>() == 0); 90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f2.target<A>() == 0); 91152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 92152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 93152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier typedef std::function<int()> Func; 94152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func f = g0; 95152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func& fr = (f = f); 96152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(&fr == &f); 97152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(*f.target<int(*)()>() == g0); 98152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 99152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 100152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier typedef std::function<int(int)> Func; 101152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func f = g; 102152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func& fr = (f = f); 103152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(&fr == &f); 104152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(*f.target<int(*)(int)>() == g); 105152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 106152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 107152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier typedef std::function<int(int, int)> Func; 108152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func f = g2; 109152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func& fr = (f = f); 110152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(&fr == &f); 111152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(*f.target<int(*)(int, int)>() == g2); 112152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 113152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 114152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier typedef std::function<int(int, int, int)> Func; 115152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func f = g3; 116152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier Func& fr = (f = f); 117152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(&fr == &f); 118152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(*f.target<int(*)(int, int, int)>() == g3); 119152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 12089e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#if TEST_STD_VER >= 11 121152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(globalMemCounter.checkOutstandingNewEq(0)); 122152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier { 123c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f = A(); 124c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 1254eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1)); 126c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f.target<A>()); 127152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f.target<int (*)(int)>() == 0); 128c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::function<int(int)> f2; 12961aa6013c3377203aff484cf3300ac26511c26acHoward Hinnant f2 = std::move(f); 130c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A::count == 1); 1314eb5b6d5ee23721a64e2b6d1bb5e133321ae5c9eEric Fiselier assert(globalMemCounter.checkOutstandingNewEq(1)); 132c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f2.target<A>()); 133152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f2.target<int (*)(int)>() == 0); 134c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(f.target<A>() == 0); 135152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier assert(f.target<int (*)(int)>() == 0); 136152e5e61a1181abe4ea9ad72fb08ca31d9cdd6d9Eric Fiselier } 13789e826a160dce10dd353e1e0bca21c6fabe86b92Eric Fiselier#endif 138c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 139