Porytiles
Loading...
Searching...
No Matches
view_ptr.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <utility>
5
6namespace porytiles {
7
15template <typename T>
16class view_ptr {
17 public:
18 constexpr view_ptr() noexcept : ptr_(nullptr) {}
19
20 explicit constexpr view_ptr(std::nullptr_t) noexcept : ptr_(nullptr) {}
21
22 explicit view_ptr(T *p) noexcept : ptr_(p) {}
23
24 view_ptr(const view_ptr &other) noexcept = default;
25
26 view_ptr &operator=(const view_ptr &other) noexcept = default;
27
28 view_ptr(view_ptr &&other) noexcept : ptr_(other.release()) {}
29
30 view_ptr &operator=(view_ptr &&other) noexcept {
31 ptr_ = other.release();
32 return *this;
33 }
34
35 T *get() const noexcept {
36 return ptr_;
37 }
38
39 T &operator*() const {
40 // AssertOrPanic(ptr_ != nullptr, "Dereferencing a null view_ptr");
41 return *ptr_;
42 }
43
44 T *operator->() const noexcept {
45 // AssertOrPanic(ptr_ != nullptr, "Accessing member of a null view_ptr");
46 return ptr_;
47 }
48
49 explicit operator bool() const noexcept {
50 return ptr_ != nullptr;
51 }
52
53 T *release() noexcept {
54 return std::exchange(ptr_, nullptr);
55 }
56
57 void reset(T *p = nullptr) noexcept {
58 ptr_ = p;
59 }
60
61 void swap(view_ptr &other) noexcept {
62 std::swap(ptr_, other.ptr_);
63 }
64
65 private:
66 T *ptr_;
67};
68
69// Comparison operators
71template <typename T1, typename T2>
72bool operator==(const view_ptr<T1> &lhs, const view_ptr<T2> &rhs) {
73 return lhs.get() == rhs.get();
74}
75
76template <typename T1, typename T2>
77bool operator!=(const view_ptr<T1> &lhs, const view_ptr<T2> &rhs) {
78 return !(lhs == rhs);
79}
80
81template <typename T>
82bool operator==(const view_ptr<T> &lhs, std::nullptr_t) noexcept {
83 return !lhs;
84}
85
86template <typename T>
87bool operator==(std::nullptr_t, const view_ptr<T> &rhs) noexcept {
88 return !rhs;
89}
90
91template <typename T>
92bool operator!=(const view_ptr<T> &lhs, std::nullptr_t) noexcept {
93 return static_cast<bool>(lhs);
94}
95
96template <typename T>
97bool operator!=(std::nullptr_t, const view_ptr<T> &rhs) noexcept {
98 return static_cast<bool>(rhs);
99}
100
101// Deduction guide (C++17)
102template <typename T>
104
105} // namespace porytiles
A smart pointer that represents a non-owning view of a resource.
Definition view_ptr.hpp:16
T & operator*() const
Definition view_ptr.hpp:39
void reset(T *p=nullptr) noexcept
Definition view_ptr.hpp:57
T * operator->() const noexcept
Definition view_ptr.hpp:44
T * get() const noexcept
Definition view_ptr.hpp:35
constexpr view_ptr() noexcept
Definition view_ptr.hpp:18
view_ptr(view_ptr &&other) noexcept
Definition view_ptr.hpp:28
constexpr view_ptr(std::nullptr_t) noexcept
Definition view_ptr.hpp:20
view_ptr(const view_ptr &other) noexcept=default
view_ptr & operator=(const view_ptr &other) noexcept=default
view_ptr(T *p) noexcept
Definition view_ptr.hpp:22
T * release() noexcept
Definition view_ptr.hpp:53
view_ptr & operator=(view_ptr &&other) noexcept
Definition view_ptr.hpp:30
void swap(view_ptr &other) noexcept
Definition view_ptr.hpp:61
bool operator==(const view_ptr< T1 > &lhs, const view_ptr< T2 > &rhs)
Definition view_ptr.hpp:72
bool operator!=(const view_ptr< T1 > &lhs, const view_ptr< T2 > &rhs)
Definition view_ptr.hpp:77