Shaka Player Embedded
member.h
Go to the documentation of this file.
1 // Copyright 2016 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef SHAKA_EMBEDDED_CORE_MEMBER_H_
16 #define SHAKA_EMBEDDED_CORE_MEMBER_H_
17 
18 #include <glog/logging.h>
19 
20 #include <string>
21 
22 #include "src/core/ref_ptr.h"
23 #include "src/mapping/convert_js.h"
26 #include "src/mapping/names.h"
27 #include "src/memory/heap_tracer.h"
29 #include "src/util/templates.h"
30 
31 namespace shaka {
32 
39 template <typename T>
40 class Member : public GenericConverter, public memory::Traceable {
41  static_assert(!util::is_v8_type<T>::value,
42  "Cannot use Member<T> for JavaScript objects.");
43 
44  public:
45  static std::string name() {
46  return TypeName<T>::name();
47  }
48 
49  Member() {}
50 
51  Member(std::nullptr_t) {} // NOLINT(runtime/explicit)
52 
53  template <typename U>
54  Member(U* other) { // NOLINT(runtime/explicit)
55  reset(other);
56  }
57 
58  Member(const Member& other) {
59  reset(other.ptr_);
60  }
61 
62  template <typename U>
63  Member(const Member<U>& other) {
64  reset(other.ptr_);
65  }
66 
67  Member(Member&& other) {
68  reset(other.ptr_);
69  other.ptr_ = nullptr;
70  }
71 
72  template <typename U>
73  Member(Member<U>&& other) {
74  reset(other.ptr_);
75  other.ptr_ = nullptr;
76  }
77 
78  template <typename U>
79  Member(const RefPtr<U>& other) { // NOLINT(runtime/explicit)
80  reset(other.get());
81  }
82 
83  template <typename U>
84  Member(RefPtr<U>&& other) { // NOLINT(runtime/explicit)
85  reset(other.get());
86  other.reset();
87  }
88 
89  ~Member() override {
90  // Do not free |ptr_| since it is handled by ObjectTracker.
91  }
92 
93 
94  Member& operator=(const Member& other) {
95  reset(other.ptr_);
96  return *this;
97  }
98  Member& operator=(Member&& other) {
99  reset(other.ptr_);
100  other.ptr_ = nullptr;
101  return *this;
102  }
103 
104  T& operator*() const {
105  CHECK(ptr_);
106  return *ptr_;
107  }
108  T* operator->() const {
109  CHECK(ptr_);
110  return ptr_;
111  }
112  operator T*() const {
113  return ptr_;
114  }
115 
117  bool empty() const {
118  return ptr_ == nullptr;
119  }
120 
122  T* get() const {
123  return ptr_;
124  }
125 
126  template <typename U = T>
127  void reset(U* other = nullptr) {
128  ptr_ = other;
129  // Force the given pointer to be alive. This is required if the GC run is
130  // currently going on and the parent object has already been traced. If
131  // that is the case, this pointer may not be considered alive. The only way
132  // to call this method is if the parent is alive, so |other| must be
133  // alive too.
134  if (other)
135  memory::ObjectTracker::Instance()->ForceAlive(other);
136  }
137 
138  bool TryConvert(Handle<JsValue> source) override {
139  RefPtr<T> local_dest;
140  if (!FromJsValue(source, &local_dest))
141  return false;
142  ptr_ = local_dest;
143  return true;
144  }
145 
146  ReturnVal<JsValue> ToJsValue() const override {
147  if (empty())
148  return JsNull();
149  else
150  return ptr_->JsThis();
151  }
152 
153  void Trace(memory::HeapTracer* tracer) const override {
154  tracer->Trace(ptr_);
155  }
156 
157  private:
158  T* ptr_ = nullptr;
159 };
160 
161 
162 // RefPtr constructors, defined here to avoid a circular header dependency.
163 template <typename T>
164 template <typename U>
166  reset(other.get());
167 }
168 
169 template <typename T>
170 template <typename U>
172  reset(other.get());
173  other.reset();
174 }
175 
176 } // namespace shaka
177 
178 #endif // SHAKA_EMBEDDED_CORE_MEMBER_H_
T & operator*() const
Definition: member.h:104
bool empty() const
Definition: member.h:117
bool FromJsValue(Handle< JsValue > source, T *dest)
Definition: convert_js.h:370
ReturnVal< JsValue > JsNull()
Definition: js_wrappers.cc:288
T * get() const
Definition: member.h:122
~Member() override
Definition: member.h:89
const char * source
Definition: media_utils.cc:30
Member & operator=(Member &&other)
Definition: member.h:98
Member(const Member< U > &other)
Definition: member.h:63
void Trace(const Traceable *ptr)
Definition: heap_tracer.cc:43
static std::string name()
Definition: member.h:45
T * get() const
Definition: ref_ptr.h:125
void Trace(memory::HeapTracer *tracer) const override
Definition: member.h:153
Member & operator=(const Member &other)
Definition: member.h:94
Member(const RefPtr< U > &other)
Definition: member.h:79
void reset(U *other=nullptr)
Definition: member.h:127
Member(const Member &other)
Definition: member.h:58
Member(RefPtr< U > &&other)
Definition: member.h:84
bool TryConvert(Handle< JsValue > source) override
Definition: member.h:138
Member(Member &&other)
Definition: member.h:67
Member(U *other)
Definition: member.h:54
ReturnVal< JsValue > ToJsValue() const override
Definition: member.h:146
Member(Member< U > &&other)
Definition: member.h:73
T * operator->() const
Definition: member.h:108
Member(std::nullptr_t)
Definition: member.h:51
static std::string name()
Definition: names.h:48