prime/include/rstl/single_ptr.hpp

49 lines
1.1 KiB
C++
Raw Normal View History

#ifndef _RSTL_SINGLE_PTR
#define _RSTL_SINGLE_PTR
#include "types.h"
namespace rstl {
template < typename T >
class single_ptr {
mutable T* x0_ptr;
public:
single_ptr() : x0_ptr(nullptr) {}
single_ptr(T* ptr) : x0_ptr(ptr) {}
~single_ptr() { delete x0_ptr; }
2022-08-15 04:51:06 +00:00
T* get() const { return x0_ptr; }
// const T* get() const { return x0_ptr; }
T* operator->() { return x0_ptr; }
const T* operator->() const { return x0_ptr; }
single_ptr(const single_ptr& other) : x0_ptr(other.x0_ptr) { other.x0_ptr = nullptr; }
single_ptr& operator=(T* ptr) {
delete x0_ptr;
x0_ptr = ptr;
return *this;
}
2022-08-16 02:14:28 +00:00
bool null() const { return x0_ptr == nullptr; }
2022-08-13 01:26:00 +00:00
T& operator*() { return *x0_ptr; }
const T& operator*() const { return *x0_ptr; }
T* release() {
T* ptr = x0_ptr;
x0_ptr = nullptr;
return ptr;
}
2023-07-31 13:35:09 +00:00
// This is certainly not real, but handy to force not-inline
single_ptr& Set(T* ptr);
};
2022-08-13 01:26:00 +00:00
2023-07-31 13:35:09 +00:00
template < typename T >
single_ptr< T >& single_ptr< T >::Set(T* ptr) {
return *this = ptr;
}
typedef single_ptr< void > unk_singleptr;
2022-08-13 01:26:00 +00:00
CHECK_SIZEOF(unk_singleptr, 0x4);
} // namespace rstl
#endif // _RSTL_SINGLE_PTR