Index: Source/core/dom/FlexibleArrayBufferView.h |
diff --git a/Source/core/dom/FlexibleArrayBufferView.h b/Source/core/dom/FlexibleArrayBufferView.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..969ef50765a64125eadfa7ee9d860ec983cdaa78 |
--- /dev/null |
+++ b/Source/core/dom/FlexibleArrayBufferView.h |
@@ -0,0 +1,80 @@ |
+// Copyright 2015 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 FlexibleArrayBufferView_h |
+#define FlexibleArrayBufferView_h |
+ |
+#include "core/CoreExport.h" |
+#include "core/dom/DOMArrayBufferView.h" |
+#include "platform/heap/Handle.h" |
+#include "wtf/Noncopyable.h" |
+ |
+namespace blink { |
+ |
+class CORE_EXPORT FlexibleArrayBufferView { |
+ STACK_ALLOCATED(); |
+ WTF_MAKE_NONCOPYABLE(FlexibleArrayBufferView); |
+public: |
+ FlexibleArrayBufferView() |
+ : m_smallData(nullptr) |
+ , m_smallLength(0) |
+ { |
+ } |
+ |
+ void setFull(DOMArrayBufferView* full) { m_full = full; } |
+ void setSmall(void* data, size_t length) |
+ { |
+ m_smallData = data; |
+ m_smallLength = length; |
+ } |
+ |
+ void clear() |
+ { |
+ m_full = nullptr; |
+ m_smallData = nullptr; |
+ m_smallLength = 0; |
+ } |
+ |
+ bool isEmpty() const { return !m_full && !m_smallData; } |
+ bool isFull() const { return m_full; } |
+ |
+ DOMArrayBufferView* full() const |
+ { |
+ ASSERT(isFull()); |
+ return m_full.get(); |
+ } |
+ |
+ // WARNING: The pointer returned by baseAddressMaybeOnStack() may point to |
+ // temporary storage that is only valid during the life-time of the |
+ // FlexibleArrayBufferView object. |
+ void* baseAddressMaybeOnStack() const |
+ { |
+ ASSERT(!isEmpty()); |
+ return isFull() ? m_full->baseAddress() : m_smallData; |
+ } |
+ |
+ unsigned byteOffset() const |
+ { |
+ ASSERT(!isEmpty()); |
+ return isFull() ? m_full->byteOffset() : 0; |
+ } |
+ |
+ unsigned byteLength() const |
+ { |
+ ASSERT(!isEmpty()); |
+ return isFull() ? m_full->byteLength() : m_smallLength; |
+ } |
+ |
+ operator bool() const { return !isEmpty(); } |
+ |
+private: |
+ RefPtr<DOMArrayBufferView> m_full; |
+ |
+ void* m_smallData; |
+ size_t m_smallLength; |
+}; |
+ |
+} // namespace blink |
+ |
+#endif // FlexibleArrayBufferView_h |