You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
973 B
40 lines
973 B
3 weeks ago
|
#pragma once
|
||
|
|
||
|
#include <type_traits>
|
||
|
|
||
|
template <typename T>
|
||
|
struct pointer_wrapper{
|
||
|
static_assert(std::is_object_v<T>, "T must be an object type");
|
||
|
|
||
|
pointer_wrapper() noexcept = default;
|
||
|
explicit pointer_wrapper(T* p) noexcept : ptr(p) {}
|
||
|
explicit pointer_wrapper(T&& x) noexcept
|
||
|
{
|
||
|
T& ref = std::forward<T&&>(x);
|
||
|
ptr = std::addressof(ref);
|
||
|
}
|
||
|
|
||
|
T& get() const noexcept { return *ptr; }
|
||
|
auto operator->() const noexcept { return ptr; }
|
||
|
operator T&() const noexcept { return *ptr; }
|
||
|
|
||
|
T copy() const noexcept { return *ptr; }
|
||
|
|
||
|
auto raw() const noexcept -> T* { return ptr; }
|
||
|
operator bool() const noexcept { return ptr != nullptr; }
|
||
|
|
||
|
private:
|
||
|
T* ptr{nullptr};
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
auto make_pointer_wrapper(T* p) noexcept -> pointer_wrapper<T>
|
||
|
{
|
||
|
return pointer_wrapper<T>(p);
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
auto make_pointer_wrapper(T& x) noexcept -> pointer_wrapper<T>
|
||
|
{
|
||
|
return pointer_wrapper<T>(x);
|
||
|
}
|