1 #ifndef BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
2 #define BOOST_THREAD_CONCURRENT_DEQUE_BASE_HPP
4 //////////////////////////////////////////////////////////////////////////////
6 // (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost
7 // Software License, Version 1.0. (See accompanying file
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 // See http://www.boost.org/libs/thread for documentation.
12 //////////////////////////////////////////////////////////////////////////////
14 #include <boost/thread/detail/config.hpp>
15 #include <boost/thread/detail/move.hpp>
16 #include <boost/thread/concurrent_queues/queue_op_status.hpp>
17 #include <boost/type_traits/conditional.hpp>
18 #include <boost/type_traits/is_copy_constructible.hpp>
21 #include <boost/config/abi_prefix.hpp>
30 template <typename ValueType, class SizeType>
31 class deque_base_copyable_only
34 typedef ValueType value_type;
35 typedef SizeType size_type;
37 // Constructors/Assignment/Destructors
38 virtual ~deque_base_copyable_only() {};
41 virtual bool empty() const = 0;
42 virtual bool full() const = 0;
43 virtual size_type size() const = 0;
44 virtual bool closed() const = 0;
47 virtual void close() = 0;
49 virtual void push_back(const value_type& x) = 0;
51 virtual void pull_front(value_type&) = 0;
52 virtual value_type pull_front() = 0;
54 virtual queue_op_status try_push_back(const value_type& x) = 0;
55 virtual queue_op_status try_pull_front(value_type&) = 0;
57 virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
58 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
60 virtual queue_op_status wait_push_back(const value_type& x) = 0;
61 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
65 template <typename ValueType, class SizeType>
66 class deque_base_movable_only
69 typedef ValueType value_type;
70 typedef SizeType size_type;
71 // Constructors/Assignment/Destructors
72 virtual ~deque_base_movable_only() {};
75 virtual bool empty() const = 0;
76 virtual bool full() const = 0;
77 virtual size_type size() const = 0;
78 virtual bool closed() const = 0;
81 virtual void close() = 0;
83 virtual void pull_front(value_type&) = 0;
84 // enable_if is_nothrow_movable<value_type>
85 virtual value_type pull_front() = 0;
87 virtual queue_op_status try_pull_front(value_type&) = 0;
89 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
91 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
93 virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
94 virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
95 virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
96 virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
100 template <typename ValueType, class SizeType>
101 class deque_base_copyable_and_movable
104 typedef ValueType value_type;
105 typedef SizeType size_type;
106 // Constructors/Assignment/Destructors
107 virtual ~deque_base_copyable_and_movable() {};
111 virtual bool empty() const = 0;
112 virtual bool full() const = 0;
113 virtual size_type size() const = 0;
114 virtual bool closed() const = 0;
117 virtual void close() = 0;
119 virtual void push_back(const value_type& x) = 0;
121 virtual void pull_front(value_type&) = 0;
122 // enable_if is_nothrow_copy_movable<value_type>
123 virtual value_type pull_front() = 0;
125 virtual queue_op_status try_push_back(const value_type& x) = 0;
126 virtual queue_op_status try_pull_front(value_type&) = 0;
128 virtual queue_op_status nonblocking_push_back(const value_type& x) = 0;
129 virtual queue_op_status nonblocking_pull_front(value_type&) = 0;
131 virtual queue_op_status wait_push_back(const value_type& x) = 0;
132 virtual queue_op_status wait_pull_front(value_type& elem) = 0;
134 virtual void push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
135 virtual queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
136 virtual queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
137 virtual queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) = 0;
140 template <class T, class ST,
141 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
142 #if defined __GNUC__ && ! defined __clang__
143 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
144 bool Copyable = is_copy_constructible<T>::value,
147 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
148 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
150 #elif defined _MSC_VER
152 bool Copyable = is_copy_constructible<T>::value,
155 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
156 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
159 bool Copyable = std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value,
160 bool Movable = std::is_move_constructible<T>::value && std::is_move_assignable<T>::value
163 bool Copyable = is_copy_constructible<T>::value,
164 bool Movable = has_move_emulation_enabled<T>::value
169 template <class T, class ST>
170 struct deque_base<T, ST, true, true> {
171 typedef deque_base_copyable_and_movable<T, ST> type;
173 template <class T, class ST>
174 struct deque_base<T, ST, true, false> {
175 typedef deque_base_copyable_only<T, ST> type;
177 template <class T, class ST>
178 struct deque_base<T, ST, false, true> {
179 typedef deque_base_movable_only<T, ST> type;
184 template <class ValueType, class SizeType=std::size_t>
186 public detail::deque_base<ValueType, SizeType>::type
189 typedef ValueType value_type;
190 typedef SizeType size_type;
191 // Constructors/Assignment/Destructors
192 virtual ~deque_base() {};
196 using concurrent::deque_base;
200 #include <boost/config/abi_suffix.hpp>