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 AtomicInt _front;
00064 AtomicInt _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.get() == _front.get());
00095 }
00096
00097
00100 template <typename T>
00101 inline bool
00102 SRSWQueue<T>::full() const
00103 {
00104 return (((_front.get() - _back.get() + _size) % _size) == 1);
00105 }
00106
00107
00110 template <typename T>
00111 inline T&
00112 SRSWQueue<T>::front() const
00113 {
00114 return _objects[_front.get()];
00115 }
00116
00117
00123 template <typename T>
00124 inline bool
00125 SRSWQueue<T>::push(const T& elem)
00126 {
00127 if (full()) {
00128 return false;
00129 } else {
00130 unsigned back = _back.get();
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.get() + 1) % (_size);
00152 }
00153
00154
00155 }
00156
00157 #endif // RAUL_SRSW_QUEUE_HPP