Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/thread/barrier.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
1 // Copyright (C) 2002-2003 | 1 // Copyright (C) 2002-2003 |
2 // David Moore, William E. Kempf | 2 // David Moore, William E. Kempf |
3 // Copyright (C) 2007-8 Anthony Williams | 3 // Copyright (C) 2007-8 Anthony Williams |
4 // (C) Copyright 2013 Vicente J. Botet Escriba | |
4 // | 5 // |
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying | 6 // Distributed under the Boost Software License, Version 1.0. (See accompanying |
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | 7 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
7 | 8 |
8 #ifndef BOOST_BARRIER_JDM030602_HPP | 9 #ifndef BOOST_BARRIER_JDM030602_HPP |
15 #include <boost/thread/mutex.hpp> | 16 #include <boost/thread/mutex.hpp> |
16 #include <boost/thread/lock_types.hpp> | 17 #include <boost/thread/lock_types.hpp> |
17 #include <boost/thread/condition_variable.hpp> | 18 #include <boost/thread/condition_variable.hpp> |
18 #include <string> | 19 #include <string> |
19 #include <stdexcept> | 20 #include <stdexcept> |
20 #ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL | 21 #include <boost/thread/detail/nullary_function.hpp> |
21 #include <boost/function.hpp> | |
22 #else | |
23 #include <functional> | |
24 #endif | |
25 #include <boost/type_traits/is_same.hpp> | 22 #include <boost/type_traits/is_same.hpp> |
26 #include <boost/type_traits/is_void.hpp> | 23 #include <boost/type_traits/is_void.hpp> |
27 #include <boost/utility/enable_if.hpp> | 24 #include <boost/core/enable_if.hpp> |
28 #include <boost/utility/result_of.hpp> | 25 #include <boost/utility/result_of.hpp> |
29 | 26 |
30 #include <boost/config/abi_prefix.hpp> | 27 #include <boost/config/abi_prefix.hpp> |
31 | 28 |
32 namespace boost | 29 namespace boost |
33 { | 30 { |
34 namespace thread_detail | 31 namespace thread_detail |
35 { | 32 { |
36 #ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL | 33 typedef detail::nullary_function<void()> void_completion_function; |
37 typedef function<void()> void_completion_function; | 34 typedef detail::nullary_function<size_t()> size_completion_function; |
38 typedef function<size_t()> size_completion_function; | |
39 #else | |
40 typedef std::function<void()> void_completion_function; | |
41 typedef std::function<size_t()> size_completion_function; | |
42 #endif | |
43 | 35 |
44 struct default_barrier_reseter | 36 struct default_barrier_reseter |
45 { | 37 { |
46 unsigned int size_; | 38 unsigned int size_; |
47 default_barrier_reseter(unsigned int size) : | 39 default_barrier_reseter(unsigned int size) : |
48 size_(size) | 40 size_(size) |
49 { | 41 { |
50 } | 42 } |
43 BOOST_THREAD_MOVABLE(default_barrier_reseter) | |
44 //BOOST_THREAD_COPYABLE_AND_MOVABLE(default_barrier_reseter) | |
45 | |
46 default_barrier_reseter(default_barrier_reseter const& other) BOOST_NOEXCEPT : | |
47 size_(other.size_) | |
48 { | |
49 } | |
50 default_barrier_reseter(BOOST_THREAD_RV_REF(default_barrier_reseter) other) BOOST_NOEXCEPT : | |
51 size_(BOOST_THREAD_RV(other).size_) | |
52 { | |
53 } | |
54 | |
51 unsigned int operator()() | 55 unsigned int operator()() |
52 { | 56 { |
53 return size_; | 57 return size_; |
54 } | 58 } |
55 }; | 59 }; |
57 struct void_functor_barrier_reseter | 61 struct void_functor_barrier_reseter |
58 { | 62 { |
59 unsigned int size_; | 63 unsigned int size_; |
60 void_completion_function fct_; | 64 void_completion_function fct_; |
61 template <typename F> | 65 template <typename F> |
62 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | |
63 void_functor_barrier_reseter(unsigned int size, BOOST_THREAD_RV_REF(F) funct) | 66 void_functor_barrier_reseter(unsigned int size, BOOST_THREAD_RV_REF(F) funct) |
64 : size_(size), fct_(boost::move(funct)) | 67 : size_(size), fct_(boost::move(funct)) |
65 {} | 68 {} |
66 #else | 69 template <typename F> |
67 void_functor_barrier_reseter(unsigned int size, F funct) | 70 void_functor_barrier_reseter(unsigned int size, F& funct) |
68 : size_(size), fct_(funct) | 71 : size_(size), fct_(funct) |
69 {} | 72 {} |
70 #endif | 73 |
74 BOOST_THREAD_MOVABLE(void_functor_barrier_reseter) | |
75 //BOOST_THREAD_COPYABLE_AND_MOVABLE(void_functor_barrier_reseter) | |
76 | |
77 void_functor_barrier_reseter(void_functor_barrier_reseter const& other) BOOST_NOEXCEPT : | |
78 size_(other.size_), fct_(other.fct_) | |
79 { | |
80 } | |
81 void_functor_barrier_reseter(BOOST_THREAD_RV_REF(void_functor_barrier_reseter) other) BOOST_NOEXCEPT : | |
82 size_(BOOST_THREAD_RV(other).size_), fct_(BOOST_THREAD_RV(other).fct_) | |
83 //size_(BOOST_THREAD_RV(other).size_), fct_(boost::move(BOOST_THREAD_RV(other).fct_)) | |
84 { | |
85 } | |
86 | |
71 unsigned int operator()() | 87 unsigned int operator()() |
72 { | 88 { |
73 fct_(); | 89 fct_(); |
74 return size_; | 90 return size_; |
75 } | 91 } |
80 void(*fct_)(); | 96 void(*fct_)(); |
81 void_fct_ptr_barrier_reseter(unsigned int size, void(*funct)()) : | 97 void_fct_ptr_barrier_reseter(unsigned int size, void(*funct)()) : |
82 size_(size), fct_(funct) | 98 size_(size), fct_(funct) |
83 { | 99 { |
84 } | 100 } |
101 BOOST_THREAD_MOVABLE(void_fct_ptr_barrier_reseter) | |
102 //BOOST_THREAD_COPYABLE_AND_MOVABLE(void_fct_ptr_barrier_reseter) | |
103 | |
104 void_fct_ptr_barrier_reseter(void_fct_ptr_barrier_reseter const& other) BOOST_NOEXCEPT : | |
105 size_(other.size_), fct_(other.fct_) | |
106 { | |
107 } | |
108 void_fct_ptr_barrier_reseter(BOOST_THREAD_RV_REF(void_fct_ptr_barrier_reseter) other) BOOST_NOEXCEPT : | |
109 size_(BOOST_THREAD_RV(other).size_), fct_(BOOST_THREAD_RV(other).fct_) | |
110 { | |
111 } | |
85 unsigned int operator()() | 112 unsigned int operator()() |
86 { | 113 { |
87 fct_(); | 114 fct_(); |
88 return size_; | 115 return size_; |
89 } | 116 } |
90 }; | 117 }; |
91 } | 118 } |
119 //BOOST_THREAD_DCL_MOVABLE(thread_detail::default_barrier_reseter) | |
120 //BOOST_THREAD_DCL_MOVABLE(thread_detail::void_functor_barrier_reseter) | |
121 //BOOST_THREAD_DCL_MOVABLE(thread_detail::void_fct_ptr_barrier_reseter) | |
122 | |
92 class barrier | 123 class barrier |
93 { | 124 { |
94 static inline unsigned int check_counter(unsigned int count) | 125 static inline unsigned int check_counter(unsigned int count) |
95 { | 126 { |
96 if (count == 0) boost::throw_exception( | 127 if (count == 0) boost::throw_exception( |
103 | 134 |
104 public: | 135 public: |
105 BOOST_THREAD_NO_COPYABLE( barrier) | 136 BOOST_THREAD_NO_COPYABLE( barrier) |
106 | 137 |
107 explicit barrier(unsigned int count) : | 138 explicit barrier(unsigned int count) : |
108 m_count(check_counter(count)), m_generation(0), fct_(thread_detail::default_barrier_reseter(count)) | 139 m_count(check_counter(count)), m_generation(0), fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count))) |
109 { | 140 { |
110 } | 141 } |
111 | 142 |
112 template <typename F> | 143 template <typename F> |
113 barrier( | 144 barrier( |
114 unsigned int count, | 145 unsigned int count, |
115 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | |
116 BOOST_THREAD_RV_REF(F) funct, | 146 BOOST_THREAD_RV_REF(F) funct, |
117 #else | |
118 F funct, | |
119 #endif | |
120 typename enable_if< | 147 typename enable_if< |
121 typename is_void<typename result_of<F>::type>::type, dummy* | 148 typename is_void<typename result_of<F>::type>::type, dummy* |
122 >::type=0 | 149 >::type=0 |
123 ) | 150 ) |
124 : m_count(check_counter(count)), | 151 : m_count(check_counter(count)), |
125 m_generation(0), | 152 m_generation(0), |
126 fct_(thread_detail::void_functor_barrier_reseter(count, | 153 fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_functor_barrier_reseter(count, |
127 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | 154 boost::move(funct))) |
128 boost::move(funct) | 155 ) |
129 #else | 156 { |
130 funct | 157 } |
131 #endif | 158 template <typename F> |
132 ) | 159 barrier( |
133 ) | 160 unsigned int count, |
134 { | 161 F &funct, |
135 } | 162 typename enable_if< |
136 | 163 typename is_void<typename result_of<F>::type>::type, dummy* |
137 template <typename F> | 164 >::type=0 |
138 barrier( | 165 ) |
139 unsigned int count, | 166 : m_count(check_counter(count)), |
140 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | 167 m_generation(0), |
168 fct_(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_functor_barrier_reseter(count, | |
169 funct)) | |
170 ) | |
171 { | |
172 } | |
173 | |
174 template <typename F> | |
175 barrier( | |
176 unsigned int count, | |
141 BOOST_THREAD_RV_REF(F) funct, | 177 BOOST_THREAD_RV_REF(F) funct, |
142 #else | |
143 F funct, | |
144 #endif | |
145 typename enable_if< | 178 typename enable_if< |
146 typename is_same<typename result_of<F>::type, unsigned int>::type, dummy* | 179 typename is_same<typename result_of<F>::type, unsigned int>::type, dummy* |
147 >::type=0 | 180 >::type=0 |
148 ) | 181 ) |
149 : m_count(check_counter(count)), | 182 : m_count(check_counter(count)), |
150 m_generation(0), | 183 m_generation(0), |
151 fct_( | 184 fct_(boost::move(funct)) |
152 #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL | 185 { |
153 boost::move(funct) | 186 } |
154 #else | 187 template <typename F> |
155 funct | 188 barrier( |
156 #endif | 189 unsigned int count, |
157 ) | 190 F& funct, |
191 typename enable_if< | |
192 typename is_same<typename result_of<F>::type, unsigned int>::type, dummy* | |
193 >::type=0 | |
194 ) | |
195 : m_count(check_counter(count)), | |
196 m_generation(0), | |
197 fct_(funct) | |
158 { | 198 { |
159 } | 199 } |
160 | 200 |
161 barrier(unsigned int count, void(*funct)()) : | 201 barrier(unsigned int count, void(*funct)()) : |
162 m_count(check_counter(count)), m_generation(0), | 202 m_count(check_counter(count)), m_generation(0), |
163 fct_(funct | 203 fct_(funct |
164 ? thread_detail::size_completion_function(thread_detail::void_fct_ptr_barrier_reseter(count, funct)) | 204 ? BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::void_fct_ptr_barrier_reseter(count, funct)))) |
165 : thread_detail::size_completion_function(thread_detail::default_barrier_reseter(count)) | 205 : BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count)))) |
166 ) | 206 ) |
167 { | 207 { |
168 } | 208 } |
169 barrier(unsigned int count, unsigned int(*funct)()) : | 209 barrier(unsigned int count, unsigned int(*funct)()) : |
170 m_count(check_counter(count)), m_generation(0), | 210 m_count(check_counter(count)), m_generation(0), |
171 fct_(funct | 211 fct_(funct |
172 ? thread_detail::size_completion_function(funct) | 212 ? BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(funct)) |
173 : thread_detail::size_completion_function(thread_detail::default_barrier_reseter(count)) | 213 : BOOST_THREAD_MAKE_RV_REF(thread_detail::size_completion_function(BOOST_THREAD_MAKE_RV_REF(thread_detail::default_barrier_reseter(count)))) |
174 ) | 214 ) |
175 { | 215 { |
176 } | 216 } |
177 | 217 |
178 bool wait() | 218 bool wait() |