Unreviewed, rolling out r234489.
[WebKit-https.git] / Source / WTF / wtf / WeakObjCPtr.h
1 /*
2  * Copyright (C) 2013-2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include <objc/runtime.h>
29 #include <type_traits>
30 #include <wtf/RetainPtr.h>
31
32 #if __has_include(<objc/objc-internal.h>)
33 #include <objc/objc-internal.h>
34 #else
35 extern "C" {
36 id objc_loadWeakRetained(id*);
37 id objc_initWeak(id*, id);
38 void objc_destroyWeak(id*);
39 void objc_copyWeak(id*, id*);
40 void objc_moveWeak(id*, id*);
41 }
42 #endif
43
44 namespace WTF {
45
46 template<typename T> class WeakObjCPtr {
47 public:
48     typedef typename std::remove_pointer<T>::type ValueType;
49
50     WeakObjCPtr()
51         : m_weakReference(nullptr)
52     {
53     }
54
55     WeakObjCPtr(ValueType *ptr)
56     {
57         objc_initWeak(&m_weakReference, ptr);
58     }
59
60     WeakObjCPtr(const WeakObjCPtr& other)
61     {
62         objc_copyWeak(&m_weakReference, const_cast<id*>(&other.m_weakReference));
63     }
64
65     WeakObjCPtr(WeakObjCPtr&& other)
66     {
67         objc_moveWeak(&m_weakReference, &other.m_weakReference);
68     }
69
70     ~WeakObjCPtr()
71     {
72         objc_destroyWeak(&m_weakReference);
73     }
74
75     WeakObjCPtr& operator=(ValueType *ptr)
76     {
77         objc_storeWeak(&m_weakReference, ptr);
78
79         return *this;
80     }
81
82     bool operator!() const
83     {
84         return !get();
85     }
86
87     RetainPtr<ValueType> get() const
88     {
89         return adoptNS(objc_loadWeakRetained(const_cast<id*>(&m_weakReference)));
90     }
91
92     ValueType *getAutoreleased() const
93     {
94         return static_cast<ValueType *>(objc_loadWeak(const_cast<id*>(&m_weakReference)));
95     }
96
97     explicit operator ValueType *() const { return getAutoreleased(); }
98
99 private:
100     id m_weakReference;
101 };
102
103 } // namespace WTF
104
105 using WTF::WeakObjCPtr;