00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef NVBLASTFIXEDQUEUE_H
00030 #define NVBLASTFIXEDQUEUE_H
00031
00032 #include "NvBlastAssert.h"
00033 #include "NvBlastMemory.h"
00034
00035 namespace Nv
00036 {
00037 namespace Blast
00038 {
00039
00054 template <class T>
00055 class FixedQueue
00056 {
00057 public:
00058 explicit FixedQueue(uint32_t maxEntries) : m_num(0), m_head(0), m_tail(0), m_maxEntries(maxEntries)
00059 {
00060 }
00061
00062 static size_t requiredMemorySize(uint32_t capacity)
00063 {
00064 return align16(sizeof(FixedQueue<T>)) + align16(capacity * sizeof(T));
00065 }
00066
00067 T popFront()
00068 {
00069 NVBLAST_ASSERT(m_num>0);
00070
00071 m_num--;
00072 T& element = data()[m_tail];
00073 m_tail = (m_tail+1) % (m_maxEntries);
00074 return element;
00075 }
00076
00077 T front()
00078 {
00079 NVBLAST_ASSERT(m_num>0);
00080
00081 return data()[m_tail];
00082 }
00083
00084 T popBack()
00085 {
00086 NVBLAST_ASSERT(m_num>0);
00087
00088 m_num--;
00089 m_head = (m_head-1) % (m_maxEntries);
00090 return data()[m_head];
00091 }
00092
00093 T back()
00094 {
00095 NVBLAST_ASSERT(m_num>0);
00096
00097 uint32_t headAccess = (m_head-1) % (m_maxEntries);
00098 return data()[headAccess];
00099 }
00100
00101 bool pushBack(const T& element)
00102 {
00103 if (m_num == m_maxEntries) return false;
00104 data()[m_head] = element;
00105
00106 m_num++;
00107 m_head = (m_head+1) % (m_maxEntries);
00108
00109 return true;
00110 }
00111
00112 bool empty() const
00113 {
00114 return m_num == 0;
00115 }
00116
00117 uint32_t size() const
00118 {
00119 return m_num;
00120 }
00121
00122
00123 private:
00124 uint32_t m_num;
00125 uint32_t m_head;
00126 uint32_t m_tail;
00127 uint32_t m_maxEntries;
00128
00129 T* data()
00130 {
00131 return (T*)((char*)this + sizeof(FixedQueue<T>));
00132 }
00133
00134 private:
00135 FixedQueue(const FixedQueue& that);
00136 };
00137
00138 }
00139 }
00140
00141 #endif // ifndef NVBLASTFIXEDQUEUE_H