| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Google Inc. All rights reserved. | 3 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 reverse_iterator rbegin() { return reverse_iterator(end()); } | 83 reverse_iterator rbegin() { return reverse_iterator(end()); } |
| 84 reverse_iterator rend() { return reverse_iterator(begin()); } | 84 reverse_iterator rend() { return reverse_iterator(begin()); } |
| 85 const_reverse_iterator rbegin() const { | 85 const_reverse_iterator rbegin() const { |
| 86 return const_reverse_iterator(end()); | 86 return const_reverse_iterator(end()); |
| 87 } | 87 } |
| 88 const_reverse_iterator rend() const { | 88 const_reverse_iterator rend() const { |
| 89 return const_reverse_iterator(begin()); | 89 return const_reverse_iterator(begin()); |
| 90 } | 90 } |
| 91 | 91 |
| 92 T& first() { | 92 T& first() { |
| 93 ASSERT(m_start != m_end); | 93 DCHECK_NE(m_start, m_end); |
| 94 return m_buffer.buffer()[m_start]; | 94 return m_buffer.buffer()[m_start]; |
| 95 } | 95 } |
| 96 const T& first() const { | 96 const T& first() const { |
| 97 ASSERT(m_start != m_end); | 97 DCHECK_NE(m_start, m_end); |
| 98 return m_buffer.buffer()[m_start]; | 98 return m_buffer.buffer()[m_start]; |
| 99 } | 99 } |
| 100 T takeFirst(); | 100 T takeFirst(); |
| 101 | 101 |
| 102 T& last() { | 102 T& last() { |
| 103 ASSERT(m_start != m_end); | 103 DCHECK_NE(m_start, m_end); |
| 104 return *(--end()); | 104 return *(--end()); |
| 105 } | 105 } |
| 106 const T& last() const { | 106 const T& last() const { |
| 107 ASSERT(m_start != m_end); | 107 DCHECK_NE(m_start, m_end); |
| 108 return *(--end()); | 108 return *(--end()); |
| 109 } | 109 } |
| 110 T takeLast(); | 110 T takeLast(); |
| 111 | 111 |
| 112 T& at(size_t i) { | 112 T& at(size_t i) { |
| 113 RELEASE_ASSERT(i < size()); | 113 RELEASE_ASSERT(i < size()); |
| 114 size_t right = m_buffer.capacity() - m_start; | 114 size_t right = m_buffer.capacity() - m_start; |
| 115 return i < right ? m_buffer.buffer()[m_start + i] | 115 return i < right ? m_buffer.buffer()[m_start + i] |
| 116 : m_buffer.buffer()[i - right]; | 116 : m_buffer.buffer()[i - right]; |
| 117 } | 117 } |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 expandCapacityIfNeeded(); | 498 expandCapacityIfNeeded(); |
| 499 if (!m_start) | 499 if (!m_start) |
| 500 m_start = m_buffer.capacity() - 1; | 500 m_start = m_buffer.capacity() - 1; |
| 501 else | 501 else |
| 502 --m_start; | 502 --m_start; |
| 503 new (NotNull, &m_buffer.buffer()[m_start]) T(std::forward<U>(value)); | 503 new (NotNull, &m_buffer.buffer()[m_start]) T(std::forward<U>(value)); |
| 504 } | 504 } |
| 505 | 505 |
| 506 template <typename T, size_t inlineCapacity, typename Allocator> | 506 template <typename T, size_t inlineCapacity, typename Allocator> |
| 507 inline void Deque<T, inlineCapacity, Allocator>::removeFirst() { | 507 inline void Deque<T, inlineCapacity, Allocator>::removeFirst() { |
| 508 ASSERT(!isEmpty()); | 508 DCHECK(!isEmpty()); |
| 509 TypeOperations::destruct(&m_buffer.buffer()[m_start], | 509 TypeOperations::destruct(&m_buffer.buffer()[m_start], |
| 510 &m_buffer.buffer()[m_start + 1]); | 510 &m_buffer.buffer()[m_start + 1]); |
| 511 m_buffer.clearUnusedSlots(&m_buffer.buffer()[m_start], | 511 m_buffer.clearUnusedSlots(&m_buffer.buffer()[m_start], |
| 512 &m_buffer.buffer()[m_start + 1]); | 512 &m_buffer.buffer()[m_start + 1]); |
| 513 if (m_start == m_buffer.capacity() - 1) | 513 if (m_start == m_buffer.capacity() - 1) |
| 514 m_start = 0; | 514 m_start = 0; |
| 515 else | 515 else |
| 516 ++m_start; | 516 ++m_start; |
| 517 } | 517 } |
| 518 | 518 |
| 519 template <typename T, size_t inlineCapacity, typename Allocator> | 519 template <typename T, size_t inlineCapacity, typename Allocator> |
| 520 inline void Deque<T, inlineCapacity, Allocator>::removeLast() { | 520 inline void Deque<T, inlineCapacity, Allocator>::removeLast() { |
| 521 ASSERT(!isEmpty()); | 521 DCHECK(!isEmpty()); |
| 522 if (!m_end) | 522 if (!m_end) |
| 523 m_end = m_buffer.capacity() - 1; | 523 m_end = m_buffer.capacity() - 1; |
| 524 else | 524 else |
| 525 --m_end; | 525 --m_end; |
| 526 TypeOperations::destruct(&m_buffer.buffer()[m_end], | 526 TypeOperations::destruct(&m_buffer.buffer()[m_end], |
| 527 &m_buffer.buffer()[m_end + 1]); | 527 &m_buffer.buffer()[m_end + 1]); |
| 528 m_buffer.clearUnusedSlots(&m_buffer.buffer()[m_end], | 528 m_buffer.clearUnusedSlots(&m_buffer.buffer()[m_end], |
| 529 &m_buffer.buffer()[m_end + 1]); | 529 &m_buffer.buffer()[m_end + 1]); |
| 530 } | 530 } |
| 531 | 531 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 inline DequeIteratorBase<T, inlineCapacity, Allocator>::~DequeIteratorBase() {} | 591 inline DequeIteratorBase<T, inlineCapacity, Allocator>::~DequeIteratorBase() {} |
| 592 | 592 |
| 593 template <typename T, size_t inlineCapacity, typename Allocator> | 593 template <typename T, size_t inlineCapacity, typename Allocator> |
| 594 inline bool DequeIteratorBase<T, inlineCapacity, Allocator>::isEqual( | 594 inline bool DequeIteratorBase<T, inlineCapacity, Allocator>::isEqual( |
| 595 const DequeIteratorBase& other) const { | 595 const DequeIteratorBase& other) const { |
| 596 return m_index == other.m_index; | 596 return m_index == other.m_index; |
| 597 } | 597 } |
| 598 | 598 |
| 599 template <typename T, size_t inlineCapacity, typename Allocator> | 599 template <typename T, size_t inlineCapacity, typename Allocator> |
| 600 inline void DequeIteratorBase<T, inlineCapacity, Allocator>::increment() { | 600 inline void DequeIteratorBase<T, inlineCapacity, Allocator>::increment() { |
| 601 ASSERT(m_index != m_deque->m_end); | 601 DCHECK_NE(m_index, m_deque->m_end); |
| 602 ASSERT(m_deque->m_buffer.capacity()); | 602 DCHECK(m_deque->m_buffer.capacity()); |
| 603 if (m_index == m_deque->m_buffer.capacity() - 1) | 603 if (m_index == m_deque->m_buffer.capacity() - 1) |
| 604 m_index = 0; | 604 m_index = 0; |
| 605 else | 605 else |
| 606 ++m_index; | 606 ++m_index; |
| 607 } | 607 } |
| 608 | 608 |
| 609 template <typename T, size_t inlineCapacity, typename Allocator> | 609 template <typename T, size_t inlineCapacity, typename Allocator> |
| 610 inline void DequeIteratorBase<T, inlineCapacity, Allocator>::decrement() { | 610 inline void DequeIteratorBase<T, inlineCapacity, Allocator>::decrement() { |
| 611 ASSERT(m_index != m_deque->m_start); | 611 DCHECK_NE(m_index, m_deque->m_start); |
| 612 ASSERT(m_deque->m_buffer.capacity()); | 612 DCHECK(m_deque->m_buffer.capacity()); |
| 613 if (!m_index) | 613 if (!m_index) |
| 614 m_index = m_deque->m_buffer.capacity() - 1; | 614 m_index = m_deque->m_buffer.capacity() - 1; |
| 615 else | 615 else |
| 616 --m_index; | 616 --m_index; |
| 617 } | 617 } |
| 618 | 618 |
| 619 template <typename T, size_t inlineCapacity, typename Allocator> | 619 template <typename T, size_t inlineCapacity, typename Allocator> |
| 620 inline T* DequeIteratorBase<T, inlineCapacity, Allocator>::after() const { | 620 inline T* DequeIteratorBase<T, inlineCapacity, Allocator>::after() const { |
| 621 RELEASE_ASSERT(m_index != m_deque->m_end); | 621 RELEASE_ASSERT(m_index != m_deque->m_end); |
| 622 return &m_deque->m_buffer.buffer()[m_index]; | 622 return &m_deque->m_buffer.buffer()[m_index]; |
| 623 } | 623 } |
| 624 | 624 |
| 625 template <typename T, size_t inlineCapacity, typename Allocator> | 625 template <typename T, size_t inlineCapacity, typename Allocator> |
| 626 inline T* DequeIteratorBase<T, inlineCapacity, Allocator>::before() const { | 626 inline T* DequeIteratorBase<T, inlineCapacity, Allocator>::before() const { |
| 627 RELEASE_ASSERT(m_index != m_deque->m_start); | 627 RELEASE_ASSERT(m_index != m_deque->m_start); |
| 628 if (!m_index) | 628 if (!m_index) |
| 629 return &m_deque->m_buffer.buffer()[m_deque->m_buffer.capacity() - 1]; | 629 return &m_deque->m_buffer.buffer()[m_deque->m_buffer.capacity() - 1]; |
| 630 return &m_deque->m_buffer.buffer()[m_index - 1]; | 630 return &m_deque->m_buffer.buffer()[m_index - 1]; |
| 631 } | 631 } |
| 632 | 632 |
| 633 // This is only called if the allocator is a HeapAllocator. It is used when | 633 // This is only called if the allocator is a HeapAllocator. It is used when |
| 634 // visiting during a tracing GC. | 634 // visiting during a tracing GC. |
| 635 template <typename T, size_t inlineCapacity, typename Allocator> | 635 template <typename T, size_t inlineCapacity, typename Allocator> |
| 636 template <typename VisitorDispatcher> | 636 template <typename VisitorDispatcher> |
| 637 void Deque<T, inlineCapacity, Allocator>::trace(VisitorDispatcher visitor) { | 637 void Deque<T, inlineCapacity, Allocator>::trace(VisitorDispatcher visitor) { |
| 638 ASSERT(Allocator::isGarbageCollected); // Garbage collector must be enabled. | 638 DCHECK(Allocator::isGarbageCollected) << "Garbage collector must be enabled."; |
| 639 const T* bufferBegin = m_buffer.buffer(); | 639 const T* bufferBegin = m_buffer.buffer(); |
| 640 const T* end = bufferBegin + m_end; | 640 const T* end = bufferBegin + m_end; |
| 641 if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) { | 641 if (IsTraceableInCollectionTrait<VectorTraits<T>>::value) { |
| 642 if (m_start <= m_end) { | 642 if (m_start <= m_end) { |
| 643 for (const T* bufferEntry = bufferBegin + m_start; bufferEntry != end; | 643 for (const T* bufferEntry = bufferBegin + m_start; bufferEntry != end; |
| 644 bufferEntry++) | 644 bufferEntry++) |
| 645 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>( | 645 Allocator::template trace<VisitorDispatcher, T, VectorTraits<T>>( |
| 646 visitor, *const_cast<T*>(bufferEntry)); | 646 visitor, *const_cast<T*>(bufferEntry)); |
| 647 } else { | 647 } else { |
| 648 for (const T* bufferEntry = bufferBegin; bufferEntry != end; | 648 for (const T* bufferEntry = bufferBegin; bufferEntry != end; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 666 inline void swap(Deque<T, inlineCapacity, Allocator>& a, | 666 inline void swap(Deque<T, inlineCapacity, Allocator>& a, |
| 667 Deque<T, inlineCapacity, Allocator>& b) { | 667 Deque<T, inlineCapacity, Allocator>& b) { |
| 668 a.swap(b); | 668 a.swap(b); |
| 669 } | 669 } |
| 670 | 670 |
| 671 } // namespace WTF | 671 } // namespace WTF |
| 672 | 672 |
| 673 using WTF::Deque; | 673 using WTF::Deque; |
| 674 | 674 |
| 675 #endif // WTF_Deque_h | 675 #endif // WTF_Deque_h |
| OLD | NEW |