20#ifndef KERNEL_UTILITIES_LIST_H
21#define KERNEL_UTILITIES_LIST_H
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/processor/types.h"
25#include "pedigree/kernel/utilities/Iterator.h"
26#include "pedigree/kernel/utilities/ObjectPool.h"
27#include "pedigree/kernel/utilities/assert.h"
28#include "pedigree/kernel/utilities/utility.h"
60template <
class T,
size_t nodePoolSize = 16>
61class EXPORTED_PUBLIC
List {
100 bool tryPushBack(T&& value);
186template <
typename T,
size_t nodePoolSize>
188 : m_Count(0), m_First(0), m_Last(0), m_Magic(0x1BADB002), m_NodePool() {}
190template <
typename T,
size_t nodePoolSize>
192 : m_Count(0), m_First(0), m_Last(0), m_Magic(0x1BADB002), m_NodePool() {
195template <
typename T,
size_t nodePoolSize>
197 assert(m_Magic == 0x1BADB002);
201template <
typename T,
size_t nodePoolSize>
207template <
typename T,
size_t nodePoolSize>
211template <
typename T,
size_t nodePoolSize>
215template <
typename T,
size_t nodePoolSize>
217 node_t* newNode = m_NodePool.allocate();
220 newNode->
value = value;
230template <
typename T,
size_t nodePoolSize>
232 node_t* newNode = m_NodePool.allocate();
235 newNode->
value = pedigree_std::move(value);
245template <
typename T,
size_t nodePoolSize>
247 node_t* newNode = m_NodePool.tryAllocate();
250 newNode->
m_Next =
nullptr;
252 newNode->
value = value;
254 m_Last->m_Next = newNode;
261template <
typename T,
size_t nodePoolSize>
263 node_t* newNode = m_NodePool.tryAllocate();
266 newNode->
m_Next =
nullptr;
268 newNode->
value = pedigree_std::move(value);
270 m_Last->m_Next = newNode;
277template <
typename T,
size_t nodePoolSize>
280 if (!m_Last && !m_First)
285 m_Last = m_Last->m_Previous;
295 T value = node->value;
296 m_NodePool.deallocate(node);
299template <
typename T,
size_t nodePoolSize>
301 node_t* newNode = m_NodePool.allocate();
302 newNode->
m_Next = m_First;
304 newNode->
value = value;
314template <
typename T,
size_t nodePoolSize>
316 node_t* newNode = m_NodePool.allocate();
317 newNode->
m_Next = m_First;
319 newNode->
value = pedigree_std::move(value);
329template <
typename T,
size_t nodePoolSize>
332 if (!m_Last && !m_First)
337 m_First = m_First->m_Next;
339 m_First->m_Previous = 0;
347 T value = node->value;
348 m_NodePool.deallocate(node);
351template <
typename T,
size_t nodePoolSize>
370 m_NodePool.deallocate(Node);
374template <
typename T,
size_t nodePoolSize>
394 m_NodePool.deallocate(Node);
398template <
typename T,
size_t nodePoolSize>
401 for (
size_t i = 0; i < m_Count; i++) {
404 m_NodePool.deallocate(tmp);
411template <
typename T,
size_t nodePoolSize>
421 for (; Cur != End; ++Cur)
An iterator applicable for many data structures.
ObjectPool< node_t, nodePoolSize > m_NodePool
Iterator::ConstReverse ConstReverseIterator
ConstIterator begin() const
Iterator::Reverse ReverseIterator
ConstReverseIterator rend() const
Iterator::Const ConstIterator
ConstReverseIterator rbegin() const
ConstIterator end() const
::Iterator< T, node_t > Iterator
Iterator erase(Iterator &Iter)
ReverseIterator erase(ReverseIterator &Iter)
bool tryPushBack(const T &value)
void pushFront(const T &value)
void pushBack(const T &value)
List & operator=(const List &x)
void pushFront(T &&value)
void assign(const List &x)