Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/xslt/base/txList.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6
#include "txList.h"
7
8
  //----------------------------/
9
 //- Implementation of txList -/
10
//----------------------------/
11
12
/**
13
 * Default constructor for a txList;
14
**/
15
16
0
txList::txList() {
17
0
   firstItem  = 0;
18
0
   lastItem   = 0;
19
0
   itemCount  = 0;
20
0
} //-- txList;
21
22
/**
23
 * txList destructor, cleans up ListItems, but will not delete the Object
24
 * references
25
*/
26
0
txList::~txList() {
27
0
    clear();
28
0
} //-- ~txList
29
30
nsresult txList::add(void* objPtr)
31
0
{
32
0
    return insertBefore(objPtr, 0);
33
0
} //-- add
34
35
/**
36
 * Returns the number of items in this txList
37
**/
38
0
int32_t List::getLength() {
39
0
   return itemCount;
40
0
} //-- getLength
41
42
43
/**
44
 * Inserts the given Object pointer as the item just after refItem.
45
 * If refItem is a null pointer the Object will be inserted at the
46
 * beginning of the txList (ie, insert after nothing).
47
 * This method assumes refItem is a member of this list, and since this
48
 * is a private method, I feel that's a valid assumption
49
**/
50
nsresult txList::insertAfter(void* objPtr, ListItem* refItem)
51
0
{
52
0
    //-- if refItem == null insert at front
53
0
    if (!refItem)
54
0
        return insertBefore(objPtr, firstItem);
55
0
    return insertBefore(objPtr, refItem->nextItem);
56
0
} //-- insertAfter
57
58
/**
59
 * Inserts the given Object pointer as the item just before refItem.
60
 * If refItem is a null pointer the Object will be inserted at the
61
 * end of the txList (ie, insert before nothing).
62
 * This method assumes refItem is a member of this list, and since this
63
 * is a private method, I feel that's a valid assumption
64
**/
65
nsresult txList::insertBefore(void* objPtr, ListItem* refItem)
66
0
{
67
0
    ListItem* item = new ListItem;
68
0
    item->objPtr = objPtr;
69
0
    item->nextItem = 0;
70
0
    item->prevItem = 0;
71
0
72
0
    //-- if refItem == null insert at end
73
0
    if (!refItem) {
74
0
        //-- add to back of list
75
0
        if (lastItem) {
76
0
            lastItem->nextItem = item;
77
0
            item->prevItem = lastItem;
78
0
        }
79
0
        lastItem = item;
80
0
        if (!firstItem)
81
0
            firstItem = item;
82
0
    }
83
0
    else {
84
0
        //-- insert before given item
85
0
        item->nextItem = refItem;
86
0
        item->prevItem = refItem->prevItem;
87
0
        refItem->prevItem = item;
88
0
89
0
        if (item->prevItem)
90
0
            item->prevItem->nextItem = item;
91
0
        else
92
0
            firstItem = item;
93
0
    }
94
0
95
0
    // increase the item count
96
0
    ++itemCount;
97
0
98
0
    return NS_OK;
99
0
} //-- insertBefore
100
101
0
txList::ListItem* txList::remove(ListItem* item) {
102
0
103
0
    if (!item)
104
0
        return item;
105
0
106
0
    //-- adjust the previous item's next pointer
107
0
    if (item->prevItem) {
108
0
        item->prevItem->nextItem = item->nextItem;
109
0
    }
110
0
    //-- adjust the next item's previous pointer
111
0
    if (item->nextItem) {
112
0
        item->nextItem->prevItem = item->prevItem;
113
0
    }
114
0
115
0
    //-- adjust first and last items
116
0
    if (item == firstItem)
117
0
        firstItem = item->nextItem;
118
0
    if (item == lastItem)
119
0
        lastItem = item->prevItem;
120
0
121
0
    //-- decrease Item count
122
0
    --itemCount;
123
0
    return item;
124
0
} //-- remove
125
126
void txList::clear()
127
0
{
128
0
    ListItem* item = firstItem;
129
0
    while (item) {
130
0
        ListItem* tItem = item;
131
0
        item = item->nextItem;
132
0
        delete tItem;
133
0
    }
134
0
    firstItem  = 0;
135
0
    lastItem   = 0;
136
0
    itemCount  = 0;
137
0
}
138
139
  //------------------------------------/
