28 #include <boost/circular_buffer.hpp>
29 #include <boost/noncopyable.hpp>
38 typedef typename container_type::size_type
size_type;
40 typedef typename boost::call_traits<value_type>::param_type
param_type;
43 : mNumUnread( 0 ), mContainer( capacity ), mCanceled( false )
48 std::unique_lock<std::mutex> lock( mMutex );
49 while( ! is_not_full_impl() && ! mCanceled ) {
50 mNotFullCond.wait( lock );
54 mContainer.push_front( item );
56 mNotEmptyCond.notify_one();
60 std::unique_lock<std::mutex> lock( mMutex );
61 while( ! is_not_empty_impl() && ! mCanceled ) {
62 mNotEmptyCond.wait( lock );
66 *pItem = mContainer[--mNumUnread];
67 mNotFullCond.notify_one();
73 std::unique_lock<std::mutex> lock( mMutex );
74 if( ! is_not_full_impl() )
76 mContainer.push_front( item );
78 mNotEmptyCond.notify_one();
84 std::unique_lock<std::mutex> lock( mMutex );
85 if( ! is_not_empty_impl() )
87 *pItem = mContainer[--mNumUnread];
88 mNotFullCond.notify_one();
93 std::unique_lock<std::mutex> lock( mMutex );
94 return is_not_empty_impl();
98 std::unique_lock<std::mutex> lock( mMutex );
99 return is_not_full_impl();
103 std::lock_guard<std::mutex> lock( mMutex );
105 mNotFullCond.notify_all();
106 mNotEmptyCond.notify_all();
110 size_t size()
const {
return (
size_t)mContainer.capacity(); }
113 bool is_not_empty_impl()
const {
return mNumUnread > 0; }
114 bool is_not_full_impl()
const {
return mNumUnread < mContainer.capacity(); }
119 std::condition_variable mNotEmptyCond;
120 std::condition_variable mNotFullCond;
bool tryPushFront(param_type item)
Attempts to push item to the front of the buffer, but does not wait for an availability. Returns success as true or false.
Definition: ConcurrentCircularBuffer.h:71
container_type::value_type value_type
Definition: ConcurrentCircularBuffer.h:39
size_t size() const
Returns the number of items the buffer can hold.
Definition: ConcurrentCircularBuffer.h:110
Definition: ConcurrentCircularBuffer.h:35
bool isNotEmpty()
Definition: ConcurrentCircularBuffer.h:92
boost::call_traits< value_type >::param_type param_type
Definition: ConcurrentCircularBuffer.h:40
bool tryPopBack(value_type *pItem)
Attempts to pop an item from the back of the buffer, but does not wait for an availability. Returns success as true or false.
Definition: ConcurrentCircularBuffer.h:83
void popBack(value_type *pItem)
Definition: ConcurrentCircularBuffer.h:59
void cancel()
Definition: ConcurrentCircularBuffer.h:102
boost::circular_buffer< T > container_type
Definition: ConcurrentCircularBuffer.h:37
void pushFront(param_type item)
Definition: ConcurrentCircularBuffer.h:46
ConcurrentCircularBuffer(size_type capacity)
Definition: ConcurrentCircularBuffer.h:42
container_type::size_type size_type
Definition: ConcurrentCircularBuffer.h:38
bool isNotFull()
Definition: ConcurrentCircularBuffer.h:97