-
Notifications
You must be signed in to change notification settings - Fork 0
/
pointer.hpp
83 lines (63 loc) · 1.62 KB
/
pointer.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <ostream>
#ifndef POINTER_HPP
# define POINTER_HPP
namespace mini {
template<typename T>
class uniqueptr {
public:
explicit uniqueptr(T *ptr);
uniqueptr(const uniqueptr& ptr);
~uniqueptr();
uniqueptr<T>& operator=(T& other);
T* getPtr(void) const;
T& operator*(void);
T* operator->(void);
operator T*(void) const;
private:
uniqueptr();
uniqueptr(uniqueptr<T>& other);
uniqueptr<T>& operator=(uniqueptr& other);
T* const _ptr;
};
// ============================[ CONTRUCTOR ]============================ //
template<typename T>
uniqueptr<T>::uniqueptr(T *ptr) : _ptr(ptr) {}
template<typename T>
uniqueptr<T>& uniqueptr<T>::operator=(T& other) {
~uniqueptr();
this->_ptr = other;
}
template<typename T>
uniqueptr<T>::~uniqueptr(void) {
delete (this->_ptr);
}
// =============================[ ACCESSORS ]============================ //
template<typename T>
T* uniqueptr<T>::getPtr(void) const {
return (this->_ptr);
}
// =============================[ OPERATORS ]============================ //
template<typename T>
T& uniqueptr<T>::operator*(void) {
return (*this->_ptr);
}
template<typename T>
T* uniqueptr<T>::operator->(void) {
return (this->_ptr);
}
template<typename T>
uniqueptr<T>::operator T*(void) const {
return (this->_ptr);
}
template<typename T>
std::ostream& operator<<(std::ostream& os, uniqueptr<T>& uniquePtr) {
os << std::hex << uniquePtr.getPtr();
return (os);
}
// =============================[ FUNCTIONS ]============================ //
template<typename T>
uniqueptr<T> make_unique() {
return (uniqueptr<T>(new T()));
}
}
#endif