Changeset 44899 in webkit for trunk/JavaScriptCore/wtf/SegmentedVector.h
- Timestamp:
- Jun 20, 2009, 6:27:26 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/SegmentedVector.h
r44897 r44899 34 34 namespace WTF { 35 35 36 // An iterator for SegmentedVector. It supports only the pre ++ operator 37 template <typename T, size_t SegmentSize> class SegmentedVector; 38 template <typename T, size_t SegmentSize> class SegmentedVectorIterator { 39 private: 40 friend class SegmentedVector<T, SegmentSize>; 41 public: 42 typedef SegmentedVectorIterator<T, SegmentSize> Iterator; 43 44 ~SegmentedVectorIterator() { } 45 46 T& operator*() const { return m_vector.m_segments.at(m_segment)->at(m_index); } 47 T* operator->() const { return &m_vector.m_segments.at(m_segment)->at(m_index); } 48 49 // Only prefix ++ operator supported 50 Iterator& operator++() 51 { 52 ASSERT(m_index != SegmentSize); 53 ++m_index; 54 if (m_index >= m_vector.m_segments.at(m_segment)->size()) { 55 if (m_segment + 1 < m_vector.m_segments.size()) { 56 ASSERT(m_vector.m_segments.at(m_segment)->size() > 0); 57 ++m_segment; 58 m_index = 0; 59 } else { 60 // Points to the "end" symbol 61 m_segment = 0; 62 m_index = SegmentSize; 63 } 64 } 65 return *this; 66 } 67 68 bool operator==(const Iterator& other) const 69 { 70 return (m_index == other.m_index && m_segment = other.m_segment && &m_vector == &other.m_vector); 71 } 72 73 bool operator!=(const Iterator& other) const 74 { 75 return (m_index != other.m_index || m_segment != other.m_segment || &m_vector != &other.m_vector); 76 } 77 78 SegmentedVectorIterator& operator=(const SegmentedVectorIterator<T, SegmentSize>& other) 79 { 80 m_vector = other.m_vector; 81 m_segment = other.m_segment; 82 m_index = other.m_index; 83 return *this; 84 } 85 86 private: 87 SegmentedVectorIterator(SegmentedVector<T, SegmentSize>& vector, size_t segment, size_t index) 88 : m_vector(vector) 89 , m_segment(segment) 90 , m_index(index) 91 { 92 } 93 94 SegmentedVector<T, SegmentSize>& m_vector; 95 size_t m_segment; 96 size_t m_index; 97 }; 98 36 99 // SegmentedVector is just like Vector, but it doesn't move the values 37 100 // stored in its buffer when it grows. Therefore, it is safe to keep 38 101 // pointers into a SegmentedVector. 39 102 template <typename T, size_t SegmentSize> class SegmentedVector { 103 friend class SegmentedVectorIterator<T, SegmentSize>; 40 104 public: 105 typedef SegmentedVectorIterator<T, SegmentSize> Iterator; 106 41 107 SegmentedVector() 42 108 : m_size(0) … … 81 147 m_segments.append(new Segment); 82 148 segmentFor(m_size - 1)->uncheckedAppend(value); 149 } 150 151 T& alloc() 152 { 153 append<T>(T()); 154 return last(); 83 155 } 84 156 … … 107 179 } 108 180 181 Iterator begin() 182 { 183 return Iterator(*this, 0, m_size ? 0 : SegmentSize); 184 } 185 186 Iterator end() 187 { 188 return Iterator(*this, 0, SegmentSize); 189 } 190 109 191 private: 110 192 typedef Vector<T, SegmentSize> Segment;
Note:
See TracChangeset
for help on using the changeset viewer.