Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WTF / wtf / OSObjectPtr.h
1 /*
2  * Copyright (C) 2014 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 #ifndef OSObjectPtr_h
27 #define OSObjectPtr_h
28
29 #include <os/object.h>
30 #include <wtf/Assertions.h>
31 #include <wtf/StdLibExtras.h>
32
33 namespace WTF {
34
35 template<typename T> class OSObjectPtr;
36 template<typename T> OSObjectPtr<T> adoptOSObject(T);
37
38 template<typename T>
39 static inline void retainOSObject(T ptr)
40 {
41     os_retain(ptr);
42 }
43
44 template<typename T>
45 static inline void releaseOSObject(T ptr)
46 {
47     os_release(ptr);
48 }
49
50 template<typename T> class OSObjectPtr {
51 public:
52     OSObjectPtr()
53         : m_ptr(nullptr)
54     {
55     }
56
57     ~OSObjectPtr()
58     {
59         if (m_ptr)
60             releaseOSObject(m_ptr);
61     }
62
63     T get() const { return m_ptr; }
64
65     explicit operator bool() const { return m_ptr; }
66     bool operator!() const { return !m_ptr; }
67
68     OSObjectPtr(const OSObjectPtr& other)
69         : m_ptr(other.m_ptr)
70     {
71         if (m_ptr)
72             retainOSObject(m_ptr);
73     }
74
75     OSObjectPtr(OSObjectPtr&& other)
76         : m_ptr(other.m_ptr)
77     {
78         other.m_ptr = nullptr;
79     }
80
81     OSObjectPtr& operator=(const OSObjectPtr& other)
82     {
83         OSObjectPtr ptr = other;
84         swap(ptr);
85         return *this;
86     }
87
88     OSObjectPtr& operator=(OSObjectPtr&& other)
89     {
90         OSObjectPtr ptr = WTFMove(other);
91         swap(ptr);
92         return *this;
93     }
94
95     OSObjectPtr& operator=(std::nullptr_t)
96     {
97         if (m_ptr)
98             releaseOSObject(m_ptr);
99         m_ptr = nullptr;
100
101         return *this;
102     }
103
104     void swap(OSObjectPtr& other)
105     {
106         std::swap(m_ptr, other.m_ptr);
107     }
108
109     T leakRef() WARN_UNUSED_RETURN
110     {
111         return std::exchange(m_ptr, nullptr);
112     }
113
114     friend OSObjectPtr adoptOSObject<T>(T);
115
116 private:
117     struct AdoptOSObject { };
118     OSObjectPtr(AdoptOSObject, T ptr)
119         : m_ptr(ptr)
120     {
121     }
122
123     T m_ptr;
124 };
125
126 template<typename T> inline OSObjectPtr<T> adoptOSObject(T ptr)
127 {
128     return OSObjectPtr<T>(typename OSObjectPtr<T>::AdoptOSObject { }, ptr);
129 }
130
131 } // namespace WTF
132
133 using WTF::OSObjectPtr;
134 using WTF::adoptOSObject;
135
136 #endif // OSObjectPtr_h