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