Mark3 Realtime Kernel
ll.h
Go to the documentation of this file.
1 /*===========================================================================
2  _____ _____ _____ _____
3  ___| _|__ __|_ |__ __|__ |__ __| __ |__ ______
4 | \ / | || \ || | || |/ / ||___ |
5 | \/ | || \ || \ || \ ||___ |
6 |__/\__/|__|_||__|\__\ __||__|\__\ __||__|\__\ __||______|
7  |_____| |_____| |_____| |_____|
8 
9 --[Mark3 Realtime Platform]--------------------------------------------------
10 
11 Copyright (c) 2012 - 2019 m0slevin, all rights reserved.
12 See license.txt for more information
13 =========================================================================== */
41 #pragma once
42 #include "kerneltypes.h"
43 
44 namespace Mark3
45 {
46 //---------------------------------------------------------------------------
52 class LinkList;
53 class DoubleLinkList;
54 class CircularLinkList;
55 
56 //---------------------------------------------------------------------------
63 {
64 protected:
67 
69 
75  void ClearNode();
76 
77 public:
85  LinkListNode* GetNext(void) { return next; }
93  LinkListNode* GetPrev(void) { return prev; }
94  friend class LinkList;
95  friend class DoubleLinkList;
96  friend class CircularLinkList;
97 };
98 
99 //---------------------------------------------------------------------------
107 template <typename T>
109 {
110 public:
111  T* GetNext() { return static_cast<T*>(LinkListNode::GetNext()); }
112  T* GetPrev() { return static_cast<T*>(LinkListNode::GetPrev()); }
113 };
114 //---------------------------------------------------------------------------
119 class LinkList
120 {
121 protected:
124 
125 public:
131  void Init()
132  {
133  m_pclHead = nullptr;
134  m_pclTail = nullptr;
135  }
136 
144  LinkListNode* GetHead() { return m_pclHead; }
145 
153  void SetHead(LinkListNode* pclNode_) { m_pclHead = pclNode_; }
154 
162  LinkListNode* GetTail() { return m_pclTail; }
163 
171  void SetTail(LinkListNode* pclNode_) { m_pclTail = pclNode_; }
172 };
173 
174 //---------------------------------------------------------------------------
179 class DoubleLinkList : public LinkList
180 {
181 public:
182  void* operator new(size_t sz, void* pv) { return reinterpret_cast<DoubleLinkList*>(pv); };
189  {
190  m_pclHead = nullptr;
191  m_pclTail = nullptr;
192  }
193 
201  void Add(LinkListNode* node_);
202 
210  void Remove(LinkListNode* node_);
211 };
212 
213 //---------------------------------------------------------------------------
219 {
220 public:
221  void* operator new(size_t sz, void* pv) { return (CircularLinkList*)pv; };
223  {
224  m_pclHead = nullptr;
225  m_pclTail = nullptr;
226  }
227 
234  void Add(LinkListNode* node_);
235 
242  void Remove(LinkListNode* node_);
243 
249  void PivotForward();
250 
256  void PivotBackward();
257 
266  void InsertNodeBefore(LinkListNode* node_, LinkListNode* insert_);
267 };
268 
269 //---------------------------------------------------------------------------
275 template <typename T>
277 {
278 public:
279  void* operator new(size_t sz, void* pv) { return reinterpret_cast<TypedDoubleLinkList<T>*>(pv); }
280 
283  }
284 
291  T* GetHead() { return static_cast<T*>(DoubleLinkList::GetHead()); }
292 
299  void SetHead(T* pclNode_) { DoubleLinkList::SetHead(pclNode_); }
300 
307  T* GetTail() { return static_cast<T*>(DoubleLinkList::GetTail()); }
308 
315  void SetTail(T* pclNode_) { DoubleLinkList::SetTail(pclNode_); }
316 
323  void Add(T* pNode_)
324  {
325  DoubleLinkList::Add(pNode_);
326  }
327 
334  void Remove(T* pNode_)
335  {
336  DoubleLinkList::Remove(pNode_);
337  }
338 };
339 
340 //---------------------------------------------------------------------------
346 template <typename T>
348 {
349 public:
350  void* operator new(size_t sz, void* pv) { return reinterpret_cast<TypedCircularLinkList<T>*>(pv); }
351 
354  }
355 
362  T* GetHead() { return static_cast<T*>(CircularLinkList::GetHead()); }
363 
370  void SetHead(T* pclNode_) { CircularLinkList::SetHead(pclNode_); }
371 
378  T* GetTail() { return static_cast<T*>(CircularLinkList::GetTail()); }
379 
386  void SetTail(T* pclNode_) { CircularLinkList::SetTail(pclNode_); }
387 
394  void Add(T* pNode_)
395  {
396  CircularLinkList::Add(pNode_);
397  }
398 
405  void Remove(T* pNode_)
406  {
407  CircularLinkList::Remove(pNode_);
408  }
409 
418  void InsertNodeBefore(T* pNode_, T* pInsert_)
419  {
420  CircularLinkList::InsertNodeBefore(pNode_, pInsert_);
421  }
422 };
423 } // namespace Mark3
Basic data type primatives used throughout the OS.
Definition: atomic.cpp:23
T Add(T *pSource_, T val_)
Add Add a value to a variable in an uninterruptable operation.
Definition: atomic.h:64