list.c++
2.04 KB
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
85
86
//====================================================================
// list.c++
//
// Copyright 1994, Silicon Graphics, Inc.
// All Rights Reserved.
//
// Author(s)
// Kevin Smith
//
// This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
// the contents of this file may not be disclosed to third parties, copied or
// duplicated in any form, in whole or in part, without the prior written
// permission of Silicon Graphics, Inc.
//
// RESTRICTED RIGHTS LEGEND:
// Use, duplication or disclosure by the Government is subject to restrictions
// as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
// and Computer Software clause at DFARS 252.227-7013, and/or in similar or
// successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
// rights reserved under the Copyright Laws of the United States.
//====================================================================
#include <libc.h>
#include <assert.h>
#include "list.h"
List::~List ()
{
while (first) {
RemoveData((ListNode **) &first);
}
}
void List::AppendData (ListIter where, void *data)
{
ListNode *newNode = new ListNode;
assert(newNode != 0);
newNode->thing = data;
if (where != 0 && (*where) != NULL) {
newNode->next = (*where)->next;
(*where)->next = newNode;
if ((*where) == last) {
last = newNode;
}
} else {
newNode->next = first;
first = newNode;
if (last == 0) last = newNode;
}
count++;
}
void List::RemoveData (ListIter where)
{
if (where == 0 || (*where) == 0) return;
ListNode *cell;
cell = (*where);
(*where) = (*where)->next;
if (cell == first) {
first = first->next;
if (first == 0) last = 0;
}
delete cell;
count--;
}
int List::FindByKey (ListIter &iter, void *key)
{
void *element;
for (PointToFirst(iter); (element = GetIteratorValue (iter)) != 0;
PointToNext(iter)) {
if (KeyCompare (key, element))
return 1;
}
return 0;
}
int List::KeyCompare (void *key, void *element)
{
return (key == element);
}