#ifndef BOOST_LOCKFREE_SPSC_QUEUE_UNIQUE_PTR_HPP_INCLUDED #define BOOST_LOCKFREE_SPSC_QUEUE_UNIQUE_PTR_HPP_INCLUDED #include #include #ifndef BOOST_NO_CXX11_SMART_PTR #include #include #include #include namespace boost { namespace lockfree { template class spsc_queue> { typedef typename std::unique_ptr::pointer pointer_type; typedef spsc_queue queue_type; public: typedef T value_type; typedef typename queue_type::size_type size_type; spsc_queue(size_type size) : container(size) { } ~spsc_queue() { while (!container.empty()) { std::unique_ptr value; pop(value); } } bool empty() { return container.empty(); } bool push(std::unique_ptr& item) { auto status = container.push(item.get()); if (status) { item.release(); } return status; } template typename boost::enable_if_c< boost::is_convertible::value, bool>::type pop(std::unique_ptr& item) { assert(!container.empty()); value_type *value = nullptr; auto status = container.pop(value); if (status) { item.reset(value); } return status; } private: queue_type container; }; } // namespace lockfree } // namespace boost #endif #endif // BOOST_LOCKFREE_SPSC_QUEUE_UNIQUE_PTR_HPP_INCLUDED