GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: aliased_struct.h Lines: 3 3 100.0 %
Date: 2022-05-20 04:15:46 Branches: 1 2 50.0 %

Line Branch Exec Source
1
#ifndef SRC_ALIASED_STRUCT_H_
2
#define SRC_ALIASED_STRUCT_H_
3
4
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
6
#include "node_internals.h"
7
#include "v8.h"
8
#include <memory>
9
10
namespace node {
11
12
// AliasedStruct is a utility that allows uses a V8 Backing Store
13
// to be exposed to the C++/C side as a struct and to the
14
// JavaScript side as an ArrayBuffer to efficiently share
15
// data without marshalling. It is similar in nature to
16
// AliasedBuffer.
17
//
18
//   struct Foo { int x; }
19
//
20
//   AliasedStruct<Foo> foo;
21
//   foo->x = 1;
22
//
23
//   Local<ArrayBuffer> ab = foo.GetArrayBuffer();
24
template <typename T>
25
class AliasedStruct final {
26
 public:
27
  template <typename... Args>
28
  explicit AliasedStruct(v8::Isolate* isolate, Args&&... args);
29
30
  inline AliasedStruct(const AliasedStruct& that);
31
32
  inline ~AliasedStruct();
33
34
  inline AliasedStruct& operator=(AliasedStruct&& that) noexcept;
35
36
1104
  v8::Local<v8::ArrayBuffer> GetArrayBuffer() const {
37
2208
    return buffer_.Get(isolate_);
38
  }
39
40
  const T* Data() const { return ptr_; }
41
42
  T* Data() { return ptr_; }
43
44
  const T& operator*() const { return *ptr_; }
45
46
  T& operator*()  { return *ptr_; }
47
48
  const T* operator->() const { return ptr_; }
49
50
5360
  T* operator->() { return ptr_; }
51
52
 private:
53
  v8::Isolate* isolate_;
54
  std::shared_ptr<v8::BackingStore> store_;
55
  T* ptr_;
56
  v8::Global<v8::ArrayBuffer> buffer_;
57
};
58
59
}  // namespace node
60
61
#endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
62
63
#endif  // SRC_ALIASED_STRUCT_H_