Chris@102: #ifndef BOOST_THREAD_QUEUE_VIEWS_HPP Chris@102: #define BOOST_THREAD_QUEUE_VIEWS_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: Chris@102: template Chris@102: class queue_back_view 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: queue_back_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {} 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(const value_type& x) { queue->push(x); } Chris@102: Chris@102: queue_op_status try_push(const value_type& x) { return queue->try_push(x); } Chris@102: Chris@102: queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push(x); } Chris@102: queue_op_status wait_push(const value_type& x) { return queue->wait_push(x); } Chris@102: Chris@102: void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push(boost::move(x)); } Chris@102: queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push(boost::move(x)); } Chris@102: queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push(boost::move(x)); } Chris@102: queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push(boost::move(x)); } Chris@102: }; Chris@102: Chris@102: template Chris@102: class queue_front_view 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: queue_front_view(Queue& q) BOOST_NOEXCEPT : queue(&q) {} 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(const value_type& x) { queue->push_front(x); } Chris@102: Chris@102: void pull(value_type& x) { queue->pull(x); }; Chris@102: // enable_if is_nothrow_copy_movable Chris@102: value_type pull() { return queue->pull(); } Chris@102: Chris@102: queue_op_status try_push(const value_type& x) { return queue->try_push_front(x); } Chris@102: Chris@102: queue_op_status try_pull(value_type& x) { return queue->try_pull(x); } Chris@102: Chris@102: queue_op_status nonblocking_push(const value_type& x) { return queue->nonblocking_push_front(x); } Chris@102: Chris@102: queue_op_status nonblocking_pull(value_type& x) { return queue->nonblocking_pull(x); } Chris@102: Chris@102: queue_op_status wait_push(const value_type& x) { return queue->wait_push_front(x); } Chris@102: queue_op_status wait_pull(value_type& x) { return queue->wait_pull(x); } Chris@102: void push(BOOST_THREAD_RV_REF(value_type) x) { queue->push_front(forward(x)); } Chris@102: queue_op_status try_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->try_push_front(forward(x)); } Chris@102: queue_op_status nonblocking_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->nonblocking_push_front(forward(x)); } Chris@102: queue_op_status wait_push(BOOST_THREAD_RV_REF(value_type) x) { return queue->wait_push_front(forward(x)); } Chris@102: Chris@102: }; Chris@102: Chris@102: #if ! defined BOOST_NO_CXX11_TEMPLATE_ALIASES Chris@102: Chris@102: template Chris@102: using queue_back = queue_back_view > ; Chris@102: template Chris@102: using queue_front = queue_front_view > ; Chris@102: Chris@102: #else Chris@102: Chris@102: template Chris@102: struct queue_back : queue_back_view > Chris@102: { Chris@102: typedef queue_back_view > base_type; Chris@102: queue_back(queue_base& q) BOOST_NOEXCEPT : base_type(q) {} Chris@102: }; Chris@102: template Chris@102: struct queue_front : queue_front_view > Chris@102: { Chris@102: typedef queue_front_view > base_type; Chris@102: queue_front(queue_base& q) BOOST_NOEXCEPT : base_type(q) {} Chris@102: Chris@102: }; Chris@102: Chris@102: #endif Chris@102: Chris@102: // template Chris@102: // queue_back_view back(Queue & q) { return queue_back_view(q); } Chris@102: // template Chris@102: // queue_front_view front(Queue & q) { return queue_front_view(q); } Chris@102: //#if 0 Chris@102: // template Chris@102: // queue_back back(queue_base & q) { return queue_back(q); } Chris@102: // template Chris@102: // queue_front front(queue_base & q) { return queue_front(q); } Chris@102: //#else Chris@102: // template Chris@102: // typename queue_back::type back(queue_base & q) { return typename queue_back::type(q); } Chris@102: // template Chris@102: // typename queue_front::type front(queue_base & q) { return typename queue_front::type(q); } Chris@102: //#endif Chris@102: } Chris@102: Chris@102: using concurrent::queue_back_view; Chris@102: using concurrent::queue_front_view; Chris@102: using concurrent::queue_back; Chris@102: using concurrent::queue_front; Chris@102: //using concurrent::back; Chris@102: //using concurrent::front; Chris@102: Chris@102: } Chris@102: Chris@102: #include Chris@102: Chris@102: #endif