1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <functional>
11
12// reference_wrapper
13
14// template <ObjectType T> reference_wrapper<T> ref(reference_wrapper<T>t);
15
16#include <functional>
17#include <cassert>
18
19#include "counting_predicates.hpp"
20
21bool is5 ( int i ) { return i == 5; }
22
23template <typename T>
24bool call_pred ( T pred ) { return pred(5); }
25
26int main()
27{
28    {
29    int i = 0;
30    std::reference_wrapper<int> r1 = std::ref(i);
31    std::reference_wrapper<int> r2 = std::ref(r1);
32    assert(&r2.get() == &i);
33    }
34    {
35    unary_counting_predicate<bool(*)(int), int> cp(is5);
36    assert(!cp(6));
37    assert(cp.count() == 1);
38    assert(call_pred(cp));
39    assert(cp.count() == 1);
40    assert(call_pred(std::ref(cp)));
41    assert(cp.count() == 2);
42    }
43}
44