1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2024 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    inline AutoPtr() : mPtr(nullptr) {}
25ca0551cfSopenharmony_ci
26ca0551cfSopenharmony_ci    AutoPtr(T *other);
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_ci    AutoPtr(const AutoPtr<T> &other);
29ca0551cfSopenharmony_ci
30ca0551cfSopenharmony_ci    AutoPtr(AutoPtr<T> &&other);
31ca0551cfSopenharmony_ci
32ca0551cfSopenharmony_ci    ~AutoPtr();
33ca0551cfSopenharmony_ci
34ca0551cfSopenharmony_ci    AutoPtr &operator=(T *other);
35ca0551cfSopenharmony_ci
36ca0551cfSopenharmony_ci    AutoPtr &operator=(const AutoPtr<T> &other);
37ca0551cfSopenharmony_ci
38ca0551cfSopenharmony_ci    AutoPtr &operator=(AutoPtr<T> &&other);
39ca0551cfSopenharmony_ci
40ca0551cfSopenharmony_ci    void MoveTo(T **other);
41ca0551cfSopenharmony_ci
42ca0551cfSopenharmony_ci    inline operator T *() const;
43ca0551cfSopenharmony_ci
44ca0551cfSopenharmony_ci    inline T **operator&();
45ca0551cfSopenharmony_ci
46ca0551cfSopenharmony_ci    inline T *operator->() const;
47ca0551cfSopenharmony_ci
48ca0551cfSopenharmony_ci    inline T &operator*() const;
49ca0551cfSopenharmony_ci
50ca0551cfSopenharmony_ci    inline T *Get() const;
51ca0551cfSopenharmony_ci
52ca0551cfSopenharmony_ci    inline bool operator==(T *other) const;
53ca0551cfSopenharmony_ci
54ca0551cfSopenharmony_ci    inline bool operator==(const AutoPtr<T> &other) const;
55ca0551cfSopenharmony_ci
56ca0551cfSopenharmony_ci    inline bool operator!=(T *other) const;
57ca0551cfSopenharmony_ci
58ca0551cfSopenharmony_ci    inline bool operator!=(const AutoPtr<T> &other) const;
59ca0551cfSopenharmony_ci
60ca0551cfSopenharmony_ci    inline bool operator>(T *other) const;
61ca0551cfSopenharmony_ci
62ca0551cfSopenharmony_ci    inline bool operator>(const AutoPtr<T> &other) const;
63ca0551cfSopenharmony_ci
64ca0551cfSopenharmony_ci    inline bool operator<(T *other) const;
65ca0551cfSopenharmony_ci
66ca0551cfSopenharmony_ci    inline bool operator<(const AutoPtr<T> &other) const;
67ca0551cfSopenharmony_ci
68ca0551cfSopenharmony_ci    inline bool operator<=(T *other) const;
69ca0551cfSopenharmony_ci
70ca0551cfSopenharmony_ci    inline bool operator<=(const AutoPtr<T> &other) const;
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_ci    inline bool operator>=(T *other) const;
73ca0551cfSopenharmony_ci
74ca0551cfSopenharmony_ci    inline bool operator>=(const AutoPtr<T> &other) const;
75ca0551cfSopenharmony_ci
76ca0551cfSopenharmony_ciprivate:
77ca0551cfSopenharmony_ci    T *mPtr;
78ca0551cfSopenharmony_ci};
79ca0551cfSopenharmony_ci
80ca0551cfSopenharmony_citemplate <class T>
81ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(T *other) : mPtr(other)
82ca0551cfSopenharmony_ci{
83ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
84ca0551cfSopenharmony_ci        mPtr->AddRef();
85ca0551cfSopenharmony_ci    }
86ca0551cfSopenharmony_ci}
87ca0551cfSopenharmony_ci
88ca0551cfSopenharmony_citemplate <class T>
89ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(const AutoPtr<T> &other) : mPtr(other.mPtr)
90ca0551cfSopenharmony_ci{
91ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
92ca0551cfSopenharmony_ci        mPtr->AddRef();
93ca0551cfSopenharmony_ci    }
94ca0551cfSopenharmony_ci}
95ca0551cfSopenharmony_ci
96ca0551cfSopenharmony_citemplate <class T>
97ca0551cfSopenharmony_ciAutoPtr<T>::AutoPtr(AutoPtr<T> &&other) : mPtr(other.mPtr)
98ca0551cfSopenharmony_ci{
99ca0551cfSopenharmony_ci    other.mPtr = nullptr;
100ca0551cfSopenharmony_ci}
101ca0551cfSopenharmony_ci
102ca0551cfSopenharmony_citemplate <class T>
103ca0551cfSopenharmony_ciAutoPtr<T>::~AutoPtr()
104ca0551cfSopenharmony_ci{
105ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
106ca0551cfSopenharmony_ci        mPtr->Release();
107ca0551cfSopenharmony_ci    }
108ca0551cfSopenharmony_ci}
109ca0551cfSopenharmony_ci
110ca0551cfSopenharmony_citemplate <class T>
111ca0551cfSopenharmony_ciAutoPtr<T> &AutoPtr<T>::operator=(T *other)
112ca0551cfSopenharmony_ci{
113ca0551cfSopenharmony_ci    if (mPtr == other) {
114ca0551cfSopenharmony_ci        return *this;
115ca0551cfSopenharmony_ci    }
116ca0551cfSopenharmony_ci    if (other != nullptr) {
117ca0551cfSopenharmony_ci        other->AddRef();
118ca0551cfSopenharmony_ci    }
119ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
120ca0551cfSopenharmony_ci        mPtr->Release();
121ca0551cfSopenharmony_ci    }
122ca0551cfSopenharmony_ci    mPtr = other;
123ca0551cfSopenharmony_ci    return *this;
124ca0551cfSopenharmony_ci}
125ca0551cfSopenharmony_ci
126ca0551cfSopenharmony_citemplate <class T>
127ca0551cfSopenharmony_ciAutoPtr<T> &AutoPtr<T>::operator=(const AutoPtr<T> &other)
128ca0551cfSopenharmony_ci{
129ca0551cfSopenharmony_ci    if (mPtr == other.mPtr) {
130ca0551cfSopenharmony_ci        return *this;
131ca0551cfSopenharmony_ci    }
132ca0551cfSopenharmony_ci    if (other.mPtr != nullptr) {
133ca0551cfSopenharmony_ci        other.mPtr->AddRef();
134ca0551cfSopenharmony_ci    }
135ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
136ca0551cfSopenharmony_ci        mPtr->Release();
137ca0551cfSopenharmony_ci    }
138ca0551cfSopenharmony_ci    mPtr = other.mPtr;
139ca0551cfSopenharmony_ci    return *this;
140ca0551cfSopenharmony_ci}
141ca0551cfSopenharmony_ci
142ca0551cfSopenharmony_citemplate <class T>
143ca0551cfSopenharmony_ciAutoPtr<T> &AutoPtr<T>::operator=(AutoPtr<T> &&other)
144ca0551cfSopenharmony_ci{
145ca0551cfSopenharmony_ci    if (mPtr != nullptr) {
146ca0551cfSopenharmony_ci        mPtr->Release();
147ca0551cfSopenharmony_ci    }
148ca0551cfSopenharmony_ci    mPtr = other.mPtr;
149ca0551cfSopenharmony_ci    other.mPtr = nullptr;
150ca0551cfSopenharmony_ci    return *this;
151ca0551cfSopenharmony_ci}
152ca0551cfSopenharmony_ci
153ca0551cfSopenharmony_citemplate <class T>
154ca0551cfSopenharmony_civoid AutoPtr<T>::MoveTo(T **other)
155ca0551cfSopenharmony_ci{
156ca0551cfSopenharmony_ci    if (other != nullptr) {
157ca0551cfSopenharmony_ci        *other = mPtr;
158ca0551cfSopenharmony_ci        mPtr = nullptr;
159ca0551cfSopenharmony_ci    }
160ca0551cfSopenharmony_ci}
161ca0551cfSopenharmony_ci
162ca0551cfSopenharmony_citemplate <class T>
163ca0551cfSopenharmony_ciAutoPtr<T>::operator T *() const
164ca0551cfSopenharmony_ci{
165ca0551cfSopenharmony_ci    return mPtr;
166ca0551cfSopenharmony_ci}
167ca0551cfSopenharmony_ci
168ca0551cfSopenharmony_citemplate <class T>
169ca0551cfSopenharmony_ciT **AutoPtr<T>::operator&()
170ca0551cfSopenharmony_ci{
171ca0551cfSopenharmony_ci    return &mPtr;
172ca0551cfSopenharmony_ci}
173ca0551cfSopenharmony_ci
174ca0551cfSopenharmony_citemplate <class T>
175ca0551cfSopenharmony_ciT *AutoPtr<T>::operator->() const
176ca0551cfSopenharmony_ci{
177ca0551cfSopenharmony_ci    return mPtr;
178ca0551cfSopenharmony_ci}
179ca0551cfSopenharmony_ci
180ca0551cfSopenharmony_citemplate <class T>
181ca0551cfSopenharmony_ciT &AutoPtr<T>::operator*() const
182ca0551cfSopenharmony_ci{
183ca0551cfSopenharmony_ci    return *mPtr;
184ca0551cfSopenharmony_ci}
185ca0551cfSopenharmony_ci
186ca0551cfSopenharmony_citemplate <class T>
187ca0551cfSopenharmony_ciT *AutoPtr<T>::Get() const
188ca0551cfSopenharmony_ci{
189ca0551cfSopenharmony_ci    return mPtr;
190ca0551cfSopenharmony_ci}
191ca0551cfSopenharmony_ci
192ca0551cfSopenharmony_citemplate <class T>
193ca0551cfSopenharmony_cibool AutoPtr<T>::operator==(T *other) const
194ca0551cfSopenharmony_ci{
195ca0551cfSopenharmony_ci    return mPtr == other;
196ca0551cfSopenharmony_ci}
197ca0551cfSopenharmony_ci
198ca0551cfSopenharmony_citemplate <class T>
199ca0551cfSopenharmony_cibool AutoPtr<T>::operator==(const AutoPtr<T> &other) const
200ca0551cfSopenharmony_ci{
201ca0551cfSopenharmony_ci    return mPtr == other.mPtr;
202ca0551cfSopenharmony_ci}
203ca0551cfSopenharmony_ci
204ca0551cfSopenharmony_citemplate <class T>
205ca0551cfSopenharmony_cibool AutoPtr<T>::operator!=(T *other) const
206ca0551cfSopenharmony_ci{
207ca0551cfSopenharmony_ci    return mPtr != other;
208ca0551cfSopenharmony_ci}
209ca0551cfSopenharmony_ci
210ca0551cfSopenharmony_citemplate <class T>
211ca0551cfSopenharmony_cibool AutoPtr<T>::operator!=(const AutoPtr<T> &other) const
212ca0551cfSopenharmony_ci{
213ca0551cfSopenharmony_ci    return mPtr != other.mPtr;
214ca0551cfSopenharmony_ci}
215ca0551cfSopenharmony_ci
216ca0551cfSopenharmony_citemplate <class T>
217ca0551cfSopenharmony_cibool AutoPtr<T>::operator>(T *other) const
218ca0551cfSopenharmony_ci{
219ca0551cfSopenharmony_ci    return mPtr > other;
220ca0551cfSopenharmony_ci}
221ca0551cfSopenharmony_ci
222ca0551cfSopenharmony_citemplate <class T>
223ca0551cfSopenharmony_cibool AutoPtr<T>::operator>(const AutoPtr<T> &other) const
224ca0551cfSopenharmony_ci{
225ca0551cfSopenharmony_ci    return mPtr > other.mPtr;
226ca0551cfSopenharmony_ci}
227ca0551cfSopenharmony_ci
228ca0551cfSopenharmony_citemplate <class T>
229ca0551cfSopenharmony_cibool AutoPtr<T>::operator<(T *other) const
230ca0551cfSopenharmony_ci{
231ca0551cfSopenharmony_ci    return mPtr < other;
232ca0551cfSopenharmony_ci}
233ca0551cfSopenharmony_ci
234ca0551cfSopenharmony_citemplate <class T>
235ca0551cfSopenharmony_cibool AutoPtr<T>::operator<(const AutoPtr<T> &other) const
236ca0551cfSopenharmony_ci{
237ca0551cfSopenharmony_ci    return mPtr < other.mPtr;
238ca0551cfSopenharmony_ci}
239ca0551cfSopenharmony_ci
240ca0551cfSopenharmony_citemplate <class T>
241ca0551cfSopenharmony_cibool AutoPtr<T>::operator<=(T *other) const
242ca0551cfSopenharmony_ci{
243ca0551cfSopenharmony_ci    return mPtr <= other;
244ca0551cfSopenharmony_ci}
245ca0551cfSopenharmony_ci
246ca0551cfSopenharmony_citemplate <class T>
247ca0551cfSopenharmony_cibool AutoPtr<T>::operator<=(const AutoPtr<T> &other) const
248ca0551cfSopenharmony_ci{
249ca0551cfSopenharmony_ci    return mPtr <= other.mPtr;
250ca0551cfSopenharmony_ci}
251ca0551cfSopenharmony_ci
252ca0551cfSopenharmony_citemplate <class T>
253ca0551cfSopenharmony_cibool AutoPtr<T>::operator>=(T *other) const
254ca0551cfSopenharmony_ci{
255ca0551cfSopenharmony_ci    return mPtr >= other;
256ca0551cfSopenharmony_ci}
257ca0551cfSopenharmony_ci
258ca0551cfSopenharmony_citemplate <class T>
259ca0551cfSopenharmony_cibool AutoPtr<T>::operator>=(const AutoPtr<T> &other) const
260ca0551cfSopenharmony_ci{
261ca0551cfSopenharmony_ci    return mPtr >= other.mPtr;
262ca0551cfSopenharmony_ci}
263ca0551cfSopenharmony_ci} // namespace Idl
264ca0551cfSopenharmony_ci} // namespace OHOS
265ca0551cfSopenharmony_ci
266ca0551cfSopenharmony_ci#endif // OHOS_IDL_AUTOPTR_H