1/*
2 * Copyright (c) 2020 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef OHOS_UPTR_H
17#define OHOS_UPTR_H
18
19namespace OHOS {
20template<typename T>
21struct RemoveRef {
22    typedef T type;
23};
24
25template<class T>
26struct RemoveRef<T &> {
27    typedef T type;
28};
29
30template<class T>
31struct RemoveRef<T &&> {
32    typedef T type;
33};
34
35template<typename T>
36typename RemoveRef<T>::type &&Move(T &&t)
37{
38    using Rtype = typename RemoveRef<T>::type &&;
39    return static_cast<Rtype>(t);
40}
41
42template<typename T>
43class Uptr {
44public:
45    explicit Uptr(T *p = nullptr) : ptr_(p)
46    {
47    }
48
49    ~Uptr()
50    {
51        delete ptr_;
52    }
53
54    Uptr(Uptr &&ptr) : ptr_(ptr.ptr_)
55    {
56        ptr.ptr_ = nullptr;
57    }
58
59    void reset(T *p = nullptr)
60    {
61        if (p != ptr_) {
62            delete ptr_;
63            ptr_ = p;
64        }
65    }
66
67    T &operator*() const
68    {
69        return *ptr_;
70    }
71
72    T *operator->() const
73    {
74        return ptr_;
75    }
76
77    T *get() const
78    {
79        return ptr_;
80    }
81
82    bool operator==(T *p) const
83    {
84        return ptr_ == p;
85    }
86
87    bool operator!=(T *p) const
88    {
89        return ptr_ != p;
90    }
91
92    void swap(Uptr &p2)
93    {
94        T* tmp = ptr_;
95        ptr_ = p2.ptr_;
96        p2.ptr_ = tmp;
97    }
98
99    T *release()
100    {
101        T *retVal = ptr_;
102        ptr_ = nullptr;
103        return retVal;
104    }
105
106private:
107    T *ptr_ = nullptr;
108
109    template<class T2> bool operator==(Uptr<T2> const &p2) const;
110    template<class T2> bool operator!=(Uptr<T2> const &p2) const;
111
112    Uptr(const Uptr &);
113    void operator=(const Uptr&);
114};
115}  // namespace OHOS
116#endif  // OHOS_UPTR_H