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// <condition_variable>
11
12// class condition_variable_any;
13
14// template <class Lock, class Predicate>
15//   void wait(Lock& lock, Predicate pred);
16
17#include <condition_variable>
18#include <mutex>
19#include <thread>
20#include <functional>
21#include <cassert>
22
23std::condition_variable_any cv;
24
25typedef std::timed_mutex L0;
26typedef std::unique_lock<L0> L1;
27
28L0 m0;
29
30int test1 = 0;
31int test2 = 0;
32
33class Pred
34{
35    int& i_;
36public:
37    explicit Pred(int& i) : i_(i) {}
38
39    bool operator()() {return i_ != 0;}
40};
41
42void f()
43{
44    L1 lk(m0);
45    assert(test2 == 0);
46    test1 = 1;
47    cv.notify_one();
48    cv.wait(lk, Pred(test2));
49    assert(test2 != 0);
50}
51
52int main()
53{
54    L1 lk(m0);
55    std::thread t(f);
56    assert(test1 == 0);
57    while (test1 == 0)
58        cv.wait(lk);
59    assert(test1 != 0);
60    test2 = 1;
61    lk.unlock();
62    cv.notify_one();
63    t.join();
64}
65