blob: 969ef50765a64125eadfa7ee9d860ec983cdaa78 [file] [log] [blame] [edit]
// 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