OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkRandom.h" | 8 #include "SkRandom.h" |
9 #include "SkTInternalLList.h" | 9 #include "SkTInternalLList.h" |
10 #include "SkTLList.h" | 10 #include "SkTLList.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 list.addToHead(&elements[2]); | 66 list.addToHead(&elements[2]); |
67 list.addToHead(&elements[3]); | 67 list.addToHead(&elements[3]); |
68 | 68 |
69 check_list(list, reporter, false, 4, true, true, true, true, elements); | 69 check_list(list, reporter, false, 4, true, true, true, true, elements); |
70 | 70 |
71 // test out iterators | 71 // test out iterators |
72 typedef SkTInternalLList<ListElement>::Iter Iter; | 72 typedef SkTInternalLList<ListElement>::Iter Iter; |
73 Iter iter; | 73 Iter iter; |
74 | 74 |
75 ListElement* cur = iter.init(list, Iter::kHead_IterStart); | 75 ListElement* cur = iter.init(list, Iter::kHead_IterStart); |
76 for (int i = 0; NULL != cur; ++i, cur = iter.next()) { | 76 for (int i = 0; cur; ++i, cur = iter.next()) { |
77 REPORTER_ASSERT(reporter, cur->fID == 3-i); | 77 REPORTER_ASSERT(reporter, cur->fID == 3-i); |
78 } | 78 } |
79 | 79 |
80 cur = iter.init(list, Iter::kTail_IterStart); | 80 cur = iter.init(list, Iter::kTail_IterStart); |
81 for (int i = 0; NULL != cur; ++i, cur = iter.prev()) { | 81 for (int i = 0; cur; ++i, cur = iter.prev()) { |
82 REPORTER_ASSERT(reporter, cur->fID == i); | 82 REPORTER_ASSERT(reporter, cur->fID == i); |
83 } | 83 } |
84 | 84 |
85 // remove middle, frontmost then backmost | 85 // remove middle, frontmost then backmost |
86 list.remove(&elements[1]); | 86 list.remove(&elements[1]); |
87 list.remove(&elements[3]); | 87 list.remove(&elements[3]); |
88 list.remove(&elements[0]); | 88 list.remove(&elements[0]); |
89 | 89 |
90 check_list(list, reporter, false, 1, false, false, true, false, elements); | 90 check_list(list, reporter, false, 1, false, false, true, false, elements); |
91 | 91 |
(...skipping 15 matching lines...) Expand all Loading... |
107 list.addBefore(&elements[0], &elements[1]); | 107 list.addBefore(&elements[0], &elements[1]); |
108 check_list(list, reporter, false, 2, true, true, false, false, elements); | 108 check_list(list, reporter, false, 2, true, true, false, false, elements); |
109 | 109 |
110 list.addAfter(&elements[3], &elements[1]); | 110 list.addAfter(&elements[3], &elements[1]); |
111 check_list(list, reporter, false, 3, true, true, false, true, elements); | 111 check_list(list, reporter, false, 3, true, true, false, true, elements); |
112 | 112 |
113 list.addBefore(&elements[2], &elements[3]); | 113 list.addBefore(&elements[2], &elements[3]); |
114 check_list(list, reporter, false, 4, true, true, true, true, elements); | 114 check_list(list, reporter, false, 4, true, true, true, true, elements); |
115 | 115 |
116 cur = iter.init(list, Iter::kHead_IterStart); | 116 cur = iter.init(list, Iter::kHead_IterStart); |
117 for (int i = 0; NULL != cur; ++i, cur = iter.next()) { | 117 for (int i = 0; cur; ++i, cur = iter.next()) { |
118 REPORTER_ASSERT(reporter, cur->fID == i); | 118 REPORTER_ASSERT(reporter, cur->fID == i); |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 static void TestTLList(skiatest::Reporter* reporter) { | 122 static void TestTLList(skiatest::Reporter* reporter) { |
123 typedef SkTLList<ListElement> ElList; | 123 typedef SkTLList<ListElement> ElList; |
124 typedef ElList::Iter Iter; | 124 typedef ElList::Iter Iter; |
125 SkRandom random; | 125 SkRandom random; |
126 | 126 |
127 for (int i = 1; i <= 16; i *= 2) { | 127 for (int i = 1; i <= 16; i *= 2) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 Iter iter = list1.headIter(); | 221 Iter iter = list1.headIter(); |
222 // remember the elements before/after the insertion poin
t. | 222 // remember the elements before/after the insertion poin
t. |
223 while (n--) { | 223 while (n--) { |
224 iter.next(); | 224 iter.next(); |
225 } | 225 } |
226 Iter prev(iter); | 226 Iter prev(iter); |
227 Iter next(iter); | 227 Iter next(iter); |
228 next.next(); | 228 next.next(); |
229 prev.prev(); | 229 prev.prev(); |
230 | 230 |
231 SkASSERT(NULL != iter.get()); | 231 SkASSERT(iter.get()); |
232 // insert either before or after the iterator, then chec
k that the | 232 // insert either before or after the iterator, then chec
k that the |
233 // surrounding sequence is correct. | 233 // surrounding sequence is correct. |
234 if (2 == insertionMethod) { | 234 if (2 == insertionMethod) { |
235 SkNEW_INSERT_IN_LLIST_BEFORE(&list1, iter, ListEleme
nt, (id)); | 235 SkNEW_INSERT_IN_LLIST_BEFORE(&list1, iter, ListEleme
nt, (id)); |
236 Iter newItem(iter); | 236 Iter newItem(iter); |
237 newItem.prev(); | 237 newItem.prev(); |
238 REPORTER_ASSERT(reporter, newItem.get()->fID == id); | 238 REPORTER_ASSERT(reporter, newItem.get()->fID == id); |
239 | 239 |
240 if (NULL != next.get()) { | 240 if (next.get()) { |
241 REPORTER_ASSERT(reporter, next.prev()->fID == it
er.get()->fID); | 241 REPORTER_ASSERT(reporter, next.prev()->fID == it
er.get()->fID); |
242 } | 242 } |
243 if (NULL != prev.get()) { | 243 if (prev.get()) { |
244 REPORTER_ASSERT(reporter, prev.next()->fID == id
); | 244 REPORTER_ASSERT(reporter, prev.next()->fID == id
); |
245 } | 245 } |
246 } else { | 246 } else { |
247 SkNEW_INSERT_IN_LLIST_AFTER(&list1, iter, ListElemen
t, (id)); | 247 SkNEW_INSERT_IN_LLIST_AFTER(&list1, iter, ListElemen
t, (id)); |
248 Iter newItem(iter); | 248 Iter newItem(iter); |
249 newItem.next(); | 249 newItem.next(); |
250 REPORTER_ASSERT(reporter, newItem.get()->fID == id); | 250 REPORTER_ASSERT(reporter, newItem.get()->fID == id); |
251 | 251 |
252 if (NULL != next.get()) { | 252 if (next.get()) { |
253 REPORTER_ASSERT(reporter, next.prev()->fID == id
); | 253 REPORTER_ASSERT(reporter, next.prev()->fID == id
); |
254 } | 254 } |
255 if (NULL != prev.get()) { | 255 if (prev.get()) { |
256 REPORTER_ASSERT(reporter, prev.next()->fID == it
er.get()->fID); | 256 REPORTER_ASSERT(reporter, prev.next()->fID == it
er.get()->fID); |
257 } | 257 } |
258 } | 258 } |
259 } | 259 } |
260 } | 260 } |
261 ++count; | 261 ++count; |
262 } else { | 262 } else { |
263 // walk to a random place either forward or backwards and remove
. | 263 // walk to a random place either forward or backwards and remove
. |
264 int n = random.nextULessThan(list1.count()); | 264 int n = random.nextULessThan(list1.count()); |
265 Iter::IterStart start; | 265 Iter::IterStart start; |
266 ListElement* (Iter::*incrFunc)(); | 266 ListElement* (Iter::*incrFunc)(); |
267 | 267 |
268 if (random.nextBool()) { | 268 if (random.nextBool()) { |
269 start = Iter::kHead_IterStart; | 269 start = Iter::kHead_IterStart; |
270 incrFunc = &Iter::next; | 270 incrFunc = &Iter::next; |
271 } else { | 271 } else { |
272 start = Iter::kTail_IterStart; | 272 start = Iter::kTail_IterStart; |
273 incrFunc = &Iter::prev; | 273 incrFunc = &Iter::prev; |
274 } | 274 } |
275 | 275 |
276 // find the element | 276 // find the element |
277 Iter iter(list1, start); | 277 Iter iter(list1, start); |
278 while (n--) { | 278 while (n--) { |
279 REPORTER_ASSERT(reporter, NULL != iter.get()); | 279 REPORTER_ASSERT(reporter, iter.get()); |
280 (iter.*incrFunc)(); | 280 (iter.*incrFunc)(); |
281 } | 281 } |
282 REPORTER_ASSERT(reporter, NULL != iter.get()); | 282 REPORTER_ASSERT(reporter, iter.get()); |
283 | 283 |
284 // remember the prev and next elements from the element to be re
moved | 284 // remember the prev and next elements from the element to be re
moved |
285 Iter prev = iter; | 285 Iter prev = iter; |
286 Iter next = iter; | 286 Iter next = iter; |
287 prev.prev(); | 287 prev.prev(); |
288 next.next(); | 288 next.next(); |
289 list1.remove(iter.get()); | 289 list1.remove(iter.get()); |
290 | 290 |
291 // make sure the remembered next/prev iters still work | 291 // make sure the remembered next/prev iters still work |
292 Iter pn = prev; pn.next(); | 292 Iter pn = prev; pn.next(); |
(...skipping 14 matching lines...) Expand all Loading... |
307 #if SK_ENABLE_INST_COUNT | 307 #if SK_ENABLE_INST_COUNT |
308 SkASSERT(0 == ListElement::InstanceCount()); | 308 SkASSERT(0 == ListElement::InstanceCount()); |
309 #endif | 309 #endif |
310 } | 310 } |
311 } | 311 } |
312 | 312 |
313 DEF_TEST(LList, reporter) { | 313 DEF_TEST(LList, reporter) { |
314 TestTInternalLList(reporter); | 314 TestTInternalLList(reporter); |
315 TestTLList(reporter); | 315 TestTLList(reporter); |
316 } | 316 } |
OLD | NEW |