forked from RangeNetworks/CommonLibs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LinkedLists.cpp
84 lines (78 loc) · 2.12 KB
/
LinkedLists.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* CommonLibs/LinkedLists.cpp */
/*-
* Copyright 2008 Free Software Foundation, Inc.
* Copyright 2014 Range Networks, Inc.
*
* This software is distributed under the terms of the GNU Affero Public License.
* See the COPYING file in the main directory for details.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LinkedLists.h"
void PointerFIFO::push_front(void *val) // by pat
{
// Pat added this routine for completeness, but never used or tested.
// The first person to use this routine should remove this assert.
ListNode *node = allocate();
node->data(val);
node->next(mHead);
mHead = node;
if (!mTail)
mTail = node;
mSize++;
}
void PointerFIFO::put(void *val)
{
ListNode *node = allocate();
node->data(val);
node->next(NULL);
if (mTail != NULL)
mTail->next(node);
mTail = node;
if (mHead == NULL)
mHead = node;
mSize++;
}
/** Take an item from the FIFO. */
void *PointerFIFO::get()
{
// empty list?
if (mHead == NULL)
return NULL;
// normal case
ListNode *next = mHead->next();
void *retVal = mHead->data();
release(mHead);
mHead = next;
if (next == NULL)
mTail = NULL;
mSize--;
return retVal;
}
ListNode *PointerFIFO::allocate()
{
if (mFreeList == NULL)
return new ListNode;
ListNode *retVal = mFreeList;
mFreeList = mFreeList->next();
return retVal;
}
void PointerFIFO::release(ListNode *wNode)
{
wNode->next(mFreeList);
mFreeList = wNode;
}