1 #ifndef SCHEDULERQUEUE_HH
2 #define SCHEDULERQUEUE_HH
26 , storageEnd(storage.data() +
CAPACITY)
32 [[nodiscard]]
size_t capacity()
const {
return storageEnd - storage.
data(); }
33 [[nodiscard]]
size_t spareFront()
const {
return useBegin - storage.
data(); }
34 [[nodiscard]]
size_t spareBack()
const {
return storageEnd - useEnd; }
35 [[nodiscard]]
size_t size()
const {
return useEnd - useBegin; }
36 [[nodiscard]]
bool empty()
const {
return useEnd == useBegin; }
40 [[nodiscard]] T&
front() {
return *useBegin; }
41 [[nodiscard]]
const T&
front()
const {
return *useBegin; }
43 [[nodiscard]] T*
begin() {
return useBegin; }
44 [[nodiscard]]
const T*
begin()
const {
return useBegin; }
45 [[nodiscard]] T*
end() {
return useEnd; }
46 [[nodiscard]]
const T*
end()
const {
return useEnd; }
55 template<
typename SET_SENTINEL,
typename LESS>
56 void insert(
const T&
t, SET_SENTINEL setSentinel, LESS less)
59 assert(less(
t, *useEnd));
62 while (!less(
t, *it)) ++it;
64 if ((it - useBegin) <= (useEnd - it)) {
67 }
else if (useEnd != storageEnd) {
73 if (
likely(useEnd != storageEnd)) {
75 }
else if (useBegin != storage.
data()) {
91 template<
typename PRED>
bool remove(PRED p)
94 if (it == useEnd)
return false;
96 if (
unlikely((it - useBegin) < (useEnd - it - 1))) {
98 std::copy_backward(useBegin - 1, it, it + 1);
113 void insertFront(T* it,
const T&
t)
120 void insertBack(T* it,
const T&
t)
123 std::copy_backward(it, useEnd -1, useEnd);
126 void insertRealloc(T* it,
const T&
t)
128 size_t oldSize = storageEnd - storage.
data();
129 size_t newSize = oldSize * 2;
131 MemBuffer<T> newStorage(newSize + 1);
134 *(newUseBegin + (it - useBegin)) =
t;
135 std::copy(it, useEnd, newUseBegin + (it - useBegin) + 1);
137 storage = std::move(newStorage);
138 storageEnd = storage.
data() + newSize;
139 useBegin = newUseBegin;
140 useEnd = useBegin + oldSize + 1;
145 MemBuffer<T> storage;
153 #endif // SCHEDULERQUEUE_HH