| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 ++index; | 88 ++index; |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it); | 91 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it); |
| 92 EXPECT_EQ(increment ? deque.size() : 0, index); | 92 EXPECT_EQ(increment ? deque.size() : 0, index); |
| 93 } | 93 } |
| 94 | 94 |
| 95 template <size_t inlineCapacity> | 95 template <size_t inlineCapacity> |
| 96 void reverseTest() { | 96 void reverseTest() { |
| 97 Deque<int, inlineCapacity> intDeque; | 97 Deque<int, inlineCapacity> intDeque; |
| 98 intDeque.append(10); | 98 intDeque.push_back(10); |
| 99 intDeque.append(11); | 99 intDeque.push_back(11); |
| 100 intDeque.append(12); | 100 intDeque.push_back(12); |
| 101 intDeque.append(13); | 101 intDeque.push_back(13); |
| 102 | 102 |
| 103 checkNumberSequence(intDeque, 10, 13, true); | 103 checkNumberSequence(intDeque, 10, 13, true); |
| 104 checkNumberSequence(intDeque, 13, 10, false); | 104 checkNumberSequence(intDeque, 13, 10, false); |
| 105 checkNumberSequenceReverse(intDeque, 13, 10, true); | 105 checkNumberSequenceReverse(intDeque, 13, 10, true); |
| 106 checkNumberSequenceReverse(intDeque, 10, 13, false); | 106 checkNumberSequenceReverse(intDeque, 10, 13, false); |
| 107 | 107 |
| 108 intDeque.append(14); | 108 intDeque.push_back(14); |
| 109 intDeque.append(15); | 109 intDeque.push_back(15); |
| 110 EXPECT_EQ(10, intDeque.takeFirst()); | 110 EXPECT_EQ(10, intDeque.takeFirst()); |
| 111 EXPECT_EQ(15, intDeque.takeLast()); | 111 EXPECT_EQ(15, intDeque.takeLast()); |
| 112 checkNumberSequence(intDeque, 11, 14, true); | 112 checkNumberSequence(intDeque, 11, 14, true); |
| 113 checkNumberSequence(intDeque, 14, 11, false); | 113 checkNumberSequence(intDeque, 14, 11, false); |
| 114 checkNumberSequenceReverse(intDeque, 14, 11, true); | 114 checkNumberSequenceReverse(intDeque, 14, 11, true); |
| 115 checkNumberSequenceReverse(intDeque, 11, 14, false); | 115 checkNumberSequenceReverse(intDeque, 11, 14, false); |
| 116 | 116 |
| 117 for (int i = 15; i < 200; ++i) | 117 for (int i = 15; i < 200; ++i) |
| 118 intDeque.append(i); | 118 intDeque.push_back(i); |
| 119 checkNumberSequence(intDeque, 11, 199, true); | 119 checkNumberSequence(intDeque, 11, 199, true); |
| 120 checkNumberSequence(intDeque, 199, 11, false); | 120 checkNumberSequence(intDeque, 199, 11, false); |
| 121 checkNumberSequenceReverse(intDeque, 199, 11, true); | 121 checkNumberSequenceReverse(intDeque, 199, 11, true); |
| 122 checkNumberSequenceReverse(intDeque, 11, 199, false); | 122 checkNumberSequenceReverse(intDeque, 11, 199, false); |
| 123 | 123 |
| 124 for (int i = 0; i < 180; ++i) { | 124 for (int i = 0; i < 180; ++i) { |
| 125 EXPECT_EQ(i + 11, intDeque[0]); | 125 EXPECT_EQ(i + 11, intDeque[0]); |
| 126 EXPECT_EQ(i + 11, intDeque.takeFirst()); | 126 EXPECT_EQ(i + 11, intDeque.takeFirst()); |
| 127 } | 127 } |
| 128 checkNumberSequence(intDeque, 191, 199, true); | 128 checkNumberSequence(intDeque, 191, 199, true); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 168 |
| 169 private: | 169 private: |
| 170 int m_i; | 170 int m_i; |
| 171 int* m_destructNumber; | 171 int* m_destructNumber; |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 template <typename OwnPtrDeque> | 174 template <typename OwnPtrDeque> |
| 175 void ownPtrTest() { | 175 void ownPtrTest() { |
| 176 int destructNumber = 0; | 176 int destructNumber = 0; |
| 177 OwnPtrDeque deque; | 177 OwnPtrDeque deque; |
| 178 deque.append(WTF::wrapUnique(new DestructCounter(0, &destructNumber))); | 178 deque.push_back(WTF::wrapUnique(new DestructCounter(0, &destructNumber))); |
| 179 deque.append(WTF::wrapUnique(new DestructCounter(1, &destructNumber))); | 179 deque.push_back(WTF::wrapUnique(new DestructCounter(1, &destructNumber))); |
| 180 EXPECT_EQ(2u, deque.size()); | 180 EXPECT_EQ(2u, deque.size()); |
| 181 | 181 |
| 182 std::unique_ptr<DestructCounter>& counter0 = deque.first(); | 182 std::unique_ptr<DestructCounter>& counter0 = deque.first(); |
| 183 EXPECT_EQ(0, counter0->get()); | 183 EXPECT_EQ(0, counter0->get()); |
| 184 int counter1 = deque.last()->get(); | 184 int counter1 = deque.last()->get(); |
| 185 EXPECT_EQ(1, counter1); | 185 EXPECT_EQ(1, counter1); |
| 186 EXPECT_EQ(0, destructNumber); | 186 EXPECT_EQ(0, destructNumber); |
| 187 | 187 |
| 188 size_t index = 0; | 188 size_t index = 0; |
| 189 for (auto iter = deque.begin(); iter != deque.end(); ++iter) { | 189 for (auto iter = deque.begin(); iter != deque.end(); ++iter) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 | 258 |
| 259 int value() const { return m_i; } | 259 int value() const { return m_i; } |
| 260 | 260 |
| 261 private: | 261 private: |
| 262 WTF_MAKE_NONCOPYABLE(MoveOnly); | 262 WTF_MAKE_NONCOPYABLE(MoveOnly); |
| 263 int m_i; | 263 int m_i; |
| 264 }; | 264 }; |
| 265 | 265 |
| 266 TEST(DequeTest, MoveOnlyType) { | 266 TEST(DequeTest, MoveOnlyType) { |
| 267 Deque<MoveOnly> deque; | 267 Deque<MoveOnly> deque; |
| 268 deque.append(MoveOnly(1)); | 268 deque.push_back(MoveOnly(1)); |
| 269 deque.append(MoveOnly(2)); | 269 deque.push_back(MoveOnly(2)); |
| 270 EXPECT_EQ(2u, deque.size()); | 270 EXPECT_EQ(2u, deque.size()); |
| 271 | 271 |
| 272 ASSERT_EQ(1, deque.first().value()); | 272 ASSERT_EQ(1, deque.first().value()); |
| 273 ASSERT_EQ(2, deque.last().value()); | 273 ASSERT_EQ(2, deque.last().value()); |
| 274 | 274 |
| 275 MoveOnly oldFirst = deque.takeFirst(); | 275 MoveOnly oldFirst = deque.takeFirst(); |
| 276 ASSERT_EQ(1, oldFirst.value()); | 276 ASSERT_EQ(1, oldFirst.value()); |
| 277 EXPECT_EQ(1u, deque.size()); | 277 EXPECT_EQ(1u, deque.size()); |
| 278 | 278 |
| 279 Deque<MoveOnly> otherDeque; | 279 Deque<MoveOnly> otherDeque; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 310 int get() const { return m_i; } | 310 int get() const { return m_i; } |
| 311 | 311 |
| 312 private: | 312 private: |
| 313 void* m_originalThisPtr; | 313 void* m_originalThisPtr; |
| 314 int m_i; | 314 int m_i; |
| 315 }; | 315 }; |
| 316 | 316 |
| 317 template <size_t inlineCapacity> | 317 template <size_t inlineCapacity> |
| 318 void swapWithOrWithoutInlineCapacity() { | 318 void swapWithOrWithoutInlineCapacity() { |
| 319 Deque<WrappedInt, inlineCapacity> dequeA; | 319 Deque<WrappedInt, inlineCapacity> dequeA; |
| 320 dequeA.append(WrappedInt(1)); | 320 dequeA.push_back(WrappedInt(1)); |
| 321 Deque<WrappedInt, inlineCapacity> dequeB; | 321 Deque<WrappedInt, inlineCapacity> dequeB; |
| 322 dequeB.append(WrappedInt(2)); | 322 dequeB.push_back(WrappedInt(2)); |
| 323 | 323 |
| 324 ASSERT_EQ(dequeA.size(), dequeB.size()); | 324 ASSERT_EQ(dequeA.size(), dequeB.size()); |
| 325 dequeA.swap(dequeB); | 325 dequeA.swap(dequeB); |
| 326 | 326 |
| 327 ASSERT_EQ(1u, dequeA.size()); | 327 ASSERT_EQ(1u, dequeA.size()); |
| 328 EXPECT_EQ(2, dequeA.first().get()); | 328 EXPECT_EQ(2, dequeA.first().get()); |
| 329 ASSERT_EQ(1u, dequeB.size()); | 329 ASSERT_EQ(1u, dequeB.size()); |
| 330 EXPECT_EQ(1, dequeB.first().get()); | 330 EXPECT_EQ(1, dequeB.first().get()); |
| 331 | 331 |
| 332 dequeA.append(WrappedInt(3)); | 332 dequeA.push_back(WrappedInt(3)); |
| 333 | 333 |
| 334 ASSERT_GT(dequeA.size(), dequeB.size()); | 334 ASSERT_GT(dequeA.size(), dequeB.size()); |
| 335 dequeA.swap(dequeB); | 335 dequeA.swap(dequeB); |
| 336 | 336 |
| 337 ASSERT_EQ(1u, dequeA.size()); | 337 ASSERT_EQ(1u, dequeA.size()); |
| 338 EXPECT_EQ(1, dequeA.first().get()); | 338 EXPECT_EQ(1, dequeA.first().get()); |
| 339 ASSERT_EQ(2u, dequeB.size()); | 339 ASSERT_EQ(2u, dequeB.size()); |
| 340 EXPECT_EQ(2, dequeB.first().get()); | 340 EXPECT_EQ(2, dequeB.first().get()); |
| 341 | 341 |
| 342 ASSERT_LT(dequeA.size(), dequeB.size()); | 342 ASSERT_LT(dequeA.size(), dequeB.size()); |
| 343 dequeA.swap(dequeB); | 343 dequeA.swap(dequeB); |
| 344 | 344 |
| 345 ASSERT_EQ(2u, dequeA.size()); | 345 ASSERT_EQ(2u, dequeA.size()); |
| 346 EXPECT_EQ(2, dequeA.first().get()); | 346 EXPECT_EQ(2, dequeA.first().get()); |
| 347 ASSERT_EQ(1u, dequeB.size()); | 347 ASSERT_EQ(1u, dequeB.size()); |
| 348 EXPECT_EQ(1, dequeB.first().get()); | 348 EXPECT_EQ(1, dequeB.first().get()); |
| 349 | 349 |
| 350 dequeA.append(WrappedInt(4)); | 350 dequeA.push_back(WrappedInt(4)); |
| 351 dequeA.swap(dequeB); | 351 dequeA.swap(dequeB); |
| 352 | 352 |
| 353 ASSERT_EQ(1u, dequeA.size()); | 353 ASSERT_EQ(1u, dequeA.size()); |
| 354 EXPECT_EQ(1, dequeA.first().get()); | 354 EXPECT_EQ(1, dequeA.first().get()); |
| 355 ASSERT_EQ(3u, dequeB.size()); | 355 ASSERT_EQ(3u, dequeB.size()); |
| 356 EXPECT_EQ(2, dequeB.first().get()); | 356 EXPECT_EQ(2, dequeB.first().get()); |
| 357 | 357 |
| 358 dequeB.swap(dequeA); | 358 dequeB.swap(dequeA); |
| 359 } | 359 } |
| 360 | 360 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 381 } | 381 } |
| 382 | 382 |
| 383 template <size_t inlineCapacity> | 383 template <size_t inlineCapacity> |
| 384 void testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity() { | 384 void testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity() { |
| 385 LivenessCounter::s_live = 0; | 385 LivenessCounter::s_live = 0; |
| 386 LivenessCounter counter; | 386 LivenessCounter counter; |
| 387 EXPECT_EQ(0u, LivenessCounter::s_live); | 387 EXPECT_EQ(0u, LivenessCounter::s_live); |
| 388 | 388 |
| 389 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque; | 389 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque; |
| 390 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque2; | 390 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque2; |
| 391 deque.append(&counter); | 391 deque.push_back(&counter); |
| 392 deque2.append(&counter); | 392 deque2.push_back(&counter); |
| 393 EXPECT_EQ(2u, LivenessCounter::s_live); | 393 EXPECT_EQ(2u, LivenessCounter::s_live); |
| 394 | 394 |
| 395 // Add various numbers of elements to deques, then remove various numbers | 395 // Add various numbers of elements to deques, then remove various numbers |
| 396 // of elements from the head. This creates in-use ranges in the backing | 396 // of elements from the head. This creates in-use ranges in the backing |
| 397 // that sometimes wrap around the end of the buffer, testing various ways | 397 // that sometimes wrap around the end of the buffer, testing various ways |
| 398 // in which the in-use ranges of the inline buffers can overlap when we | 398 // in which the in-use ranges of the inline buffers can overlap when we |
| 399 // call swap(). | 399 // call swap(). |
| 400 for (unsigned i = 0; i < 12; i++) { | 400 for (unsigned i = 0; i < 12; i++) { |
| 401 if (!interestingNumber(i)) | 401 if (!interestingNumber(i)) |
| 402 continue; | 402 continue; |
| 403 for (unsigned j = i; j < 12; j++) { | 403 for (unsigned j = i; j < 12; j++) { |
| 404 if (!interestingNumber(j)) | 404 if (!interestingNumber(j)) |
| 405 continue; | 405 continue; |
| 406 deque.clear(); | 406 deque.clear(); |
| 407 deque2.clear(); | 407 deque2.clear(); |
| 408 EXPECT_EQ(0u, LivenessCounter::s_live); | 408 EXPECT_EQ(0u, LivenessCounter::s_live); |
| 409 for (unsigned k = 0; k < j; k++) | 409 for (unsigned k = 0; k < j; k++) |
| 410 deque.append(&counter); | 410 deque.push_back(&counter); |
| 411 EXPECT_EQ(j, LivenessCounter::s_live); | 411 EXPECT_EQ(j, LivenessCounter::s_live); |
| 412 EXPECT_EQ(j, deque.size()); | 412 EXPECT_EQ(j, deque.size()); |
| 413 for (unsigned k = 0; k < i; k++) | 413 for (unsigned k = 0; k < i; k++) |
| 414 deque.removeFirst(); | 414 deque.removeFirst(); |
| 415 | 415 |
| 416 EXPECT_EQ(j - i, LivenessCounter::s_live); | 416 EXPECT_EQ(j - i, LivenessCounter::s_live); |
| 417 EXPECT_EQ(j - i, deque.size()); | 417 EXPECT_EQ(j - i, deque.size()); |
| 418 deque.swap(deque2); | 418 deque.swap(deque2); |
| 419 EXPECT_EQ(j - i, LivenessCounter::s_live); | 419 EXPECT_EQ(j - i, LivenessCounter::s_live); |
| 420 EXPECT_EQ(0u, deque.size()); | 420 EXPECT_EQ(0u, deque.size()); |
| 421 EXPECT_EQ(j - i, deque2.size()); | 421 EXPECT_EQ(j - i, deque2.size()); |
| 422 deque.swap(deque2); | 422 deque.swap(deque2); |
| 423 EXPECT_EQ(j - i, LivenessCounter::s_live); | 423 EXPECT_EQ(j - i, LivenessCounter::s_live); |
| 424 | 424 |
| 425 deque2.append(&counter); | 425 deque2.push_back(&counter); |
| 426 deque2.append(&counter); | 426 deque2.push_back(&counter); |
| 427 deque2.append(&counter); | 427 deque2.push_back(&counter); |
| 428 | 428 |
| 429 for (unsigned k = 0; k < 12; k++) { | 429 for (unsigned k = 0; k < 12; k++) { |
| 430 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); | 430 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); |
| 431 EXPECT_EQ(j - i, deque.size()); | 431 EXPECT_EQ(j - i, deque.size()); |
| 432 EXPECT_EQ(3u, deque2.size()); | 432 EXPECT_EQ(3u, deque2.size()); |
| 433 deque.swap(deque2); | 433 deque.swap(deque2); |
| 434 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); | 434 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); |
| 435 EXPECT_EQ(j - i, deque2.size()); | 435 EXPECT_EQ(j - i, deque2.size()); |
| 436 EXPECT_EQ(3u, deque.size()); | 436 EXPECT_EQ(3u, deque.size()); |
| 437 deque.swap(deque2); | 437 deque.swap(deque2); |
| 438 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); | 438 EXPECT_EQ(3 + j - i, LivenessCounter::s_live); |
| 439 EXPECT_EQ(j - i, deque.size()); | 439 EXPECT_EQ(j - i, deque.size()); |
| 440 EXPECT_EQ(3u, deque2.size()); | 440 EXPECT_EQ(3u, deque2.size()); |
| 441 | 441 |
| 442 deque2.removeFirst(); | 442 deque2.removeFirst(); |
| 443 deque2.append(&counter); | 443 deque2.push_back(&counter); |
| 444 } | 444 } |
| 445 } | 445 } |
| 446 } | 446 } |
| 447 } | 447 } |
| 448 | 448 |
| 449 TEST(DequeTest, SwapWithConstructorsAndDestructors) { | 449 TEST(DequeTest, SwapWithConstructorsAndDestructors) { |
| 450 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<0>(); | 450 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<0>(); |
| 451 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<4>(); | 451 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<4>(); |
| 452 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<9>(); | 452 testDestructorAndConstructorCallsWhenSwappingWithInlineCapacity<9>(); |
| 453 } | 453 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 470 continue; | 470 continue; |
| 471 for (unsigned size = 0; size < 12; size++) { | 471 for (unsigned size = 0; size < 12; size++) { |
| 472 if (!interestingNumber(size)) | 472 if (!interestingNumber(size)) |
| 473 continue; | 473 continue; |
| 474 for (unsigned size2 = 0; size2 < 12; size2++) { | 474 for (unsigned size2 = 0; size2 < 12; size2++) { |
| 475 if (!interestingNumber(size2)) | 475 if (!interestingNumber(size2)) |
| 476 continue; | 476 continue; |
| 477 deque.clear(); | 477 deque.clear(); |
| 478 deque2.clear(); | 478 deque2.clear(); |
| 479 for (unsigned i = 0; i < pad; i++) | 479 for (unsigned i = 0; i < pad; i++) |
| 480 deque.append(103); | 480 deque.push_back(103); |
| 481 for (unsigned i = 0; i < pad2; i++) | 481 for (unsigned i = 0; i < pad2; i++) |
| 482 deque2.append(888); | 482 deque2.push_back(888); |
| 483 for (unsigned i = 0; i < size; i++) | 483 for (unsigned i = 0; i < size; i++) |
| 484 deque.append(i); | 484 deque.push_back(i); |
| 485 for (unsigned i = 0; i < size2; i++) | 485 for (unsigned i = 0; i < size2; i++) |
| 486 deque2.append(i + 42); | 486 deque2.push_back(i + 42); |
| 487 for (unsigned i = 0; i < pad; i++) | 487 for (unsigned i = 0; i < pad; i++) |
| 488 EXPECT_EQ(103u, deque.takeFirst()); | 488 EXPECT_EQ(103u, deque.takeFirst()); |
| 489 for (unsigned i = 0; i < pad2; i++) | 489 for (unsigned i = 0; i < pad2; i++) |
| 490 EXPECT_EQ(888u, deque2.takeFirst()); | 490 EXPECT_EQ(888u, deque2.takeFirst()); |
| 491 EXPECT_EQ(size, deque.size()); | 491 EXPECT_EQ(size, deque.size()); |
| 492 EXPECT_EQ(size2, deque2.size()); | 492 EXPECT_EQ(size2, deque2.size()); |
| 493 deque.swap(deque2); | 493 deque.swap(deque2); |
| 494 for (unsigned i = 0; i < size; i++) | 494 for (unsigned i = 0; i < size; i++) |
| 495 EXPECT_EQ(i, deque2.takeFirst()); | 495 EXPECT_EQ(i, deque2.takeFirst()); |
| 496 for (unsigned i = 0; i < size2; i++) | 496 for (unsigned i = 0; i < size2; i++) |
| 497 EXPECT_EQ(i + 42, deque.takeFirst()); | 497 EXPECT_EQ(i + 42, deque.takeFirst()); |
| 498 } | 498 } |
| 499 } | 499 } |
| 500 } | 500 } |
| 501 } | 501 } |
| 502 } | 502 } |
| 503 | 503 |
| 504 TEST(DequeTest, ValuesMovedAndSwappedWithInlineCapacity) { | 504 TEST(DequeTest, ValuesMovedAndSwappedWithInlineCapacity) { |
| 505 testValuesMovedAndSwappedWithInlineCapacity<0>(); | 505 testValuesMovedAndSwappedWithInlineCapacity<0>(); |
| 506 testValuesMovedAndSwappedWithInlineCapacity<4>(); | 506 testValuesMovedAndSwappedWithInlineCapacity<4>(); |
| 507 testValuesMovedAndSwappedWithInlineCapacity<9>(); | 507 testValuesMovedAndSwappedWithInlineCapacity<9>(); |
| 508 } | 508 } |
| 509 | 509 |
| 510 TEST(DequeTest, UniquePtr) { | 510 TEST(DequeTest, UniquePtr) { |
| 511 using Pointer = std::unique_ptr<int>; | 511 using Pointer = std::unique_ptr<int>; |
| 512 Deque<Pointer> deque; | 512 Deque<Pointer> deque; |
| 513 deque.append(Pointer(new int(1))); | 513 deque.push_back(Pointer(new int(1))); |
| 514 deque.append(Pointer(new int(2))); | 514 deque.push_back(Pointer(new int(2))); |
| 515 deque.prepend(Pointer(new int(-1))); | 515 deque.prepend(Pointer(new int(-1))); |
| 516 deque.prepend(Pointer(new int(-2))); | 516 deque.prepend(Pointer(new int(-2))); |
| 517 ASSERT_EQ(4u, deque.size()); | 517 ASSERT_EQ(4u, deque.size()); |
| 518 EXPECT_EQ(-2, *deque[0]); | 518 EXPECT_EQ(-2, *deque[0]); |
| 519 EXPECT_EQ(-1, *deque[1]); | 519 EXPECT_EQ(-1, *deque[1]); |
| 520 EXPECT_EQ(1, *deque[2]); | 520 EXPECT_EQ(1, *deque[2]); |
| 521 EXPECT_EQ(2, *deque[3]); | 521 EXPECT_EQ(2, *deque[3]); |
| 522 | 522 |
| 523 Pointer first(deque.takeFirst()); | 523 Pointer first(deque.takeFirst()); |
| 524 EXPECT_EQ(-2, *first); | 524 EXPECT_EQ(-2, *first); |
| 525 Pointer last(deque.takeLast()); | 525 Pointer last(deque.takeLast()); |
| 526 EXPECT_EQ(2, *last); | 526 EXPECT_EQ(2, *last); |
| 527 | 527 |
| 528 EXPECT_EQ(2u, deque.size()); | 528 EXPECT_EQ(2u, deque.size()); |
| 529 deque.removeFirst(); | 529 deque.removeFirst(); |
| 530 deque.pop_back(); | 530 deque.pop_back(); |
| 531 EXPECT_EQ(0u, deque.size()); | 531 EXPECT_EQ(0u, deque.size()); |
| 532 | 532 |
| 533 deque.append(Pointer(new int(42))); | 533 deque.push_back(Pointer(new int(42))); |
| 534 deque[0] = Pointer(new int(24)); | 534 deque[0] = Pointer(new int(24)); |
| 535 ASSERT_EQ(1u, deque.size()); | 535 ASSERT_EQ(1u, deque.size()); |
| 536 EXPECT_EQ(24, *deque[0]); | 536 EXPECT_EQ(24, *deque[0]); |
| 537 | 537 |
| 538 deque.clear(); | 538 deque.clear(); |
| 539 } | 539 } |
| 540 | 540 |
| 541 class CountCopy final { | 541 class CountCopy final { |
| 542 public: | 542 public: |
| 543 explicit CountCopy(int* counter = nullptr) : m_counter(counter) {} | 543 explicit CountCopy(int* counter = nullptr) : m_counter(counter) {} |
| (...skipping 11 matching lines...) Expand all Loading... |
| 555 private: | 555 private: |
| 556 int* m_counter; | 556 int* m_counter; |
| 557 }; | 557 }; |
| 558 | 558 |
| 559 TEST(DequeTest, MoveShouldNotMakeCopy) { | 559 TEST(DequeTest, MoveShouldNotMakeCopy) { |
| 560 // Because data in inline buffer may be swapped or moved individually, we | 560 // Because data in inline buffer may be swapped or moved individually, we |
| 561 // force the creation of out-of-line buffer so we can make sure there's no | 561 // force the creation of out-of-line buffer so we can make sure there's no |
| 562 // element-wise copy/move. | 562 // element-wise copy/move. |
| 563 Deque<CountCopy, 1> deque; | 563 Deque<CountCopy, 1> deque; |
| 564 int counter = 0; | 564 int counter = 0; |
| 565 deque.append(CountCopy(&counter)); | 565 deque.push_back(CountCopy(&counter)); |
| 566 deque.append(CountCopy(&counter)); | 566 deque.push_back(CountCopy(&counter)); |
| 567 | 567 |
| 568 Deque<CountCopy, 1> other(deque); | 568 Deque<CountCopy, 1> other(deque); |
| 569 counter = 0; | 569 counter = 0; |
| 570 deque = std::move(other); // Move assignment. | 570 deque = std::move(other); // Move assignment. |
| 571 EXPECT_EQ(0, counter); | 571 EXPECT_EQ(0, counter); |
| 572 | 572 |
| 573 counter = 0; | 573 counter = 0; |
| 574 Deque<CountCopy, 1> yetAnother(std::move(deque)); // Move construction. | 574 Deque<CountCopy, 1> yetAnother(std::move(deque)); // Move construction. |
| 575 EXPECT_EQ(0, counter); | 575 EXPECT_EQ(0, counter); |
| 576 } | 576 } |
| 577 | 577 |
| 578 TEST(DequeTest, RemoveWhileIterating) { | 578 TEST(DequeTest, RemoveWhileIterating) { |
| 579 Deque<int> deque; | 579 Deque<int> deque; |
| 580 for (int i = 0; i < 10; ++i) | 580 for (int i = 0; i < 10; ++i) |
| 581 deque.append(i); | 581 deque.push_back(i); |
| 582 | 582 |
| 583 // All numbers present. | 583 // All numbers present. |
| 584 { | 584 { |
| 585 int i = 0; | 585 int i = 0; |
| 586 for (int v : deque) | 586 for (int v : deque) |
| 587 EXPECT_EQ(i++, v); | 587 EXPECT_EQ(i++, v); |
| 588 } | 588 } |
| 589 | 589 |
| 590 // Remove the even numbers while iterating. | 590 // Remove the even numbers while iterating. |
| 591 for (auto it = deque.begin(); it != deque.end(); ++it) { | 591 for (auto it = deque.begin(); it != deque.end(); ++it) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 EXPECT_EQ(2u, deque.size()); | 629 EXPECT_EQ(2u, deque.size()); |
| 630 EXPECT_EQ(3, deque[0].value1); | 630 EXPECT_EQ(3, deque[0].value1); |
| 631 EXPECT_EQ(4, deque[0].value2); | 631 EXPECT_EQ(4, deque[0].value2); |
| 632 EXPECT_EQ(1, deque[1].value1); | 632 EXPECT_EQ(1, deque[1].value1); |
| 633 EXPECT_EQ(2, deque[1].value2); | 633 EXPECT_EQ(2, deque[1].value2); |
| 634 } | 634 } |
| 635 | 635 |
| 636 } // anonymous namespace | 636 } // anonymous namespace |
| 637 | 637 |
| 638 } // namespace WTF | 638 } // namespace WTF |
| OLD | NEW |