// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PPAPI_CPP_VAR_ARRAY_BUFFER_H_
#define PPAPI_CPP_VAR_ARRAY_BUFFER_H_
#include "ppapi/cpp/var.h"
/// @file
/// This file defines the API for interacting with a JavaScript ArrayBuffer.
namespace pp {
/// VarArrayBuffer provides a way to interact with JavaScript
/// ArrayBuffers, which represent a contiguous sequence of bytes. Note that
/// these vars are not part of the embedding page's DOM, and can only be
/// shared with JavaScript using the PostMessage and
/// HandleMessage functions of Instance.
class VarArrayBuffer : public Var {
public:
/// The default constructor constructs a VarArrayBuffer which is
/// 0 byte long.
VarArrayBuffer();
/// Construct a VarArrayBuffer given a var for which
/// is_array_buffer() is true. This will refer to the same
/// ArrayBuffer as var, but allows you to access methods
/// specific to VarArrayBuffer.
///
/// @param[in] var An ArrayBuffer var.
explicit VarArrayBuffer(const Var& var);
/// Construct a new VarArrayBuffer which is
/// size_in_bytes bytes long and initialized to zero.
///
/// @param[in] size_in_bytes The size of the constructed
/// ArrayBuffer in bytes.
explicit VarArrayBuffer(uint32_t size_in_bytes);
/// Copy constructor.
VarArrayBuffer(const VarArrayBuffer& buffer) : Var(buffer) {}
virtual ~VarArrayBuffer() {}
/// This function assigns one VarArrayBuffer to another
/// VarArrayBuffer.
///
/// @param[in] other The VarArrayBuffer to be assigned.
///
/// @return The resulting VarArrayBuffer.
VarArrayBuffer& operator=(const VarArrayBuffer& other);
/// This function assigns one VarArrayBuffer to another
/// VarArrayBuffer. A Var's assignment operator is overloaded
/// here so that we can check for assigning a non-ArrayBuffer var to a
/// VarArrayBuffer.
///
/// @param[in] other The VarArrayBuffer to be assigned.
///
/// @return The resulting VarArrayBuffer (as a Var&).
virtual Var& operator=(const Var& other);
/// ByteLength() retrieves the length of the VarArrayBuffer in
/// bytes.
///
/// @return The length of the VarArrayBuffer in bytes.
uint32_t ByteLength() const;
/// Map() maps the ArrayBuffer in to the module's address space
/// and returns a pointer to the beginning of the internal buffer for
/// this ArrayBuffer. ArrayBuffers are copied when transmitted,
/// so changes to the underlying memory are not automatically available to
/// the embedding page.
///
/// Note that calling Map() can be a relatively expensive operation. Use care
/// when calling it in performance-critical code. For example, you should call
/// it only once when looping over an ArrayBuffer.
///
/// Example:
///
/// @code
/// char* data = static_cast(array_buffer_var.Map());
/// uint32_t byte_length = array_buffer_var.ByteLength();
/// for (uint32_t i = 0; i < byte_length; ++i)
/// data[i] = 'A';
/// @endcode
///
/// @return A pointer to the internal buffer for this
/// ArrayBuffer.
void* Map();
/// Unmap() unmaps this ArrayBuffer var from the module address
/// space. Use this if you want to save memory but might want to call Map()
/// to map the buffer again later.
void Unmap();
private:
void ConstructWithSize(uint32_t size_in_bytes);
};
} // namespace pp
#endif // PPAPI_CPP_VAR_ARRAY_BUFFER_H_