00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RAUL_SRSW_QUEUE_HPP
00019 #define RAUL_SRSW_QUEUE_HPP
00020
00021 #include <cassert>
00022 #include <cstdlib>
00023 #include <boost/utility.hpp>
00024 #include <raul/AtomicInt.hpp>
00025
00026 namespace Raul {
00027
00028
00038 template <typename T>
00039 class SRSWQueue : boost::noncopyable
00040 {
00041 public:
00042 SRSWQueue(size_t size);
00043 ~SRSWQueue();
00044
00045
00046
00047 inline size_t capacity() const { return _size-1; }
00048
00049
00050
00051
00052 inline bool full() const;
00053 inline bool push(const T& obj);
00054
00055
00056
00057
00058 inline bool empty() const;
00059 inline T& front() const;
00060 inline void pop();
00061
00062 private:
00063 volatile size_t _front;
00064 volatile size_t _back;
00065 const size_t _size;
00066 T* const _objects;
00067 };
00068
00069
00070 template<typename T>
00071 SRSWQueue<T>::SRSWQueue(size_t size)
00072 : _front(0),
00073 _back(0),
00074 _size(size+1),
00075 _objects((T*)calloc(_size, sizeof(T)))
00076 {
00077 assert(size > 1);
00078 }
00079
00080
00081 template <typename T>
00082 SRSWQueue<T>::~SRSWQueue()
00083 {
00084 free(_objects);
00085 }
00086
00087
00090 template <typename T>
00091 inline bool
00092 SRSWQueue<T>::empty() const
00093 {
00094 return (_back == _front);
00095 }
00096
00097
00100 template <typename T>
00101 inline bool
00102 SRSWQueue<T>::full() const
00103 {
00104
00105 return ( ((_front - _back + _size) % _size) == 1 );
00106 }
00107
00108
00111 template <typename T>
00112 inline T&
00113 SRSWQueue<T>::front() const
00114 {
00115 return _objects[_front];
00116 }
00117
00118
00124 template <typename T>
00125 inline bool
00126 SRSWQueue<T>::push(const T& elem)
00127 {
00128 if (full()) {
00129 return false;
00130 } else {
00131 _objects[_back] = elem;
00132 _back = (_back + 1) % (_size);
00133 return true;
00134 }
00135 }
00136
00137
00144 template <typename T>
00145 inline void
00146 SRSWQueue<T>::pop()
00147 {
00148 assert(!empty());
00149 assert(_size > 0);
00150
00151 _front = (_front + 1) % (_size);
00152 }
00153
00154
00155 }
00156
00157 #endif // RAUL_SRSW_QUEUE_HPP