1 /******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
14 ******************************************************************************/
24 Item(const Item<T> & other); // not implemented
25 Item<T> & operator=(const Item<T> & rhs); // not implemented
26 // Default destructor is used
31 Item * Next; // pointer to the next element
32 Item * Prev; // pointer to the previous element
47 * Number of nodes in the list
52 * The initial node in the list
57 * The final node in the list
68 List(const List<T> & other);
69 List<T> & operator=(const List<T> & other);
72 typedef Item<T> * iterator;
75 * Returns the size of the list
77 size_t length() const {
86 * True if List is empty, false otherwise
98 * Sort the list using the < operator.
99 * To be used when T is a type with operator<
104 * Sort the list using the compare function.
105 * To be used when T is a pointer but we don't want to compare the pointers.
107 void sort(bool (*comparison_function)(const T lhs, const T rhs));
110 * Returns with a pointer to the begin of the list
112 Item<T> * begin() const {
117 * Returns with a pointer to the end of the list
119 Item<T> * end() const {
124 * Returns with reference to the first element
130 const T & front() const {
135 * Returns with reference to the last element
141 const T & back() const {
146 * Pushes element at the end of the list
148 void push_back(const T & element);
151 * Pushes element at the front of the list
153 void push_front(const T & element);
156 * Removes the final element in the list
161 * Removes the node from the list
163 void remove(iterator& node);
166 * Removes duplicated elements from the list.
179 List<T>::List(const List<T> & other)
183 if (other.empty()) return;
185 Item<T> * CurrentNode = other.First;
186 Item<T> * MyFinalNode = NULL;
188 while (CurrentNode != NULL) {
189 if (MyFinalNode == NULL) // first element
191 MyFinalNode = new Item<T>;
192 MyFinalNode->Data = CurrentNode->Data;
193 MyFinalNode->Next = NULL;
194 MyFinalNode->Prev = NULL;
198 MyFinalNode->Next = new Item<T>;
199 MyFinalNode->Next->Data = CurrentNode->Data;
200 MyFinalNode->Next->Next = NULL;
201 MyFinalNode->Next->Prev = MyFinalNode;
202 MyFinalNode = MyFinalNode->Next;
206 CurrentNode = CurrentNode->Next;
217 List<T> & List<T>::operator=(const List<T> & other) {
220 if (other.empty()) return *this;
222 Item<T> * CurrentNode = other.First;
223 Item<T> * MyFinalNode = NULL;
225 while (CurrentNode != NULL) {
226 if (MyFinalNode == NULL) {
227 MyFinalNode = new Item<T>;
228 MyFinalNode->Data = CurrentNode->Data;
229 MyFinalNode->Next = NULL;
230 MyFinalNode->Prev = NULL;
234 MyFinalNode->Next = new Item<T>;
235 MyFinalNode->Next->Data = CurrentNode->Data;
236 MyFinalNode->Next->Next = CurrentNode->Next;
237 MyFinalNode->Next->Prev = MyFinalNode;
238 MyFinalNode = MyFinalNode->Next;
242 CurrentNode = CurrentNode->Next;
250 void List<T>::freeMemory() {
251 if (Size > 0) // if list is not empty
253 Item<T> * CurrentNode = First;
254 Item<T> * NodeForDelete = NULL;
256 for (size_t i = 0; i != Size; ++i) {
257 NodeForDelete = CurrentNode;
258 CurrentNode = CurrentNode->Next;
259 delete NodeForDelete;
270 void List<T>::remove(iterator& node) {
271 if (Size == 0) return;
273 if (node == NULL) return;
275 if (node->Prev == NULL) // if this node was the first element in the list
279 node->Prev->Next = node->Next;
282 if (node->Next == NULL) // if this node was the last element in the list
286 node->Next->Prev = node->Prev;
296 void List<T>::clear() {
301 void List<T>::sort() {
302 if (Size <= 1) return;
305 for (Item<T>* left = First; left; left = left->Next) {
306 Item<T>* mini = left;
307 for (Item<T>* curr = left->Next; curr; curr = curr->Next) {
308 if (curr->Data < mini->Data) mini = curr;
313 mini->Data = left->Data;
320 void List<T>::sort(bool (*comparison_function)(const T lhs, const T rhs)) {
321 if (Size <= 1) return;
324 for (Item<T>* left = First; left; left = left->Next) {
325 Item<T>* mini = left;
326 for (Item<T>* curr = left->Next; curr; curr = curr->Next) {
327 if (comparison_function(curr->Data, mini->Data)) mini = curr;
332 mini->Data = left->Data;
339 void List<T>::push_back(const T & element) {
340 Item<T> * NewNode = new Item<T>;
341 NewNode->Data = element;
342 NewNode->Next = NULL;
344 if (Size == 0) // if list is empty
346 NewNode->Prev = NULL;
350 NewNode->Prev = Last;
351 Last->Next = NewNode;
359 void List<T>::push_front(const T & element) {
360 Item<T> * NewNode = new Item<T>;
361 NewNode->Data = element;
362 NewNode->Prev = NULL;
364 if (Size == 0) // if list is empty
366 NewNode->Next = NULL;
370 NewNode->Next = First;
371 First->Prev = NewNode;
379 void List<T>::pop_back() {
380 Item<T> * LastNode = Last;
387 } else if (Size > 1) {
388 Last->Prev->Next = NULL;
396 void List<T>::remove_dups() {
397 Item<T>* ptr1 = First, *ptr2, *dup;
399 while (ptr1 != NULL && ptr1->Next != NULL) {
401 while (ptr2->Next != NULL) {
402 if (ptr1->Data == ptr2->Next->Data) {
404 ptr2->Next = ptr2->Next->Next;
405 //If the last element is a duplicate
406 if (ptr2->Next == NULL) {
409 ptr2->Next->Prev = ptr2;
422 #endif /* LIST_HH_ */