# DataView

Class `Napi::DataView` inherits from class [`Napi::Object`][].

The `Napi::DataView` class corresponds to the
[JavaScript `DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
class.

## Methods

### New

Allocates a new `Napi::DataView` instance with a given `Napi::ArrayBuffer`.

```cpp
static Napi::DataView Napi::DataView::New(napi_env env, Napi::ArrayBuffer arrayBuffer);
```

- `[in] env`: The environment in which to create the `Napi::DataView` instance.
- `[in] arrayBuffer` : `Napi::ArrayBuffer` underlying the `Napi::DataView`.

Returns a new `Napi::DataView` instance.

### New

Allocates a new `Napi::DataView` instance with a given `Napi::ArrayBuffer`.

```cpp
static Napi::DataView Napi::DataView::New(napi_env env, Napi::ArrayBuffer arrayBuffer, size_t byteOffset);
```

- `[in] env`: The environment in which to create the `Napi::DataView` instance.
- `[in] arrayBuffer` : `Napi::ArrayBuffer` underlying the `Napi::DataView`.
- `[in] byteOffset` : The byte offset within the `Napi::ArrayBuffer` from which to start projecting the `Napi::DataView`.

Returns a new `Napi::DataView` instance.

### New

Allocates a new `Napi::DataView` instance with a given `Napi::ArrayBuffer`.

```cpp
static Napi::DataView Napi::DataView::New(napi_env env, Napi::ArrayBuffer arrayBuffer, size_t byteOffset, size_t byteLength);
```

- `[in] env`: The environment in which to create the `Napi::DataView` instance.
- `[in] arrayBuffer` : `Napi::ArrayBuffer` underlying the `Napi::DataView`.
- `[in] byteOffset` : The byte offset within the `Napi::ArrayBuffer` from which to start projecting the `Napi::DataView`.
- `[in] byteLength` : Number of elements in the `Napi::DataView`.

Returns a new `Napi::DataView` instance.

### Constructor

Initializes an empty instance of the `Napi::DataView` class.

```cpp
Napi::DataView();
```

### Constructor

Initializes a wrapper instance of an existing `Napi::DataView` instance.

```cpp
Napi::DataView(napi_env env, napi_value value);
```

- `[in] env`: The environment in which to create the `Napi::DataView` instance.
- `[in] value`: The `Napi::DataView` reference to wrap.

### ArrayBuffer

```cpp
Napi::ArrayBuffer Napi::DataView::ArrayBuffer() const;
```

Returns the backing array buffer.

### ByteOffset

```cpp
size_t Napi::DataView::ByteOffset() const;
```

Returns the offset into the `Napi::DataView` where the array starts, in bytes.

### ByteLength

```cpp
size_t Napi::DataView::ByteLength() const;
```

Returns the length of the array, in bytes.

### GetFloat32

```cpp
float Napi::DataView::GetFloat32(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a signed 32-bit float (float) at the specified byte offset from the start of the `Napi::DataView`.

### GetFloat64

```cpp
double Napi::DataView::GetFloat64(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a signed 64-bit float (double) at the specified byte offset from the start of the `Napi::DataView`.

### GetInt8

```cpp
int8_t Napi::DataView::GetInt8(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a signed 8-bit integer (byte) at the specified byte offset from the start of the `Napi::DataView`.

### GetInt16

```cpp
int16_t Napi::DataView::GetInt16(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a signed 16-bit integer (short) at the specified byte offset from the start of the `Napi::DataView`.

### GetInt32

```cpp
int32_t Napi::DataView::GetInt32(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a signed 32-bit integer (long) at the specified byte offset from the start of the `Napi::DataView`.

### GetUint8

```cpp
uint8_t Napi::DataView::GetUint8(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `Napi::DataView`.

### GetUint16

```cpp
uint16_t Napi::DataView::GetUint16(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `Napi::DataView`.

### GetUint32

```cpp
uint32_t Napi::DataView::GetUint32(size_t byteOffset) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.

Returns a unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `Napi::DataView`.

### SetFloat32

```cpp
void Napi::DataView::SetFloat32(size_t byteOffset, float value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetFloat64

```cpp
void Napi::DataView::SetFloat64(size_t byteOffset, double value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetInt8

```cpp
void Napi::DataView::SetInt8(size_t byteOffset, int8_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetInt16

```cpp
void Napi::DataView::SetInt16(size_t byteOffset, int16_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetInt32

```cpp
void Napi::DataView::SetInt32(size_t byteOffset, int32_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetUint8

```cpp
void Napi::DataView::SetUint8(size_t byteOffset, uint8_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetUint16

```cpp
void Napi::DataView::SetUint16(size_t byteOffset, uint16_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

### SetUint32

```cpp
void Napi::DataView::SetUint32(size_t byteOffset, uint32_t value) const;
```

- `[in] byteOffset`: The offset, in byte, from the start of the view where to read the data.
- `[in] value`: The value to set.

[`Napi::Object`]: ./object.md
