copy_assign.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <functional>
11
12// class function<R(ArgTypes...)>
13
14// function& operator=(const function& f);
15
16#include <functional>
17#include <new>
18#include <cstdlib>
19#include <cassert>
20
21int new_called = 0;
22
23void* operator new(std::size_t s) throw(std::bad_alloc)
24{
25    ++new_called;
26    return std::malloc(s);
27}
28
29void  operator delete(void* p) throw()
30{
31    --new_called;
32    std::free(p);
33}
34
35class A
36{
37    int data_[10];
38public:
39    static int count;
40
41    A()
42    {
43        ++count;
44        for (int i = 0; i < 10; ++i)
45            data_[i] = i;
46    }
47
48    A(const A&) {++count;}
49
50    ~A() {--count;}
51
52    int operator()(int i) const
53    {
54        for (int j = 0; j < 10; ++j)
55            i += data_[j];
56        return i;
57    }
58};
59
60int A::count = 0;
61
62int g(int) {return 0;}
63
64int main()
65{
66    assert(new_called == 0);
67    {
68    std::function<int(int)> f = A();
69    assert(A::count == 1);
70    assert(new_called == 1);
71    assert(f.target<A>());
72    assert(f.target<int(*)(int)>() == 0);
73    std::function<int(int)> f2;
74    f2 = f;
75    assert(A::count == 2);
76    assert(new_called == 2);
77    assert(f2.target<A>());
78    assert(f2.target<int(*)(int)>() == 0);
79    }
80    assert(A::count == 0);
81    assert(new_called == 0);
82    {
83    std::function<int(int)> f = g;
84    assert(new_called == 0);
85    assert(f.target<int(*)(int)>());
86    assert(f.target<A>() == 0);
87    std::function<int(int)> f2;
88    f2 = f;
89    assert(new_called == 0);
90    assert(f2.target<int(*)(int)>());
91    assert(f2.target<A>() == 0);
92    }
93    assert(new_called == 0);
94    {
95    std::function<int(int)> f;
96    assert(new_called == 0);
97    assert(f.target<int(*)(int)>() == 0);
98    assert(f.target<A>() == 0);
99    std::function<int(int)> f2;
100    f2 = f;
101    assert(new_called == 0);
102    assert(f2.target<int(*)(int)>() == 0);
103    assert(f2.target<A>() == 0);
104    }
105#ifdef _LIBCPP_MOVE
106    assert(new_called == 0);
107    {
108    std::function<int(int)> f = A();
109    assert(A::count == 1);
110    assert(new_called == 1);
111    assert(f.target<A>());
112    assert(f.target<int(*)(int)>() == 0);
113    std::function<int(int)> f2;
114    f2 = _STD::move(f);
115    assert(A::count == 1);
116    assert(new_called == 1);
117    assert(f2.target<A>());
118    assert(f2.target<int(*)(int)>() == 0);
119    assert(f.target<A>() == 0);
120    assert(f.target<int(*)(int)>() == 0);
121    }
122#endif  // _LIBCPP_MOVE
123}
124