0069b386d750cd22fc016294202c60f643b8d31a
[WebKit-https.git] / Source / JavaScriptCore / runtime / GenericTypedArrayView.h
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
32 namespace JSC {
33
34 template<typename Adaptor>
35 class GenericTypedArrayView : public ArrayBufferView {
36 protected:
37     GenericTypedArrayView(PassRefPtr<ArrayBuffer>, unsigned byteOffset, unsigned length);
38
39 public:
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
111 private:
112     unsigned m_length;
113 };
114
115 } // namespace JSC
116
117 #endif // GenericTypedArrayView_h
118