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