79class BasicQueue : CopyGuard {
83 m_elem_size(0), m_capacity(0),
84 m_put(0), m_get(0), m_count(0) {}
86 BasicQueue(AddrT data_area, SizeT elem, NumT num) :
87 m_data_area(data_area), m_elem_size(elem), m_capacity(num),
88 m_put(0), m_get(0), m_count(0) {
92 ~BasicQueue() { D_ASSERT(empty()); }
98 void init(AddrT data_area, SizeT elem, NumT num) {
100 D_ASSERT(is_init() ==
false);
101 m_data_area = data_area;
107 SizeT elem_size()
const {
return m_elem_size; }
108 NumT capacity()
const {
return m_capacity; }
109 NumT size()
const {
return m_count; }
110 NumT rest()
const {
return static_cast<NumT
>(capacity() - size()); }
111 bool empty()
const {
return size() == 0; }
112 bool full()
const {
return size() == capacity(); }
115 printf(
"dump: put=%u, get=%u, capa=%u, elem=%u, size=%u, rest=%u, empty=%d, full=%d\n",
116 m_put, m_get, capacity(), elem_size(), size(), rest(), empty(), full());
117 printf(
" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n");
118 for (NumT i = 0; i < capacity(); ++i) {
120 for (NumT j = 0; j < MIN(elem_size(), 16); ++j) {
121 printf(
"%02x ",
static_cast<uint8_t*
>(getAddr(i))[j]);
127 void dump_active()
const {
128 printf(
"dump: size=%u, rest=%u\n", size(), rest());
129 printf(
" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n");
130 for (NumT i = 0; i < size(); ++i) {
132 for (NumT j = 0; j < MIN(elem_size(), 16); ++j) {
133 printf(
"%02x ",
static_cast<uint8_t*
>(getAddr(getIndex(i)))[j]);
148 bool push(
const void* data, SizeT len) {
149 D_ASSERT2(len <= elem_size(),
AssertParamLog(AssertIdSizeError, len, elem_size()));
150 if (full())
return false;
151 memcpy(getAddr(m_put), data, len);
159 bool push(
const T& data) {
160 D_ASSERT2(
sizeof(T) <= elem_size(),
AssertParamLog(AssertIdSizeError,
sizeof(T), elem_size()));
161 if (full())
return false;
162 ::new(getAddr(m_put)) T(data);
170 if (empty())
return false;
179 D_ASSERT2(
sizeof(T) <= elem_size(),
AssertParamLog(AssertIdSizeError,
sizeof(T), elem_size()));
180 if (empty())
return false;
181 static_cast<T*
>(getAddr(m_get))->~T();
189 const T& top()
const {
return at<T>(0); }
194 const T& at(NumT n)
const {
195 D_ASSERT2(
sizeof(T) <= elem_size(),
AssertParamLog(AssertIdSizeError,
sizeof(T), elem_size()));
196 D_ASSERT2(n < m_count,
AssertParamLog(AssertIdBadParam, n, m_count));
197 return *
static_cast<T*
>(getAddr(getIndex(n)));
201 T& writable_at(NumT n) {
return const_cast<T&
>(at<T>(n)); }
206 const T& front()
const {
return at<T>(0); }
209 T& front() {
return writable_at<T>(0); }
214 const T& back()
const {
return at<T>(
static_cast<NumT
>(m_count - 1)); }
217 T& back() {
return writable_at<T>(
static_cast<NumT
>(m_count - 1)); }
222 if (++m_put == capacity()) {
229 memset(getAddr(m_get), FillAfterPop, elem_size());
232 if (++m_get == capacity()) {
237 NumT getIndex(NumT n)
const {
238 return static_cast<NumT
>((m_get + n < capacity()) ? m_get + n : m_get + n - capacity());
243 void* getAddr(NumT n)
const {
return getAddr(n, AddrT()); }
245 void* getAddr(NumT n, drm_t )
const {
246 return static_cast<uint8_t*
>(DRM_TO_CACHED_VA(m_data_area)) + n * elem_size();
249 void* getAddr(NumT n,
void* )
const {
250 return static_cast<uint8_t*
>(m_data_area) + n * elem_size();