OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 #else | 50 #else |
51 #ifndef WTF_VECTOR_INITIAL_SIZE | 51 #ifndef WTF_VECTOR_INITIAL_SIZE |
52 #define WTF_VECTOR_INITIAL_SIZE 4 | 52 #define WTF_VECTOR_INITIAL_SIZE 4 |
53 #endif | 53 #endif |
54 static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE; | 54 static const size_t kInitialVectorSize = WTF_VECTOR_INITIAL_SIZE; |
55 #endif | 55 #endif |
56 | 56 |
57 template <typename T, size_t inlineBuffer, typename Allocator> | 57 template <typename T, size_t inlineBuffer, typename Allocator> |
58 class Deque; | 58 class Deque; |
59 | 59 |
| 60 // |
| 61 // Vector Traits |
| 62 // |
| 63 |
| 64 // Bunch of traits for Vector are defined here, with which you can customize |
| 65 // Vector's behavior. In most cases the default traits are appropriate, so you |
| 66 // usually don't have to specialize those traits by yourself. |
| 67 |
60 template <bool needsDestruction, typename T> | 68 template <bool needsDestruction, typename T> |
61 struct VectorDestructor; | 69 struct VectorDestructor; |
62 | 70 |
63 template <typename T> | 71 template <typename T> |
64 struct VectorDestructor<false, T> { | 72 struct VectorDestructor<false, T> { |
65 STATIC_ONLY(VectorDestructor); | 73 STATIC_ONLY(VectorDestructor); |
66 static void destruct(T*, T*) {} | 74 static void destruct(T*, T*) {} |
67 }; | 75 }; |
68 | 76 |
69 template <typename T> | 77 template <typename T> |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 | 280 |
273 template <typename T> | 281 template <typename T> |
274 struct VectorElementComparer<std::unique_ptr<T>> { | 282 struct VectorElementComparer<std::unique_ptr<T>> { |
275 STATIC_ONLY(VectorElementComparer); | 283 STATIC_ONLY(VectorElementComparer); |
276 template <typename U> | 284 template <typename U> |
277 static bool compareElement(const std::unique_ptr<T>& left, const U& right) { | 285 static bool compareElement(const std::unique_ptr<T>& left, const U& right) { |
278 return left.get() == right; | 286 return left.get() == right; |
279 } | 287 } |
280 }; | 288 }; |
281 | 289 |
| 290 // A collection of all the traits used by Vector. This is basically an |
| 291 // implementation detail of Vector, and you should specialize individual traits |
| 292 // defined above, if you want to customize Vector's behavior. |
282 template <typename T> | 293 template <typename T> |
283 struct VectorTypeOperations { | 294 struct VectorTypeOperations { |
284 STATIC_ONLY(VectorTypeOperations); | 295 STATIC_ONLY(VectorTypeOperations); |
285 static void destruct(T* begin, T* end) { | 296 static void destruct(T* begin, T* end) { |
286 VectorDestructor<VectorTraits<T>::needsDestruction, T>::destruct(begin, | 297 VectorDestructor<VectorTraits<T>::needsDestruction, T>::destruct(begin, |
287 end); | 298 end); |
288 } | 299 } |
289 | 300 |
290 static void initialize(T* begin, T* end) { | 301 static void initialize(T* begin, T* end) { |
291 VectorInitializer<VectorTraits<T>::canInitializeWithMemset, T>::initialize( | 302 VectorInitializer<VectorTraits<T>::canInitializeWithMemset, T>::initialize( |
(...skipping 28 matching lines...) Expand all Loading... |
320 a, b, size); | 331 a, b, size); |
321 } | 332 } |
322 | 333 |
323 template <typename U> | 334 template <typename U> |
324 static bool compareElement(const T& left, U&& right) { | 335 static bool compareElement(const T& left, U&& right) { |
325 return VectorElementComparer<T>::compareElement(left, | 336 return VectorElementComparer<T>::compareElement(left, |
326 std::forward<U>(right)); | 337 std::forward<U>(right)); |
327 } | 338 } |
328 }; | 339 }; |
329 | 340 |
| 341 // |
| 342 // VectorBuffer |
| 343 // |
| 344 |
| 345 // VectorBuffer is an implementation detail of Vector and Deque. It manages |
| 346 // Vector's underlying buffer, and does operations like allocation or |
| 347 // expansion. |
| 348 // |
| 349 // Not meant for general consumption. |
| 350 |
330 template <typename T, bool hasInlineCapacity, typename Allocator> | 351 template <typename T, bool hasInlineCapacity, typename Allocator> |
331 class VectorBufferBase { | 352 class VectorBufferBase { |
332 WTF_MAKE_NONCOPYABLE(VectorBufferBase); | 353 WTF_MAKE_NONCOPYABLE(VectorBufferBase); |
333 DISALLOW_NEW(); | 354 DISALLOW_NEW(); |
334 | 355 |
335 public: | 356 public: |
336 void allocateBuffer(size_t newCapacity) { | 357 void allocateBuffer(size_t newCapacity) { |
337 DCHECK(newCapacity); | 358 DCHECK(newCapacity); |
338 DCHECK_LE(newCapacity, | 359 DCHECK_LE(newCapacity, |
339 Allocator::template maxElementCountInBackingStore<T>()); | 360 Allocator::template maxElementCountInBackingStore<T>()); |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 static const size_t m_inlineBufferSize = inlineCapacity * sizeof(T); | 809 static const size_t m_inlineBufferSize = inlineCapacity * sizeof(T); |
789 T* inlineBuffer() { return reinterpret_cast_ptr<T*>(m_inlineBuffer.buffer); } | 810 T* inlineBuffer() { return reinterpret_cast_ptr<T*>(m_inlineBuffer.buffer); } |
790 const T* inlineBuffer() const { | 811 const T* inlineBuffer() const { |
791 return reinterpret_cast_ptr<const T*>(m_inlineBuffer.buffer); | 812 return reinterpret_cast_ptr<const T*>(m_inlineBuffer.buffer); |
792 } | 813 } |
793 | 814 |
794 AlignedBuffer<m_inlineBufferSize, WTF_ALIGN_OF(T)> m_inlineBuffer; | 815 AlignedBuffer<m_inlineBufferSize, WTF_ALIGN_OF(T)> m_inlineBuffer; |
795 template <typename U, size_t inlineBuffer, typename V> | 816 template <typename U, size_t inlineBuffer, typename V> |
796 friend class Deque; | 817 friend class Deque; |
797 }; | 818 }; |
798 // Heap-allocated vectors with no inlineCapacity never need a destructor. | 819 |
| 820 // |
| 821 // Vector |
| 822 // |
| 823 |
799 template <typename T, | 824 template <typename T, |
800 size_t inlineCapacity = 0, | 825 size_t inlineCapacity = 0, |
801 typename Allocator = PartitionAllocator> | 826 typename Allocator = PartitionAllocator> |
802 class Vector | 827 class Vector |
803 : private VectorBuffer<T, INLINE_CAPACITY, Allocator>, | 828 : private VectorBuffer<T, INLINE_CAPACITY, Allocator>, |
| 829 // Heap-allocated vectors with no inlineCapacity never need a destructor. |
804 public ConditionalDestructor<Vector<T, INLINE_CAPACITY, Allocator>, | 830 public ConditionalDestructor<Vector<T, INLINE_CAPACITY, Allocator>, |
805 (INLINE_CAPACITY == 0) && | 831 (INLINE_CAPACITY == 0) && |
806 Allocator::isGarbageCollected> { | 832 Allocator::isGarbageCollected> { |
807 USE_ALLOCATOR(Vector, Allocator); | 833 USE_ALLOCATOR(Vector, Allocator); |
808 using Base = VectorBuffer<T, INLINE_CAPACITY, Allocator>; | 834 using Base = VectorBuffer<T, INLINE_CAPACITY, Allocator>; |
809 using TypeOperations = VectorTypeOperations<T>; | 835 using TypeOperations = VectorTypeOperations<T>; |
810 using OffsetRange = typename Base::OffsetRange; | 836 using OffsetRange = typename Base::OffsetRange; |
811 | 837 |
812 public: | 838 public: |
813 typedef T ValueType; | 839 typedef T ValueType; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 template <typename U> | 1059 template <typename U> |
1034 void appendSlowCase(U&&); | 1060 void appendSlowCase(U&&); |
1035 | 1061 |
1036 using Base::m_size; | 1062 using Base::m_size; |
1037 using Base::buffer; | 1063 using Base::buffer; |
1038 using Base::swapVectorBuffer; | 1064 using Base::swapVectorBuffer; |
1039 using Base::allocateBuffer; | 1065 using Base::allocateBuffer; |
1040 using Base::allocationSize; | 1066 using Base::allocationSize; |
1041 }; | 1067 }; |
1042 | 1068 |
| 1069 // |
| 1070 // Vector out-of-line implementation |
| 1071 // |
| 1072 |
1043 template <typename T, size_t inlineCapacity, typename Allocator> | 1073 template <typename T, size_t inlineCapacity, typename Allocator> |
1044 Vector<T, inlineCapacity, Allocator>::Vector(const Vector& other) | 1074 Vector<T, inlineCapacity, Allocator>::Vector(const Vector& other) |
1045 : Base(other.capacity()) { | 1075 : Base(other.capacity()) { |
1046 ANNOTATE_NEW_BUFFER(begin(), capacity(), other.size()); | 1076 ANNOTATE_NEW_BUFFER(begin(), capacity(), other.size()); |
1047 m_size = other.size(); | 1077 m_size = other.size(); |
1048 TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); | 1078 TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); |
1049 } | 1079 } |
1050 | 1080 |
1051 template <typename T, size_t inlineCapacity, typename Allocator> | 1081 template <typename T, size_t inlineCapacity, typename Allocator> |
1052 template <size_t otherCapacity> | 1082 template <size_t otherCapacity> |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 visitor, *const_cast<T*>(bufferEntry)); | 1649 visitor, *const_cast<T*>(bufferEntry)); |
1620 checkUnusedSlots(buffer() + size(), buffer() + capacity()); | 1650 checkUnusedSlots(buffer() + size(), buffer() + capacity()); |
1621 } | 1651 } |
1622 } | 1652 } |
1623 | 1653 |
1624 } // namespace WTF | 1654 } // namespace WTF |
1625 | 1655 |
1626 using WTF::Vector; | 1656 using WTF::Vector; |
1627 | 1657 |
1628 #endif // WTF_Vector_h | 1658 #endif // WTF_Vector_h |
OLD | NEW |