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 GenericTypedArrayView_h
27#define GenericTypedArrayView_h
28
29#include "ArrayBuffer.h"
30#include "ArrayBufferView.h"
31
32namespace JSC {
33
34template<typename Adaptor>
35class GenericTypedArrayView : public ArrayBufferView {
36protected:
37    GenericTypedArrayView(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length);
38
39public:
40    static PassRefPtr<GenericTypedArrayView> create(unsigned length);
41    static PassRefPtr<GenericTypedArrayView> create(const typename Adaptor::Type* array, unsigned length);
42    static PassRefPtr<GenericTypedArrayView> create(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length);
43
44    static PassRefPtr<GenericTypedArrayView> createUninitialized(unsigned length);
45
46    typename Adaptor::Type* data() const { return static_cast<typename Adaptor::Type*>(baseAddress()); }
47
48    bool set(GenericTypedArrayView<Adaptor>* array, unsigned offset)
49    {
50        return setImpl(array, offset * sizeof(typename Adaptor::Type));
51    }
52
53    bool setRange(const typename Adaptor::Type* data, size_t dataLength, unsigned offset)
54    {
55        return setRangeImpl(
56            reinterpret_cast<const char*>(data),
57            dataLength * sizeof(typename Adaptor::Type),
58            offset * sizeof(typename Adaptor::Type));
59    }
60
61    bool zeroRange(unsigned offset, size_t length)
62    {
63        return zeroRangeImpl(offset * sizeof(typename Adaptor::Type), length * sizeof(typename Adaptor::Type));
64    }
65
66    void zeroFill() { zeroRange(0, length()); }
67
68    unsigned length() const
69    {
70        if (isNeutered())
71            return 0;
72        return m_length;
73    }
74
75    virtual unsigned byteLength() const override
76    {
77        return length() * sizeof(typename Adaptor::Type);
78    }
79
80    typename Adaptor::Type item(unsigned index) const
81    {
82        ASSERT_WITH_SECURITY_IMPLICATION(index < this->length());
83        return data()[index];
84    }
85
86    void set(unsigned index, double value) const
87    {
88        ASSERT_WITH_SECURITY_IMPLICATION(index < this->length());
89        data()[index] = Adaptor::toNativeFromDouble(value);
90    }
91
92    bool checkInboundData(unsigned offset, unsigned pos) const
93    {
94        unsigned length = this->length();
95        return (offset <= length
96            && offset + pos <= length
97            // check overflow
98            && offset + pos >= offset);
99    }
100
101    PassRefPtr<GenericTypedArrayView> subarray(int start) const;
102    PassRefPtr<GenericTypedArrayView> subarray(int start, int end) const;
103
104    virtual TypedArrayType getType() const override
105    {
106        return Adaptor::typeValue;
107    }
108
109    virtual JSArrayBufferView* wrap(ExecState*, JSGlobalObject*) override;
110
111private:
112    unsigned m_length;
113};
114
115} // namespace JSC
116
117#endif // GenericTypedArrayView_h
118
119