OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 #ifndef TerminatedArray_h | 4 #ifndef TerminatedArray_h |
5 #define TerminatedArray_h | 5 #define TerminatedArray_h |
6 | 6 |
7 #include "wtf/Allocator.h" | 7 #include "wtf/Allocator.h" |
8 #include "wtf/PtrUtil.h" | 8 #include "wtf/PtrUtil.h" |
| 9 #include "wtf/VectorTraits.h" |
9 #include "wtf/allocator/Partitions.h" | 10 #include "wtf/allocator/Partitions.h" |
10 #include <memory> | 11 #include <memory> |
11 | 12 |
12 namespace WTF { | 13 namespace WTF { |
13 | 14 |
14 // TerminatedArray<T> represents a sequence of elements of type T in which each | 15 // TerminatedArray<T> represents a sequence of elements of type T in which each |
15 // element knows whether it is the last element in the sequence or not. For this | 16 // element knows whether it is the last element in the sequence or not. For this |
16 // check type T must provide isLastInArray method. | 17 // check type T must provide isLastInArray method. |
17 // TerminatedArray<T> can only be constructed by TerminatedArrayBuilder<T>. | 18 // TerminatedArray<T> can only be constructed by TerminatedArrayBuilder<T>. |
18 template <typename T> | 19 template <typename T> |
19 class TerminatedArray { | 20 class TerminatedArray { |
20 DISALLOW_NEW(); | 21 DISALLOW_NEW(); |
21 WTF_MAKE_NONCOPYABLE(TerminatedArray); | 22 WTF_MAKE_NONCOPYABLE(TerminatedArray); |
22 | 23 |
23 public: | 24 public: |
| 25 // When TerminatedArray::Allocator implementations grow the backing |
| 26 // store, old is copied into the new and larger block. |
| 27 static_assert(VectorTraits<T>::canCopyWithMemcpy, |
| 28 "Array elements must be memory copyable"); |
| 29 |
24 T& at(size_t index) { return reinterpret_cast<T*>(this)[index]; } | 30 T& at(size_t index) { return reinterpret_cast<T*>(this)[index]; } |
25 const T& at(size_t index) const { | 31 const T& at(size_t index) const { |
26 return reinterpret_cast<const T*>(this)[index]; | 32 return reinterpret_cast<const T*>(this)[index]; |
27 } | 33 } |
28 | 34 |
29 template <typename U> | 35 template <typename U> |
30 class iterator_base final { | 36 class iterator_base final { |
31 STACK_ALLOCATED(); | 37 STACK_ALLOCATED(); |
32 | 38 |
33 public: | 39 public: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 | 114 |
109 template <typename, template <typename> class> | 115 template <typename, template <typename> class> |
110 friend class TerminatedArrayBuilder; | 116 friend class TerminatedArrayBuilder; |
111 }; | 117 }; |
112 | 118 |
113 } // namespace WTF | 119 } // namespace WTF |
114 | 120 |
115 using WTF::TerminatedArray; | 121 using WTF::TerminatedArray; |
116 | 122 |
117 #endif // TerminatedArray_h | 123 #endif // TerminatedArray_h |
OLD | NEW |