1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef INCLUDE_V8_CONTAINER_H_
6#define INCLUDE_V8_CONTAINER_H_
7
8#include <stddef.h>
9#include <stdint.h>
10
11#include "v8-local-handle.h"  // NOLINT(build/include_directory)
12#include "v8-object.h"        // NOLINT(build/include_directory)
13#include "v8config.h"         // NOLINT(build/include_directory)
14
15namespace v8 {
16
17class Context;
18class Isolate;
19
20/**
21 * An instance of the built-in array constructor (ECMA-262, 15.4.2).
22 */
23class V8_EXPORT Array : public Object {
24 public:
25  uint32_t Length() const;
26
27  /**
28   * Creates a JavaScript array with the given length. If the length
29   * is negative the returned array will have length 0.
30   */
31  static Local<Array> New(Isolate* isolate, int length = 0);
32
33  /**
34   * Creates a JavaScript array out of a Local<Value> array in C++
35   * with a known length.
36   */
37  static Local<Array> New(Isolate* isolate, Local<Value>* elements,
38                          size_t length);
39  V8_INLINE static Array* Cast(Value* value) {
40#ifdef V8_ENABLE_CHECKS
41    CheckCast(value);
42#endif
43    return static_cast<Array*>(value);
44  }
45
46 private:
47  Array();
48  static void CheckCast(Value* obj);
49};
50
51/**
52 * An instance of the built-in Map constructor (ECMA-262, 6th Edition, 23.1.1).
53 */
54class V8_EXPORT Map : public Object {
55 public:
56  size_t Size() const;
57  void Clear();
58  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
59                                              Local<Value> key);
60  V8_WARN_UNUSED_RESULT MaybeLocal<Map> Set(Local<Context> context,
61                                            Local<Value> key,
62                                            Local<Value> value);
63  V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context,
64                                        Local<Value> key);
65  V8_WARN_UNUSED_RESULT Maybe<bool> Delete(Local<Context> context,
66                                           Local<Value> key);
67
68  /**
69   * Returns an array of length Size() * 2, where index N is the Nth key and
70   * index N + 1 is the Nth value.
71   */
72  Local<Array> AsArray() const;
73
74  /**
75   * Creates a new empty Map.
76   */
77  static Local<Map> New(Isolate* isolate);
78
79  V8_INLINE static Map* Cast(Value* value) {
80#ifdef V8_ENABLE_CHECKS
81    CheckCast(value);
82#endif
83    return static_cast<Map*>(value);
84  }
85
86 private:
87  Map();
88  static void CheckCast(Value* obj);
89};
90
91/**
92 * An instance of the built-in Set constructor (ECMA-262, 6th Edition, 23.2.1).
93 */
94class V8_EXPORT Set : public Object {
95 public:
96  size_t Size() const;
97  void Clear();
98  V8_WARN_UNUSED_RESULT MaybeLocal<Set> Add(Local<Context> context,
99                                            Local<Value> key);
100  V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context,
101                                        Local<Value> key);
102  V8_WARN_UNUSED_RESULT Maybe<bool> Delete(Local<Context> context,
103                                           Local<Value> key);
104
105  /**
106   * Returns an array of the keys in this Set.
107   */
108  Local<Array> AsArray() const;
109
110  /**
111   * Creates a new empty Set.
112   */
113  static Local<Set> New(Isolate* isolate);
114
115  V8_INLINE static Set* Cast(Value* value) {
116#ifdef V8_ENABLE_CHECKS
117    CheckCast(value);
118#endif
119    return static_cast<Set*>(value);
120  }
121
122 private:
123  Set();
124  static void CheckCast(Value* obj);
125};
126
127}  // namespace v8
128
129#endif  // INCLUDE_V8_CONTAINER_H_
130