Chris@102
|
1 #ifndef BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
|
Chris@102
|
2 #define BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
|
Chris@102
|
3
|
Chris@102
|
4 //////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
5 //
|
Chris@102
|
6 // (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
|
Chris@102
|
7 // Software License, Version 1.0. (See accompanying file
|
Chris@102
|
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
9 //
|
Chris@102
|
10 // See http://www.boost.org/libs/thread for documentation.
|
Chris@102
|
11 //
|
Chris@102
|
12 //////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
13
|
Chris@102
|
14 #include <boost/thread/detail/config.hpp>
|
Chris@102
|
15 #include <boost/thread/detail/move.hpp>
|
Chris@102
|
16 #include <boost/thread/concurrent_queues/queue_op_status.hpp>
|
Chris@102
|
17 #include <boost/type_traits/conditional.hpp>
|
Chris@102
|
18 #include <boost/type_traits/is_copy_constructible.hpp>
|
Chris@102
|
19
|
Chris@102
|
20
|
Chris@102
|
21 #include <boost/config/abi_prefix.hpp>
|
Chris@102
|
22
|
Chris@102
|
23 namespace boost
|
Chris@102
|
24 {
|
Chris@102
|
25 namespace concurrent
|
Chris@102
|
26 {
|
Chris@102
|
27 namespace detail
|
Chris@102
|
28 {
|
Chris@102
|
29
|
Chris@102
|
30 template <typename ValueType, class SizeType>
|
Chris@102
|
31 class deque_base_copyable_only
|
Chris@102
|
32 {
|
Chris@102
|
33 public:
|
Chris@102
|
34 typedef ValueType value_type;
|
Chris@102
|
35 typedef SizeType size_type;
|
Chris@102
|
36
|
Chris@102
|
37 // Constructors/Assignment/Destructors
|
Chris@102
|
38 virtual ~deque_base_copyable_only() {};
|
Chris@102
|
39
|
Chris@102
|
40 // Observers
|
Chris@102
|
41 virtual bool empty() const = 0;
|
Chris@102
|
42 virtual bool full() const = 0;
|
Chris@102
|
43 virtual size_type size() const = 0;
|
Chris@102
|
44 virtual bool closed() const = 0;
|
Chris@102
|
45
|
Chris@102
|
46 // Modifiers
|
Chris@102
|
47 virtual void close() = 0;
|
Chris@102
|
48
|
Chris@102
|
49 virtual void push_back(const value_type& x) = 0;
|
Chris@102
|
50
|
Chris@102
|
51 virtual void pull_front(value_type&) = 0;
|
Chris@102
|
52 virtual value_type pull_front() = 0;
|
Chris@102
|
53
|
Chris@102
|
54 virtual queue_op_status try_push_back(const value_type& x) = 0;
|
Chris@102
|
55 virtual queue_op_status try_pull_front(value_type&) = 0;
|
Chris@102
|
56
|
Chris@102
|
57 virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
|
Chris@102
|
58 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
|
Chris@102
|
59
|
Chris@102
|
60 virtual queue_op_status wait_push_back(const value_type& x) = 0;
|
Chris@102
|
61 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
|
Chris@102
|
62
|
Chris@102
|
63 };
|
Chris@102
|
64
|
Chris@102
|
65 template <typename ValueType, class SizeType>
|
Chris@102
|
66 class deque_base_movable_only
|
Chris@102
|
67 {
|
Chris@102
|
68 public:
|
Chris@102
|
69 typedef ValueType value_type;
|
Chris@102
|
70 typedef SizeType size_type;
|
Chris@102
|
71 // Constructors/Assignment/Destructors
|
Chris@102
|
72 virtual ~deque_base_movable_only() {};
|
Chris@102
|
73
|
Chris@102
|
74 // Observers
|
Chris@102
|
75 virtual bool empty() const = 0;
|
Chris@102
|
76 virtual bool full() const = 0;
|
Chris@102
|
77 virtual size_type size() const = 0;
|
Chris@102
|
78 virtual bool closed() const = 0;
|
Chris@102
|
79
|
Chris@102
|
80 // Modifiers
|
Chris@102
|
81 virtual void close() = 0;
|
Chris@102
|
82
|
Chris@102
|
83 virtual void pull_front(value_type&) = 0;
|
Chris@102
|
84 // enable_if is_nothrow_movable<value_type>
|
Chris@102
|
85 virtual value_type pull_front() = 0;
|
Chris@102
|
86
|
Chris@102
|
87 virtual queue_op_status try_pull_front(value_type&) = 0;
|
Chris@102
|
88
|
Chris@102
|
89 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
|
Chris@102
|
90
|
Chris@102
|
91 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
|
Chris@102
|
92
|
Chris@102
|
93 virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
94 virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
95 virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
96 virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
97 };
|
Chris@102
|
98
|
Chris@102
|
99
|
Chris@102
|
100 template <typename ValueType, class SizeType>
|
Chris@102
|
101 class deque_base_copyable_and_movable
|
Chris@102
|
102 {
|
Chris@102
|
103 public:
|
Chris@102
|
104 typedef ValueType value_type;
|
Chris@102
|
105 typedef SizeType size_type;
|
Chris@102
|
106 // Constructors/Assignment/Destructors
|
Chris@102
|
107 virtual ~deque_base_copyable_and_movable() {};
|
Chris@102
|
108
|
Chris@102
|
109
|
Chris@102
|
110 // Observers
|
Chris@102
|
111 virtual bool empty() const = 0;
|
Chris@102
|
112 virtual bool full() const = 0;
|
Chris@102
|
113 virtual size_type size() const = 0;
|
Chris@102
|
114 virtual bool closed() const = 0;
|
Chris@102
|
115
|
Chris@102
|
116 // Modifiers
|
Chris@102
|
117 virtual void close() = 0;
|
Chris@102
|
118
|
Chris@102
|
119 virtual void push_back(const value_type& x) = 0;
|
Chris@102
|
120
|
Chris@102
|
121 virtual void pull_front(value_type&) = 0;
|
Chris@102
|
122 // enable_if is_nothrow_copy_movable<value_type>
|
Chris@102
|
123 virtual value_type pull_front() = 0;
|
Chris@102
|
124
|
Chris@102
|
125 virtual queue_op_status try_push_back(const value_type& x) = 0;
|
Chris@102
|
126 virtual queue_op_status try_pull_front(value_type&) = 0;
|
Chris@102
|
127
|
Chris@102
|
128 virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
|
Chris@102
|
129 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
|
Chris@102
|
130
|
Chris@102
|
131 virtual queue_op_status wait_push_back(const value_type& x) = 0;
|
Chris@102
|
132 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
|
Chris@102
|
133
|
Chris@102
|
134 virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
135 virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
136 virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
137 virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
|
Chris@102
|
138 };
|
Chris@102
|
139
|
Chris@102
|
140 template <class T, class ST,
|
Chris@102
|
141 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
|
Chris@102
|
142 #if defined __GNUC__ && ! defined __clang__
|
Chris@102
|
143 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
|
Chris@102
|
144 bool Copyable = is_copy_constructible<T>::value,
|
Chris@102
|
145 bool Movable = true
|
Chris@102
|
146 #else
|
Chris@102
|
147 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
|
Chris@102
|
148 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
|
Chris@102
|
149 #endif // __GNUC__
|
Chris@102
|
150 #elif defined _MSC_VER
|
Chris@102
|
151 #if _MSC_VER < 1700
|
Chris@102
|
152 bool Copyable = is_copy_constructible<T>::value,
|
Chris@102
|
153 bool Movable = true
|
Chris@102
|
154 #else
|
Chris@102
|
155 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
|
Chris@102
|
156 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
|
Chris@102
|
157 #endif // _MSC_VER
|
Chris@102
|
158 #else
|
Chris@102
|
159 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
|
Chris@102
|
160 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
|
Chris@102
|
161 #endif
|
Chris@102
|
162 #else
|
Chris@102
|
163 bool Copyable = is_copy_constructible<T>::value,
|
Chris@102
|
164 bool Movable = has_move_emulation_enabled<T>::value
|
Chris@102
|
165 #endif
|
Chris@102
|
166 >
|
Chris@102
|
167 struct deque_base;
|
Chris@102
|
168
|
Chris@102
|
169 template <class T, class ST>
|
Chris@102
|
170 struct deque_base<T, ST, true, true> {
|
Chris@102
|
171 typedef deque_base_copyable_and_movable<T, ST> type;
|
Chris@102
|
172 };
|
Chris@102
|
173 template <class T, class ST>
|
Chris@102
|
174 struct deque_base<T, ST, true, false> {
|
Chris@102
|
175 typedef deque_base_copyable_only<T, ST> type;
|
Chris@102
|
176 };
|
Chris@102
|
177 template <class T, class ST>
|
Chris@102
|
178 struct deque_base<T, ST, false, true> {
|
Chris@102
|
179 typedef deque_base_movable_only<T, ST> type;
|
Chris@102
|
180 };
|
Chris@102
|
181
|
Chris@102
|
182 }
|
Chris@102
|
183
|
Chris@102
|
184 template <class ValueType, class SizeType=std::size_t>
|
Chris@102
|
185 class deque_base :
|
Chris@102
|
186 public detail::deque_base<ValueType, SizeType>::type
|
Chris@102
|
187 {
|
Chris@102
|
188 public:
|
Chris@102
|
189 typedef ValueType value_type;
|
Chris@102
|
190 typedef SizeType size_type;
|
Chris@102
|
191 // Constructors/Assignment/Destructors
|
Chris@102
|
192 virtual ~deque_base() {};
|
Chris@102
|
193 };
|
Chris@102
|
194
|
Chris@102
|
195 }
|
Chris@102
|
196 using concurrent::deque_base;
|
Chris@102
|
197
|
Chris@102
|
198 }
|
Chris@102
|
199
|
Chris@102
|
200 #include <boost/config/abi_suffix.hpp>
|
Chris@102
|
201
|
Chris@102
|
202 #endif
|