192a12a34Sopenharmony_ci/* 292a12a34Sopenharmony_ci * Copyright (c) 2020 Huawei Device Co., Ltd. 392a12a34Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 492a12a34Sopenharmony_ci * you may not use this file except in compliance with the License. 592a12a34Sopenharmony_ci * You may obtain a copy of the License at 692a12a34Sopenharmony_ci * 792a12a34Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 892a12a34Sopenharmony_ci * 992a12a34Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1092a12a34Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1192a12a34Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1292a12a34Sopenharmony_ci * See the License for the specific language governing permissions and 1392a12a34Sopenharmony_ci * limitations under the License. 1492a12a34Sopenharmony_ci */ 1592a12a34Sopenharmony_ci 1692a12a34Sopenharmony_ci#ifndef OHOS_UPTR_H 1792a12a34Sopenharmony_ci#define OHOS_UPTR_H 1892a12a34Sopenharmony_ci 1992a12a34Sopenharmony_cinamespace OHOS { 2092a12a34Sopenharmony_citemplate<typename T> 2192a12a34Sopenharmony_cistruct RemoveRef { 2292a12a34Sopenharmony_ci typedef T type; 2392a12a34Sopenharmony_ci}; 2492a12a34Sopenharmony_ci 2592a12a34Sopenharmony_citemplate<class T> 2692a12a34Sopenharmony_cistruct RemoveRef<T &> { 2792a12a34Sopenharmony_ci typedef T type; 2892a12a34Sopenharmony_ci}; 2992a12a34Sopenharmony_ci 3092a12a34Sopenharmony_citemplate<class T> 3192a12a34Sopenharmony_cistruct RemoveRef<T &&> { 3292a12a34Sopenharmony_ci typedef T type; 3392a12a34Sopenharmony_ci}; 3492a12a34Sopenharmony_ci 3592a12a34Sopenharmony_citemplate<typename T> 3692a12a34Sopenharmony_citypename RemoveRef<T>::type &&Move(T &&t) 3792a12a34Sopenharmony_ci{ 3892a12a34Sopenharmony_ci using Rtype = typename RemoveRef<T>::type &&; 3992a12a34Sopenharmony_ci return static_cast<Rtype>(t); 4092a12a34Sopenharmony_ci} 4192a12a34Sopenharmony_ci 4292a12a34Sopenharmony_citemplate<typename T> 4392a12a34Sopenharmony_ciclass Uptr { 4492a12a34Sopenharmony_cipublic: 4592a12a34Sopenharmony_ci explicit Uptr(T *p = nullptr) : ptr_(p) 4692a12a34Sopenharmony_ci { 4792a12a34Sopenharmony_ci } 4892a12a34Sopenharmony_ci 4992a12a34Sopenharmony_ci ~Uptr() 5092a12a34Sopenharmony_ci { 5192a12a34Sopenharmony_ci delete ptr_; 5292a12a34Sopenharmony_ci } 5392a12a34Sopenharmony_ci 5492a12a34Sopenharmony_ci Uptr(Uptr &&ptr) : ptr_(ptr.ptr_) 5592a12a34Sopenharmony_ci { 5692a12a34Sopenharmony_ci ptr.ptr_ = nullptr; 5792a12a34Sopenharmony_ci } 5892a12a34Sopenharmony_ci 5992a12a34Sopenharmony_ci void reset(T *p = nullptr) 6092a12a34Sopenharmony_ci { 6192a12a34Sopenharmony_ci if (p != ptr_) { 6292a12a34Sopenharmony_ci delete ptr_; 6392a12a34Sopenharmony_ci ptr_ = p; 6492a12a34Sopenharmony_ci } 6592a12a34Sopenharmony_ci } 6692a12a34Sopenharmony_ci 6792a12a34Sopenharmony_ci T &operator*() const 6892a12a34Sopenharmony_ci { 6992a12a34Sopenharmony_ci return *ptr_; 7092a12a34Sopenharmony_ci } 7192a12a34Sopenharmony_ci 7292a12a34Sopenharmony_ci T *operator->() const 7392a12a34Sopenharmony_ci { 7492a12a34Sopenharmony_ci return ptr_; 7592a12a34Sopenharmony_ci } 7692a12a34Sopenharmony_ci 7792a12a34Sopenharmony_ci T *get() const 7892a12a34Sopenharmony_ci { 7992a12a34Sopenharmony_ci return ptr_; 8092a12a34Sopenharmony_ci } 8192a12a34Sopenharmony_ci 8292a12a34Sopenharmony_ci bool operator==(T *p) const 8392a12a34Sopenharmony_ci { 8492a12a34Sopenharmony_ci return ptr_ == p; 8592a12a34Sopenharmony_ci } 8692a12a34Sopenharmony_ci 8792a12a34Sopenharmony_ci bool operator!=(T *p) const 8892a12a34Sopenharmony_ci { 8992a12a34Sopenharmony_ci return ptr_ != p; 9092a12a34Sopenharmony_ci } 9192a12a34Sopenharmony_ci 9292a12a34Sopenharmony_ci void swap(Uptr &p2) 9392a12a34Sopenharmony_ci { 9492a12a34Sopenharmony_ci T* tmp = ptr_; 9592a12a34Sopenharmony_ci ptr_ = p2.ptr_; 9692a12a34Sopenharmony_ci p2.ptr_ = tmp; 9792a12a34Sopenharmony_ci } 9892a12a34Sopenharmony_ci 9992a12a34Sopenharmony_ci T *release() 10092a12a34Sopenharmony_ci { 10192a12a34Sopenharmony_ci T *retVal = ptr_; 10292a12a34Sopenharmony_ci ptr_ = nullptr; 10392a12a34Sopenharmony_ci return retVal; 10492a12a34Sopenharmony_ci } 10592a12a34Sopenharmony_ci 10692a12a34Sopenharmony_ciprivate: 10792a12a34Sopenharmony_ci T *ptr_ = nullptr; 10892a12a34Sopenharmony_ci 10992a12a34Sopenharmony_ci template<class T2> bool operator==(Uptr<T2> const &p2) const; 11092a12a34Sopenharmony_ci template<class T2> bool operator!=(Uptr<T2> const &p2) const; 11192a12a34Sopenharmony_ci 11292a12a34Sopenharmony_ci Uptr(const Uptr &); 11392a12a34Sopenharmony_ci void operator=(const Uptr&); 11492a12a34Sopenharmony_ci}; 11592a12a34Sopenharmony_ci} // namespace OHOS 11692a12a34Sopenharmony_ci#endif // OHOS_UPTR_H