1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#ifndef OHOS_IDL_AUTOPTR_H
17ca0551cfSopenharmony_ci#define OHOS_IDL_AUTOPTR_H
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_cinamespace OHOS {
20ca0551cfSopenharmony_cinamespace Idl {
21ca0551cfSopenharmony_citemplate<class T>
22ca0551cfSopenharmony_ciclass AutoPtr {
23ca0551cfSopenharmony_cipublic:
24ca0551cfSopenharmony_ci    AutoPtr()
25ca0551cfSopenharmony_ci        : mPtr(nullptr)
26ca0551cfSopenharmony_ci    {}
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_ci    AutoPtr(T* other);
29ca0551cfSopenharmony_ci
30ca0551cfSopenharmony_ci    AutoPtr(const AutoPtr<T>& other);
31ca0551cfSopenharmony_ci
32ca0551cfSopenharmony_ci    AutoPtr(AutoPtr<T>&& other);
33ca0551cfSopenharmony_ci
34ca0551cfSopenharmony_ci    ~AutoPtr();
35ca0551cfSopenharmony_ci
36ca0551cfSopenharmony_ci    AutoPtr& operator=(T* other);
37ca0551cfSopenharmony_ci
38ca0551cfSopenharmony_ci    AutoPtr& operator=(const AutoPtr<T>& other);
39ca0551cfSopenharmony_ci
40ca0551cfSopenharmony_ci    AutoPtr& operator=(AutoPtr<T>&& other);
41ca0551cfSopenharmony_ci
42ca0551cfSopenharmony_ci    void MoveTo(T** other);
43ca0551cfSopenharmony_ci
44ca0551cfSopenharmony_ci    inline operator T*() const;
45ca0551cfSopenharmony_ci
46ca0551cfSopenharmony_ci    inline T** operator&();
47ca0551cfSopenharmony_ci
48ca0551cfSopenharmony_ci    inline T* operator->() const;
49ca0551cfSopenharmony_ci
50ca0551cfSopenharmony_ci    inline T& operator*() const;
51ca0551cfSopenharmony_ci
52ca0551cfSopenharmony_ci    inline T* Get() const;
53ca0551cfSopenharmony_ci
54ca0551cfSopenharmony_ci    inline bool operator==(T* other) const;
55ca0551cfSopenharmony_ci
56ca0551cfSopenharmony_ci    inline bool operator==(const AutoPtr<T>& other) const;
57ca0551cfSopenharmony_ci
58ca0551cfSopenharmony_ci    inline bool operator!=(T* other) const;
59ca0551cfSopenharmony_ci
60ca0551cfSopenharmony_ci    inline bool operator!=(const AutoPtr<T>& other) const;
61ca0551cfSopenharmony_ci
62ca0551cfSopenharmony_ci    inline bool operator>(T* other) const;
63ca0551cfSopenharmony_ci
64ca0551cfSopenharmony_ci    inline bool operator>(const AutoPtr<T>& other) const;
65ca0551cfSopenharmony_ci
66ca0551cfSopenharmony_ci    inline bool operator<(T* other) const;
67ca0551cfSopenharmony_ci
68ca0551cfSopenharmony_ci    inline bool operator<(const AutoPtr<T>& other) const;
69ca0551cfSopenharmony_ci
70ca0551cfSopenharmony_ci    inline bool operator<=(T* other) const;
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_ci    inline bool operator<=(const AutoPtr<T>& other) const;
73ca0551cfSopenharmony_ci
74ca0551cfSopenharmony_ci    inline bool operator>=(T* other) const;
75ca0551cfSopenharmony_ci
76ca0551cfSopenharmony_ci    inline bool operator>=(const AutoPtr<T>& other) const;
77ca0551cfSopenharmony_ci
78ca0551cfSopenharmony_ciprivate:
79ca0551cfSopenharmony_ci    T* mPtr;
80ca0551cfSopenharmony_ci};
81ca0551cfSopenharmony_ci
82ca0551cfSopenharmony_citemplate<class T>
83ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(T* other)
84ca0551cfSopenharmony_ci    : mPtr(other)
85ca0551cfSopenharmony_ci{
86ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
87ca0551cfSopenharmony_ci        mPtr->AddRef();
88ca0551cfSopenharmony_ci    }
89ca0551cfSopenharmony_ci}
90ca0551cfSopenharmony_ci
91ca0551cfSopenharmony_citemplate<class T>
92ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(const AutoPtr<T>& other)
93ca0551cfSopenharmony_ci    : mPtr(other.mPtr)
94ca0551cfSopenharmony_ci{
95ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
96ca0551cfSopenharmony_ci        mPtr->AddRef();
97ca0551cfSopenharmony_ci    }
98ca0551cfSopenharmony_ci}
99ca0551cfSopenharmony_ci
100ca0551cfSopenharmony_citemplate<class T>
101ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(AutoPtr<T>&& other)
102ca0551cfSopenharmony_ci    : mPtr(other.mPtr)
103ca0551cfSopenharmony_ci{
104ca0551cfSopenharmony_ci    other.mPtr = nullptr;
105ca0551cfSopenharmony_ci}
106ca0551cfSopenharmony_ci
107ca0551cfSopenharmony_citemplate<class T>
108ca0551cfSopenharmony_ciAutoPtr<T>::~AutoPtr()
109ca0551cfSopenharmony_ci{
110ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
111ca0551cfSopenharmony_ci        mPtr->Release();
112ca0551cfSopenharmony_ci    }
113ca0551cfSopenharmony_ci}
114ca0551cfSopenharmony_ci
115ca0551cfSopenharmony_citemplate<class T>
116ca0551cfSopenharmony_ciAutoPtr<T>& AutoPtr<T>::operator=(T* other)
117ca0551cfSopenharmony_ci{
118ca0551cfSopenharmony_ci    if (mPtr == other) return *this;
119ca0551cfSopenharmony_ci
120ca0551cfSopenharmony_ci    if (other != nullptr) {
121ca0551cfSopenharmony_ci        other->AddRef();
122ca0551cfSopenharmony_ci    }
123ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
124ca0551cfSopenharmony_ci        mPtr->Release();
125ca0551cfSopenharmony_ci    }
126ca0551cfSopenharmony_ci    mPtr = other;
127ca0551cfSopenharmony_ci    return *this;
128ca0551cfSopenharmony_ci}
129ca0551cfSopenharmony_ci
130ca0551cfSopenharmony_citemplate<class T>
131ca0551cfSopenharmony_ciAutoPtr<T>& AutoPtr<T>::operator=(const AutoPtr<T>& other)
132ca0551cfSopenharmony_ci{
133ca0551cfSopenharmony_ci    if (mPtr == other.mPtr) return *this;
134ca0551cfSopenharmony_ci
135ca0551cfSopenharmony_ci    if (other.mPtr != nullptr) {
136ca0551cfSopenharmony_ci        other.mPtr->AddRef();
137ca0551cfSopenharmony_ci    }
138ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
139ca0551cfSopenharmony_ci        mPtr->Release();
140ca0551cfSopenharmony_ci    }
141ca0551cfSopenharmony_ci    mPtr = other.mPtr;
142ca0551cfSopenharmony_ci    return *this;
143ca0551cfSopenharmony_ci}
144ca0551cfSopenharmony_ci
145ca0551cfSopenharmony_citemplate<class T>
146ca0551cfSopenharmony_ciAutoPtr<T>& AutoPtr<T>::operator=(AutoPtr<T>&& other)
147ca0551cfSopenharmony_ci{
148ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
149ca0551cfSopenharmony_ci        mPtr->Release();
150ca0551cfSopenharmony_ci    }
151ca0551cfSopenharmony_ci    mPtr = other.mPtr;
152ca0551cfSopenharmony_ci    other.mPtr = nullptr;
153ca0551cfSopenharmony_ci    return *this;
154ca0551cfSopenharmony_ci}
155ca0551cfSopenharmony_ci
156ca0551cfSopenharmony_citemplate<class T>
157ca0551cfSopenharmony_civoid AutoPtr<T>::MoveTo(T** other)
158ca0551cfSopenharmony_ci{
159ca0551cfSopenharmony_ci    if (other != nullptr) {
160ca0551cfSopenharmony_ci        *other = mPtr;
161ca0551cfSopenharmony_ci        mPtr = nullptr;
162ca0551cfSopenharmony_ci    }
163ca0551cfSopenharmony_ci}
164ca0551cfSopenharmony_ci
165ca0551cfSopenharmony_citemplate<class T>
166ca0551cfSopenharmony_ciAutoPtr<T>::operator T*() const
167ca0551cfSopenharmony_ci{
168ca0551cfSopenharmony_ci    return mPtr;
169ca0551cfSopenharmony_ci}
170ca0551cfSopenharmony_ci
171ca0551cfSopenharmony_citemplate<class T>
172ca0551cfSopenharmony_ciT** AutoPtr<T>::operator&()
173ca0551cfSopenharmony_ci{
174ca0551cfSopenharmony_ci    return &mPtr;
175ca0551cfSopenharmony_ci}
176ca0551cfSopenharmony_ci
177ca0551cfSopenharmony_citemplate<class T>
178ca0551cfSopenharmony_ciT* AutoPtr<T>::operator->() const
179ca0551cfSopenharmony_ci{
180ca0551cfSopenharmony_ci    return mPtr;
181ca0551cfSopenharmony_ci}
182ca0551cfSopenharmony_ci
183ca0551cfSopenharmony_citemplate<class T>
184ca0551cfSopenharmony_ciT& AutoPtr<T>::operator*() const
185ca0551cfSopenharmony_ci{
186ca0551cfSopenharmony_ci    return *mPtr;
187ca0551cfSopenharmony_ci}
188ca0551cfSopenharmony_ci
189ca0551cfSopenharmony_citemplate<class T>
190ca0551cfSopenharmony_ciT* AutoPtr<T>::Get() const
191ca0551cfSopenharmony_ci{
192ca0551cfSopenharmony_ci    return mPtr;
193ca0551cfSopenharmony_ci}
194ca0551cfSopenharmony_ci
195ca0551cfSopenharmony_citemplate<class T>
196ca0551cfSopenharmony_cibool AutoPtr<T>::operator==(T* other) const
197ca0551cfSopenharmony_ci{
198ca0551cfSopenharmony_ci    return mPtr == other;
199ca0551cfSopenharmony_ci}
200ca0551cfSopenharmony_ci
201ca0551cfSopenharmony_citemplate<class T>
202ca0551cfSopenharmony_cibool AutoPtr<T>::operator==(const AutoPtr<T>& other) const
203ca0551cfSopenharmony_ci{
204ca0551cfSopenharmony_ci    return mPtr == other.mPtr;
205ca0551cfSopenharmony_ci}
206ca0551cfSopenharmony_ci
207ca0551cfSopenharmony_citemplate<class T>
208ca0551cfSopenharmony_cibool AutoPtr<T>::operator!=(T* other) const
209ca0551cfSopenharmony_ci{
210ca0551cfSopenharmony_ci    return mPtr != other;
211ca0551cfSopenharmony_ci}
212ca0551cfSopenharmony_ci
213ca0551cfSopenharmony_citemplate<class T>
214ca0551cfSopenharmony_cibool AutoPtr<T>::operator!=(const AutoPtr<T>& other) const
215ca0551cfSopenharmony_ci{
216ca0551cfSopenharmony_ci    return mPtr != other.mPtr;
217ca0551cfSopenharmony_ci}
218ca0551cfSopenharmony_ci
219ca0551cfSopenharmony_citemplate<class T>
220ca0551cfSopenharmony_cibool AutoPtr<T>::operator>(T* other) const
221ca0551cfSopenharmony_ci{
222ca0551cfSopenharmony_ci    return mPtr > other;
223ca0551cfSopenharmony_ci}
224ca0551cfSopenharmony_ci
225ca0551cfSopenharmony_citemplate<class T>
226ca0551cfSopenharmony_cibool AutoPtr<T>::operator>(const AutoPtr<T>& other) const
227ca0551cfSopenharmony_ci{
228ca0551cfSopenharmony_ci    return mPtr > other.mPtr;
229ca0551cfSopenharmony_ci}
230ca0551cfSopenharmony_ci
231ca0551cfSopenharmony_citemplate<class T>
232ca0551cfSopenharmony_cibool AutoPtr<T>::operator<(T* other) const
233ca0551cfSopenharmony_ci{
234ca0551cfSopenharmony_ci    return mPtr < other;
235ca0551cfSopenharmony_ci}
236ca0551cfSopenharmony_ci
237ca0551cfSopenharmony_citemplate<class T>
238ca0551cfSopenharmony_cibool AutoPtr<T>::operator<(const AutoPtr<T>& other) const
239ca0551cfSopenharmony_ci{
240ca0551cfSopenharmony_ci    return mPtr < other.mPtr;
241ca0551cfSopenharmony_ci}
242ca0551cfSopenharmony_ci
243ca0551cfSopenharmony_citemplate<class T>
244ca0551cfSopenharmony_cibool AutoPtr<T>::operator<=(T* other) const
245ca0551cfSopenharmony_ci{
246ca0551cfSopenharmony_ci    return mPtr <= other;
247ca0551cfSopenharmony_ci}
248ca0551cfSopenharmony_ci
249ca0551cfSopenharmony_citemplate<class T>
250ca0551cfSopenharmony_cibool AutoPtr<T>::operator<=(const AutoPtr<T>& other) const
251ca0551cfSopenharmony_ci{
252ca0551cfSopenharmony_ci    return mPtr <= other.mPtr;
253ca0551cfSopenharmony_ci}
254ca0551cfSopenharmony_ci
255ca0551cfSopenharmony_citemplate<class T>
256ca0551cfSopenharmony_cibool AutoPtr<T>::operator>=(T* other) const
257ca0551cfSopenharmony_ci{
258ca0551cfSopenharmony_ci    return mPtr >= other;
259ca0551cfSopenharmony_ci}
260ca0551cfSopenharmony_ci
261ca0551cfSopenharmony_citemplate<class T>
262ca0551cfSopenharmony_cibool AutoPtr<T>::operator>=(const AutoPtr<T>& other) const
263ca0551cfSopenharmony_ci{
264ca0551cfSopenharmony_ci    return mPtr >= other.mPtr;
265ca0551cfSopenharmony_ci}
266ca0551cfSopenharmony_ci}
267ca0551cfSopenharmony_ci}
268ca0551cfSopenharmony_ci#endif // OHOS_IDL_AUTOPTR_H
269