/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

[
    Custom=Wrap,
    CustomConstructor(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long byteLength),
    Exposed=Window&Worker,
    TypeChecking=Interface|Nullable,
] interface DataView : ArrayBufferView {
    // All these methods raise an exception if they would read or write beyond the end of the view.

    [RaisesException] byte getInt8(unsigned long byteOffset);
    [RaisesException] octet getUint8(unsigned long byteOffset);

    [RaisesException] short getInt16(unsigned long byteOffset, optional boolean littleEndian);
    [RaisesException] unsigned short getUint16(unsigned long byteOffset, optional boolean littleEndian);
    [RaisesException] long getInt32(unsigned long byteOffset, optional boolean littleEndian);
    [RaisesException] unsigned long getUint32(unsigned long byteOffset, optional boolean littleEndian);

    // Use custom code to handle NaN case for JSC.
    [RaisesException] float getFloat32(unsigned long byteOffset, optional boolean littleEndian);
    [RaisesException] double getFloat64(unsigned long byteOffset, optional boolean littleEndian);

    [RaisesException] void setInt8(unsigned long byteOffset, byte value);
    [RaisesException] void setUint8(unsigned long byteOffset, octet value);

    [RaisesException] void setInt16(unsigned long byteOffset, short value, optional boolean littleEndian);
    [RaisesException] void setUint16(unsigned long byteOffset, unsigned short value, optional boolean littleEndian);
    [RaisesException] void setInt32(unsigned long byteOffset, long value, optional boolean littleEndian);
    [RaisesException] void setUint32(unsigned long byteOffset, unsigned long value, optional boolean littleEndian);
    [RaisesException] void setFloat32(unsigned long byteOffset, float value, optional boolean littleEndian);
    [RaisesException] void setFloat64(unsigned long byteOffset, double value, optional boolean littleEndian);
};
