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()