Index: Source/wtf/TerminatedArrayBuilder.h |
diff --git a/Source/wtf/TerminatedArrayBuilder.h b/Source/wtf/TerminatedArrayBuilder.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c71985e7686d1bd50e42b763c6a9f390a8f4ca24 |
--- /dev/null |
+++ b/Source/wtf/TerminatedArrayBuilder.h |
@@ -0,0 +1,79 @@ |
+// 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 TerminatedArrayBuilder_h |
+#define TerminatedArrayBuilder_h |
+ |
+#include "wtf/OwnPtr.h" |
+ |
+namespace WTF { |
+ |
+template<typename T> |
+class TerminatedArrayBuilder { |
+ DISALLOW_ALLOCATION(); |
+ WTF_MAKE_NONCOPYABLE(TerminatedArrayBuilder); |
+public: |
+ explicit TerminatedArrayBuilder(PassOwnPtr<TerminatedArray<T> > array) |
+ : m_array(array) |
+ , m_count(0) |
+ , m_capacity(0) |
+ { |
+ if (!m_array) |
+ return; |
+ m_capacity = m_count = m_array->size(); |
+ } |
+ |
+ void grow(size_t count) |
+ { |
+ ASSERT(count); |
+ if (!m_array) { |
+ ASSERT(!m_count); |
+ ASSERT(!m_capacity); |
+ m_capacity = count; |
+ m_array = TerminatedArray<T>::create(m_capacity); |
+ return; |
+ } |
+ m_capacity += count; |
+ m_array = TerminatedArray<T>::resize(m_array.release(), m_capacity); |
+ m_array->at(m_count - 1).setLastInArray(false); |
+ } |
+ |
+ void append(const T& item) |
+ { |
+ RELEASE_ASSERT(m_count < m_capacity); |
+ ASSERT(!item.isLastInArray()); |
+ m_array->at(m_count++) = item; |
+ } |
+ |
+ PassOwnPtr<TerminatedArray<T> > release() |
+ { |
+ RELEASE_ASSERT(m_count == m_capacity); |
+ if (m_array) |
+ m_array->at(m_count - 1).setLastInArray(true); |
+ assertValid(); |
+ return m_array.release(); |
+ } |
+ |
+private: |
+#ifndef NDEBUG |
+ void assertValid() |
+ { |
+ for (size_t i = 0; i < m_count; ++i) { |
+ bool isLastInArray = (i + 1 == m_count); |
+ ASSERT(m_array->at(i).isLastInArray() == isLastInArray); |
+ } |
+ } |
+#else |
+ void assertValid() { } |
+#endif |
+ |
+ OwnPtr<TerminatedArray<T> > m_array; |
+ size_t m_count; |
+ size_t m_capacity; |
+}; |
+ |
+} // namespace WTF |
+ |
+using WTF::TerminatedArrayBuilder; |
+ |
+#endif // TerminatedArrayBuilder_h |