template <typename T>
void TestUnwrap() {
zc::owned<T> t(new T());
- T* unwrap = t.get();
+ //T* unwrap = t.get();
+
+ zc::ref<T> ref = t.get();
+ T* unwrap2 = ref;
}
void TestMove() {
owned->DoThing();
}
+void PtrHelper(zc::ref<C>* out) {
+ zc::owned<C> c(new C());
+ *out = c.get();
+}
+
+void TestPtr() {
+ zc::ref<C> ref;
+ PtrHelper(&ref);
+ ref->DoThing();
+}
+
int main() {
- TestMove();
+ TestPtr();
}
template <typename T>
class ref {
public:
- explicit ref(owned<T>& o) : ptr_(o.GetRawPointer()), deleter_(o.get_deleter()) {
- deleter_.AddRef(this);
+ ref() : ptr_(nullptr), deleter_(nullptr), deleted_(true) {}
+
+ explicit ref(owned<T>& o) : ptr_(o.GetRawPointer()), deleter_(&o.get_deleter()) {
+ deleter_->AddRef(this);
}
- ref(const ref<T>& o) : ptr_(o.ptr_), deleter_(o.deleter_), deleted_(o.deleted_) {
- if (!deleted_) {
- deleter_.AddRef(this);
- }
+ ref(const ref<T>& o) {
+ *this = o;
}
- ref<T>& operator=(ref<T> o) {
- return ref(o);
+ ref<T>& operator=(const ref<T>& o) {
+ ptr_ = o.ptr_;
+ deleter_ = o.deleter_;
+ deleted_ = o.deleted_;
+ if (!deleted_) {
+ deleter_->AddRef(this);
+ }
+ return *this;
}
~ref() {
MarkDeleted();
- deleter_.RemoveRef(this);
+ deleter_->RemoveRef(this);
}
T* operator->() const {
}
T* ptr_;
- internal::OwnedPtrDeleter<T>& deleter_;
+ internal::OwnedPtrDeleter<T>* deleter_;
bool deleted_ = false;
};