1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef GIN_ARRAY_BUFFER_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define GIN_ARRAY_BUFFER_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/converter.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gin/gin_export.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "v8/include/v8.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gin {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void* Allocate(size_t length) OVERRIDE;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void* AllocateUninitialized(size_t length) OVERRIDE;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void Free(void* data, size_t length) OVERRIDE;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GIN_EXPORT static ArrayBufferAllocator* SharedInstance();
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GIN_EXPORT ArrayBuffer {
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArrayBuffer();
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArrayBuffer(v8::Isolate* isolate, v8::Handle<v8::ArrayBuffer> buffer);
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~ArrayBuffer();
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ArrayBuffer& operator=(const ArrayBuffer& other);
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* bytes() const { return bytes_; }
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t num_bytes() const { return num_bytes_; }
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  class Private;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<Private> private_;
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* bytes_;
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t num_bytes_;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY(ArrayBuffer);
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)template<>
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GIN_EXPORT Converter<ArrayBuffer> {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     ArrayBuffer* out);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GIN_EXPORT ArrayBufferView {
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArrayBufferView();
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArrayBufferView(v8::Isolate* isolate, v8::Handle<v8::ArrayBufferView> view);
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~ArrayBufferView();
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ArrayBufferView& operator=(const ArrayBufferView& other);
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void* bytes() const {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return static_cast<uint8_t*>(array_buffer_.bytes()) + offset_;
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t num_bytes() const { return num_bytes_; }
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ArrayBuffer array_buffer_;
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t offset_;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t num_bytes_;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY(ArrayBufferView);
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)template<>
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct GIN_EXPORT Converter<ArrayBufferView> {
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     ArrayBufferView* out);
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace gin
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // GIN_ARRAY_BUFFER_H_
81