1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef GenericTypedArrayViewInlines_h 27#define GenericTypedArrayViewInlines_h 28 29#include "GenericTypedArrayView.h" 30#include "JSGlobalObject.h" 31 32namespace JSC { 33 34template<typename Adaptor> 35GenericTypedArrayView<Adaptor>::GenericTypedArrayView( 36 PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned length) 37 : ArrayBufferView(buffer, byteOffset) 38 , m_length(length) 39{ 40} 41 42template<typename Adaptor> 43PassRefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create(unsigned length) 44{ 45 RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(length, sizeof(typename Adaptor::Type)); 46 if (!buffer) 47 return 0; 48 return create(buffer, 0, length); 49} 50 51template<typename Adaptor> 52PassRefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create( 53 const typename Adaptor::Type* array, unsigned length) 54{ 55 RefPtr<GenericTypedArrayView> result = create(length); 56 memcpy(result->data(), array, length * sizeof(typename Adaptor::Type)); 57 return result; 58} 59 60template<typename Adaptor> 61PassRefPtr<GenericTypedArrayView<Adaptor>> GenericTypedArrayView<Adaptor>::create( 62 PassRefPtr<ArrayBuffer> passedBuffer, unsigned byteOffset, unsigned length) 63{ 64 RefPtr<ArrayBuffer> buffer = passedBuffer; 65 if (!verifySubRange<typename Adaptor::Type>(buffer, byteOffset, length)) 66 return 0; 67 68 return adoptRef(new GenericTypedArrayView(buffer, byteOffset, length)); 69} 70 71template<typename Adaptor> 72PassRefPtr<GenericTypedArrayView<Adaptor>> 73GenericTypedArrayView<Adaptor>::createUninitialized(unsigned length) 74{ 75 RefPtr<ArrayBuffer> buffer = 76 ArrayBuffer::createUninitialized(length, sizeof(typename Adaptor::Type)); 77 if (!buffer) 78 return 0; 79 return create(buffer, 0, length); 80} 81 82template<typename Adaptor> 83PassRefPtr<GenericTypedArrayView<Adaptor>> 84GenericTypedArrayView<Adaptor>::subarray(int start) const 85{ 86 return subarray(start, length()); 87} 88 89template<typename Adaptor> 90PassRefPtr<GenericTypedArrayView<Adaptor>> 91GenericTypedArrayView<Adaptor>::subarray(int start, int end) const 92{ 93 unsigned offset, length; 94 calculateOffsetAndLength(start, end, this->length(), &offset, &length); 95 clampOffsetAndNumElements<Adaptor::Type>(buffer(), byteOffset(), &offset, &length); 96 return create(buffer(), offset, length); 97} 98 99template<typename Adaptor> 100JSArrayBufferView* GenericTypedArrayView<Adaptor>::wrap( 101 ExecState* exec, JSGlobalObject* globalObject) 102{ 103 return Adaptor::JSViewType::create( 104 exec->vm(), globalObject->typedArrayStructure(Adaptor::typeValue), this); 105} 106 107} // namespace JSC 108 109#endif // GenericTypedArrayViewInlines_h 110 111