embkernel
 All Classes Functions Variables Typedefs Groups Pages
RtosList.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
8 #include "RtosList.hpp"
9 #include "RtosListIterable.hpp"
10 #include "RtosInclude.hpp"
11 
15 RtosList::RtosList() {
16  mFirst = 0;
17  mLast = 0;
18 }
19 
25  iterable.mNext = mFirst;
26  if (mFirst) {
27  mFirst->mPrev = &iterable;
28  }
29  else {
30  mLast = &iterable;
31  }
32  iterable.mPrev = 0;
33  iterable.mListOwner = this;
34  mFirst = &iterable;
35 }
36 
42  iterable.mPrev = mLast;
43  if (mLast) {
44  mLast->mNext = &iterable;
45  }
46  else {
47  mFirst = &iterable;
48  }
49  iterable.mNext = 0;
50  iterable.mListOwner = this;
51  mLast = &iterable;
52 }
53 
59  RtosListIterable *next = mFirst;
60 
61  //Iterate through the list until the right position
62  for (uint32_t sortValue = iterable.mSortValue; next && (next->mSortValue <= sortValue); next = next->mNext) {
63  }
64 
65  if (!next) { //End of the list or empty list
66  insertAtEnd(iterable);
67  }
68  else { //Insert the item
69  iterable.mPrev = next->mPrev;
70  iterable.mNext = next;
71  next->mPrev = &iterable;
72 
73  if (!iterable.mPrev) { //First item in the list
74  mFirst = &iterable;
75  }
76  else {
77  iterable.mPrev->mNext = &iterable;
78  }
79  }
80  iterable.mListOwner = this;
81 }
82 
88 void RtosList::insertSorted(RtosListIterable& iterable, uint32_t current) {
89  RtosListIterable *next = mFirst;
90 
91  //Is value overflow?
92  if (iterable.mSortValue < current) {
93  //Iterate through the list until the right position
94  for (uint32_t sortValue = iterable.mSortValue; next && ((next->mSortValue <= sortValue) || (next->mSortValue >= current)); next = next->mNext) {
95  }
96  }
97  else {
98  //Iterate through the list until the right position
99  for (uint32_t sortValue = iterable.mSortValue; next && (next->mSortValue <= sortValue) && (next->mSortValue >= current); next = next->mNext) {
100  }
101  }
102 
103  if (!next) { //End of the list or empty list
104  insertAtEnd(iterable);
105  }
106  else { //Insert the item
107  iterable.mPrev = next->mPrev;
108  iterable.mNext = next;
109  next->mPrev = &iterable;
110 
111  if (!iterable.mPrev) { //First item in the list
112  mFirst = &iterable;
113  }
114  else {
115  iterable.mPrev->mNext = &iterable;
116  }
117  }
118  iterable.mListOwner = this;
119 }
120 
126  RtosListIterable* prev = iterable.mPrev;
127  RtosListIterable* next = iterable.mNext;
128 
129  if (!prev) { //first item in the list
130  if (!next) { //only item in the list
131  mFirst = 0;
132  mLast = 0;
133  }
134  else {
135  mFirst = next;
136  next->mPrev = 0;
137  }
138  }
139  else if (!next) { //last item in the list
140  mLast = prev;
141  prev->mNext = 0;
142  }
143  else { //in the middle of the list
144  prev->mNext = next;
145  next->mPrev = prev;
146  }
147 
148  iterable.mPrev = 0;
149  iterable.mNext = 0;
150  iterable.mListOwner = 0;
151 }
152 
159  RtosListIterable* iterator;
160  for (iterator = mFirst; iterator; iterator = iterator->mNext) {
161  if (iterator == &iterable) {
162  return true;
163  }
164  }
165  return false;
166 }
167 
173  if (!mFirst) {
174  return 0;
175  } //
176 
177  RtosListIterable* iterable = mFirst;
178 
179  if (!iterable->mNext) { //Last item in the list
180  mFirst = 0;
181  mLast = 0;
182  }
183  else {
184  mFirst = iterable->mNext;
185  mFirst->mPrev = 0;
186  }
187 
188  iterable->mPrev = 0;
189  iterable->mNext = 0;
190  iterable->mListOwner = 0;
191 
192  return iterable;
193 }