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