140
 //- Implementation of txListIterator -/
141
//------------------------------------/
142
143
144
/**
145
 * Creates a new txListIterator for the given txList
146
 * @param list, the txList to create an Iterator for
147
**/
148
0
txListIterator::txListIterator(txList* list) {
149
0
   this->list   = list;
150
0
   currentItem  = 0;
151
0
   atEndOfList  = false;
152
0
} //-- txListIterator
153
154
/**
155
 * Adds the Object pointer to the txList pointed to by this txListIterator.
156
 * The Object pointer is inserted as the next item in the txList
157
 * based on the current position within the txList
158
 * @param objPtr the Object pointer to add to the list
159
**/
160
nsresult txListIterator::addAfter(void* objPtr)
161
0
{
162
0
    if (currentItem || !atEndOfList)
163
0
        return list->insertAfter(objPtr, currentItem);
164
0
    return list->insertBefore(objPtr, 0);
165
0
166
0
} //-- addAfter
167
168
/**
169
 * Adds the Object pointer to the txList pointed to by this txListIterator.
170
 * The Object pointer is inserted as the previous item in the txList
171
 * based on the current position within the txList
172
 * @param objPtr the Object pointer to add to the list
173
**/
174
nsresult txListIterator::addBefore(void* objPtr)
175
0
{
176
0
    if (currentItem || atEndOfList)
177
0
        return list->insertBefore(objPtr, currentItem);
178
0
    return list->insertAfter(objPtr, 0);
179
0
180
0
} //-- addBefore
181
182
/**
183
 * Returns true if a successful call to the next() method can be made
184
 * @return true if a successful call to the next() method can be made,
185
 * otherwise false
186
**/
187
0
bool txListIterator::hasNext() {
188
0
    bool hasNext = false;
189
0
    if (currentItem)
190
0
        hasNext = (currentItem->nextItem != 0);
191
0
    else if (!atEndOfList)
192
0
        hasNext = (list->firstItem != 0);
193
0
194
0
    return hasNext;
195
0
} //-- hasNext
196
197
/**
198
 * Returns the next Object pointer in the list
199
**/
200
0
void* txListIterator::next() {
201
0
202
0
    void* obj = 0;
203
0
    if (currentItem)
204
0
        currentItem = currentItem->nextItem;
205
0
    else if (!atEndOfList)
206
0
        currentItem = list->firstItem;
207
0
208
0
    if (currentItem)
209
0
        obj = currentItem->objPtr;
210
0
    else
211
0
        atEndOfList = true;
212
0
213
0
    return obj;
214
0
} //-- next
215
216
/**
217
 * Returns the previous Object in the list
218
**/
219
0
void* txListIterator::previous() {
220
0
221
0
    void* obj = 0;
222
0
223
0
    if (currentItem)
224
0
        currentItem = currentItem->prevItem;
225
0
    else if (atEndOfList)
226
0
        currentItem = list->lastItem;
227
0
228
0
    if (currentItem)
229
0
        obj = currentItem->objPtr;
230
0
231
0
    atEndOfList = false;
232
0
233
0
    return obj;
234
0
} //-- previous
235
236
/**
237
 * Returns the current Object
238
**/
239
0
void* txListIterator::current() {
240
0
241
0
    if (currentItem)
242
0
        return currentItem->objPtr;
243
0
244
0
    return 0;
245
0
} //-- current
246
247
/**
248
 * Removes the Object last returned by the next() or previous() methods;
249
 * @return the removed Object pointer
250
**/
251
0
void* txListIterator::remove() {
252
0
253
0
    void* obj = 0;
254
0
    if (currentItem) {
255
0
        obj = currentItem->objPtr;
256
0
        txList::ListItem* item = currentItem;
257
0
        previous(); //-- make previous item the current item
258
0
        list->remove(item);
259
0
        delete item;
260
0
    }
261
0
    return obj;
262
0
} //-- remove
263
264
/**
265
 * Resets the current location within the txList to the beginning of the txList
266
**/
267
0
void txListIterator::reset() {
268
0
   atEndOfList = false;
269
0
   currentItem = 0;
270
0
} //-- reset
271
272
/**
273
 * Move the iterator to right after the last element
274
**/
275
0
void txListIterator::resetToEnd() {
276
0
   atEndOfList = true;
277
0
   currentItem = 0;
278
0
} //-- moveToEnd