111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <functional> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// class function<R(ArgTypes...)> 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <MoveConstructible R, MoveConstructible ... ArgTypes> 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&); 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <functional> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <new> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cstdlib> 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint new_called = 0; 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid* operator new(std::size_t s) throw(std::bad_alloc) 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++new_called; 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return std::malloc(s); 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid operator delete(void* p) throw() 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --new_called; 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::free(p); 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass A 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int data_[10]; 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic: 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static int count; 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit A(int j) 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++count; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert data_[0] = j; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A(const A& a) 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++count; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (int i = 0; i < 10; ++i) 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert data_[i] = a.data_[i]; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~A() {--count;} 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int operator()(int i) const 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (int j = 0; j < 10; ++j) 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert i += data_[j]; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return i; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int id() const {return data_[0];} 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint A::count = 0; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint g(int) {return 0;} 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint h(int) {return 1;} 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f1 = A(1); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f2 = A(2); 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 2); 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 2); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f1.target<A>()->id() == 1); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<A>()->id() == 2); 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert swap(f1, f2); 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 2); 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 2); 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f1.target<A>()->id() == 2); 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<A>()->id() == 1); 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f1 = A(1); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f2 = g; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f1.target<A>()->id() == 1); 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f2.target<int(*)(int)>() == g); 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert swap(f1, f2); 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f1.target<int(*)(int)>() == g); 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<A>()->id() == 1); 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f1 = g; 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f2 = A(1); 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f1.target<int(*)(int)>() == g); 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2.target<A>()->id() == 1); 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert swap(f1, f2); 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 1); 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 1); 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f1.target<A>()->id() == 1); 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f2.target<int(*)(int)>() == g); 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f1 = g; 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::function<int(int)> f2 = h; 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f1.target<int(*)(int)>() == g); 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f2.target<int(*)(int)>() == h); 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert swap(f1, f2); 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f1.target<int(*)(int)>() == h); 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*f2.target<int(*)(int)>() == g); 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A::count == 0); 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called == 0); 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 136