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