Index: Source/wtf/TerminatedArray.h |
diff --git a/Source/wtf/TerminatedArray.h b/Source/wtf/TerminatedArray.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fcf5ea12e312a435e284367c1875f3b1d465112e |
--- /dev/null |
+++ b/Source/wtf/TerminatedArray.h |
@@ -0,0 +1,85 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+#ifndef TerminatedArray_h |
+#define TerminatedArray_h |
+ |
+#include "wtf/FastAllocBase.h" |
+#include "wtf/OwnPtr.h" |
+ |
+namespace WTF { |
+ |
+// TerminatedArray<T> represents a sequence of elements of type T in which each |
+// element knows whether it is the last element in the sequence or not. For this |
+// check type T must provide isLastInArray method. |
+// TerminatedArray<T> can only be constructed by TerminatedArrayBuilder<T>. |
+template<typename T> |
+class TerminatedArray { |
+ WTF_MAKE_FAST_ALLOCATED; |
+ WTF_MAKE_NONCOPYABLE(TerminatedArray); |
+public: |
+ T& at(size_t index) { return reinterpret_cast<T*>(this)[index]; } |
+ const T& at(size_t index) const { return reinterpret_cast<const T*>(this)[index]; } |
+ |
+ template<typename U> |
+ class iterator_base { |
+ public: |
+ iterator_base& operator++() |
+ { |
+ if (m_val->isLastInArray()) { |
+ m_val = 0; |
+ } else { |
+ ++m_val; |
+ } |
+ return *this; |
+ } |
+ |
+ U& operator*() const { return *m_val; } |
+ |
+ bool operator==(const iterator_base& other) const { return m_val == other.m_val; } |
+ bool operator!=(const iterator_base& other) const { return !(*this == other); } |
+ |
+ private: |
+ iterator_base(U* val) : m_val(val) { } |
+ |
+ U* m_val; |
+ |
+ friend class TerminatedArray; |
+ }; |
+ |
+ typedef iterator_base<T> iterator; |
+ typedef iterator_base<const T> const_iterator; |
+ |
+ iterator begin() { return iterator(reinterpret_cast<T*>(this)); } |
+ const_iterator begin() const { return const_iterator(reinterpret_cast<const T*>(this)); } |
+ |
+ iterator end() { return iterator(0); } |
+ const_iterator end() const { return const_iterator(0); } |
+ |
+ size_t size() const |
+ { |
+ size_t count = 0; |
+ for (const_iterator it = begin(); it != end(); ++it) |
+ count++; |
+ return count; |
+ } |
+ |
+private: |
+ static PassOwnPtr<TerminatedArray> create(size_t capacity) |
+ { |
+ return adoptPtr(static_cast<TerminatedArray*>(fastMalloc(capacity * sizeof(T)))); |
+ } |
+ |
+ static PassOwnPtr<TerminatedArray> resize(PassOwnPtr<TerminatedArray> array, size_t capacity) |
+ { |
+ return adoptPtr(static_cast<TerminatedArray*>(fastRealloc(array.leakPtr(), capacity * sizeof(T)))); |
+ } |
+ |
+ template<typename> friend class TerminatedArrayBuilder; |
+}; |
+ |
+} // namespace WTF |
+ |
+using WTF::TerminatedArray; |
+ |
+#endif // TerminatedArray_h |