GenericTypedArrayViewInlines.h [plain text]
#ifndef GenericTypedArrayViewInlines_h
#define GenericTypedArrayViewInlines_h
#include "GenericTypedArrayView.h"
#include "JSGlobalObject.h"
namespace JSC {
template<typename Adaptor>
GenericTypedArrayView<Adaptor>::GenericTypedArrayView(
PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned length)
: ArrayBufferView(buffer, byteOffset)
, m_length(length)
{
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(unsigned length)
{
RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(length, sizeof(typename Adaptor::Type));
if (!buffer)
return nullptr;
return create(buffer.release(), 0, length);
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(
const typename Adaptor::Type* array, unsigned length)
{
RefPtr<GenericTypedArrayView> result = create(length);
memcpy(result->data(), array, length * sizeof(typename Adaptor::Type));
return result;
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(
PassRefPtr<ArrayBuffer> passedBuffer, unsigned byteOffset, unsigned length)
{
RefPtr<ArrayBuffer> buffer = passedBuffer;
if (!verifySubRangeLength(buffer, byteOffset, length, sizeof(typename Adaptor::Type))
|| !verifyByteOffsetAlignment(byteOffset, sizeof(typename Adaptor::Type))) {
return nullptr;
}
return adoptRef(new GenericTypedArrayView(buffer.release(), byteOffset, length));
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>>
GenericTypedArrayView<Adaptor>::createUninitialized(unsigned length)
{
RefPtr<ArrayBuffer> buffer =
ArrayBuffer::createUninitialized(length, sizeof(typename Adaptor::Type));
if (!buffer)
return nullptr;
return create(buffer.release(), 0, length);
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>>
GenericTypedArrayView<Adaptor>::subarray(int start) const
{
return subarray(start, length());
}
template<typename Adaptor>
RefPtr<GenericTypedArrayView<Adaptor>>
GenericTypedArrayView<Adaptor>::subarray(int start, int end) const
{
unsigned offset, length;
calculateOffsetAndLength(start, end, this->length(), &offset, &length);
clampOffsetAndNumElements<Adaptor::Type>(buffer(), byteOffset(), &offset, &length);
return create(buffer(), offset, length);
}
template<typename Adaptor>
JSArrayBufferView* GenericTypedArrayView<Adaptor>::wrap(
ExecState* exec, JSGlobalObject* globalObject)
{
return Adaptor::JSViewType::create(
exec->vm(), globalObject->typedArrayStructure(Adaptor::typeValue), this);
}
}
#endif // GenericTypedArrayViewInlines_h