Chris@102: #ifndef BOOST_THREAD_CONCURRENT_DEQUE_ADAPTOR_HPP Chris@102: #define BOOST_THREAD_CONCURRENT_DEQUE_ADAPTOR_HPP Chris@102: Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Vicente J. Botet Escriba 2014. Distributed under the Boost Chris@102: // Software License, Version 1.0. (See accompanying file Chris@102: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/thread for documentation. Chris@102: // Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: namespace boost Chris@102: { Chris@102: namespace concurrent Chris@102: { Chris@102: namespace detail Chris@102: { Chris@102: Chris@102: template Chris@102: class deque_adaptor_copyable_only : Chris@102: public boost::deque_base Chris@102: { Chris@102: Queue queue; Chris@102: public: Chris@102: typedef typename Queue::value_type value_type; Chris@102: typedef typename Queue::size_type size_type; Chris@102: Chris@102: // Constructors/Assignment/Destructors Chris@102: deque_adaptor_copyable_only() {} Chris@102: Chris@102: // Observers Chris@102: bool empty() const { return queue.empty(); } Chris@102: bool full() const { return queue.full(); } Chris@102: size_type size() const { return queue.size(); } Chris@102: bool closed() const { return queue.closed(); } Chris@102: Chris@102: // Modifiers Chris@102: void close() { queue.close(); } Chris@102: Chris@102: void push_back(const value_type& x) { queue.push_back(x); } Chris@102: Chris@102: void pull_front(value_type& x) { queue.pull_front(x); }; Chris@102: value_type pull_front() { return queue.pull_front(); } Chris@102: Chris@102: queue_op_status try_push_back(const value_type& x) { return queue.try_push_back(x); } Chris@102: queue_op_status try_pull_front(value_type& x) { return queue.try_pull_front(x); } Chris@102: Chris@102: queue_op_status nonblocking_push_back(const value_type& x) { return queue.nonblocking_push_back(x); } Chris@102: queue_op_status nonblocking_pull_front(value_type& x) { return queue.nonblocking_pull_front(x); } Chris@102: Chris@102: queue_op_status wait_push_back(const value_type& x) { return queue.wait_push_back(x); } Chris@102: queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); } Chris@102: Chris@102: }; Chris@102: template Chris@102: class deque_adaptor_movable_only : Chris@102: public boost::deque_base Chris@102: { Chris@102: Queue queue; Chris@102: public: Chris@102: typedef typename Queue::value_type value_type; Chris@102: typedef typename Queue::size_type size_type; Chris@102: Chris@102: // Constructors/Assignment/Destructors Chris@102: Chris@102: deque_adaptor_movable_only() {} Chris@102: Chris@102: // Observers Chris@102: bool empty() const { return queue.empty(); } Chris@102: bool full() const { return queue.full(); } Chris@102: size_type size() const { return queue.size(); } Chris@102: bool closed() const { return queue.closed(); } Chris@102: Chris@102: // Modifiers Chris@102: void close() { queue.close(); } Chris@102: Chris@102: Chris@102: void pull_front(value_type& x) { queue.pull_front(x); }; Chris@102: // enable_if is_nothrow_copy_movable Chris@102: value_type pull_front() { return queue.pull_front(); } Chris@102: Chris@102: queue_op_status try_pull_front(value_type& x) { return queue.try_pull_front(x); } Chris@102: Chris@102: queue_op_status nonblocking_pull_front(value_type& x) { return queue.nonblocking_pull_front(x); } Chris@102: Chris@102: queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); } Chris@102: Chris@102: void push_back(BOOST_THREAD_RV_REF(value_type) x) { queue.push_back(boost::move(x)); } Chris@102: queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push_back(boost::move(x)); } Chris@102: queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push_back(boost::move(x)); } Chris@102: queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push_back(boost::move(x)); } Chris@102: }; Chris@102: Chris@102: template Chris@102: class deque_adaptor_copyable_and_movable : Chris@102: public boost::deque_base Chris@102: { Chris@102: Queue queue; Chris@102: public: Chris@102: typedef typename Queue::value_type value_type; Chris@102: typedef typename Queue::size_type size_type; Chris@102: Chris@102: // Constructors/Assignment/Destructors Chris@102: Chris@102: deque_adaptor_copyable_and_movable() {} Chris@102: Chris@102: // Observers Chris@102: bool empty() const { return queue.empty(); } Chris@102: bool full() const { return queue.full(); } Chris@102: size_type size() const { return queue.size(); } Chris@102: bool closed() const { return queue.closed(); } Chris@102: Chris@102: // Modifiers Chris@102: void close() { queue.close(); } Chris@102: Chris@102: Chris@102: void push_back(const value_type& x) { queue.push_back(x); } Chris@102: Chris@102: void pull_front(value_type& x) { queue.pull_front(x); }; Chris@102: // enable_if is_nothrow_copy_movable Chris@102: value_type pull_front() { return queue.pull_front(); } Chris@102: Chris@102: queue_op_status try_push_back(const value_type& x) { return queue.try_push_back(x); } Chris@102: queue_op_status try_pull_front(value_type& x) { return queue.try_pull_front(x); } Chris@102: Chris@102: queue_op_status nonblocking_push_back(const value_type& x) { return queue.nonblocking_push_back(x); } Chris@102: queue_op_status nonblocking_pull_front(value_type& x) { return queue.nonblocking_pull_front(x); } Chris@102: Chris@102: queue_op_status wait_push_back(const value_type& x) { return queue.wait_push_back(x); } Chris@102: queue_op_status wait_pull_front(value_type& x) { return queue.wait_pull_front(x); } Chris@102: Chris@102: void push_back(BOOST_THREAD_RV_REF(value_type) x) { queue.push_back(boost::move(x)); } Chris@102: queue_op_status try_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.try_push_back(boost::move(x)); } Chris@102: queue_op_status nonblocking_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.nonblocking_push_back(boost::move(x)); } Chris@102: queue_op_status wait_push_back(BOOST_THREAD_RV_REF(value_type) x) { return queue.wait_push_back(boost::move(x)); } Chris@102: }; Chris@102: Chris@102: Chris@102: template ::value, Chris@102: bool Movable = true Chris@102: #else Chris@102: bool Copyable = std::is_copy_constructible::value && std::is_copy_assignable::value, Chris@102: bool Movable = std::is_move_constructible::value && std::is_move_assignable::value Chris@102: #endif // __GNUC__ Chris@102: #elif defined _MSC_VER Chris@102: #if _MSC_VER < 1700 Chris@102: bool Copyable = is_copy_constructible::value, Chris@102: bool Movable = true Chris@102: #else Chris@102: bool Copyable = std::is_copy_constructible::value && std::is_copy_assignable::value, Chris@102: bool Movable = std::is_move_constructible::value && std::is_move_assignable::value Chris@102: #endif // _MSC_VER Chris@102: #else Chris@102: bool Copyable = std::is_copy_constructible::value && std::is_copy_assignable::value, Chris@102: bool Movable = std::is_move_constructible::value && std::is_move_assignable::value Chris@102: #endif Chris@102: #else Chris@102: bool Copyable = is_copy_constructible::value, Chris@102: bool Movable = has_move_emulation_enabled::value Chris@102: #endif Chris@102: > Chris@102: struct deque_adaptor; Chris@102: Chris@102: template Chris@102: struct deque_adaptor { Chris@102: typedef deque_adaptor_copyable_and_movable type; Chris@102: }; Chris@102: template Chris@102: struct deque_adaptor { Chris@102: typedef deque_adaptor_copyable_only type; Chris@102: }; Chris@102: template Chris@102: struct deque_adaptor { Chris@102: typedef deque_adaptor_movable_only type; Chris@102: }; Chris@102: Chris@102: } Chris@102: Chris@102: template Chris@102: class deque_adaptor : Chris@102: public detail::deque_adaptor::type Chris@102: { Chris@102: public: Chris@102: typedef typename Queue::value_type value_type; Chris@102: typedef typename Queue::size_type size_type; Chris@102: // Constructors/Assignment/Destructors Chris@102: virtual ~deque_adaptor() {}; Chris@102: }; Chris@102: } Chris@102: using concurrent::deque_adaptor; Chris@102: Chris@102: } Chris@102: Chris@102: #include Chris@102: Chris@102: #endif