open62541pp 0.18.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
ptr.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <utility>
5#include <variant>
6
8
9namespace opcua::detail {
10
11template <typename T>
12class UniqueOrRawPtr {
13public:
14 constexpr UniqueOrRawPtr() = default;
15
16 explicit constexpr UniqueOrRawPtr(std::unique_ptr<T>&& ptr) noexcept
17 : ptr_(std::move(ptr)) {}
18
19 explicit constexpr UniqueOrRawPtr(T* ptr) noexcept
20 : ptr_(ptr) {}
21
22 constexpr UniqueOrRawPtr& operator=(std::unique_ptr<T>&& ptr) noexcept {
23 ptr_ = std::move(ptr);
24 return *this;
25 }
26
27 constexpr UniqueOrRawPtr& operator=(T* ptr) noexcept {
28 ptr_ = ptr;
29 return *this;
30 }
31
32 constexpr T& operator*() noexcept {
33 return *get();
34 }
35
36 constexpr const T& operator*() const noexcept {
37 return *get();
38 }
39
40 constexpr T* operator->() noexcept {
41 return get();
42 }
43
44 constexpr const T* operator->() const noexcept {
45 return get();
46 }
47
48 constexpr T* get() noexcept { // NOLINT(*exception-escape)
49 return std::visit(
50 Overload{
51 [](T* ptr) { return ptr; },
52 [](std::unique_ptr<T>& ptr) { return ptr.get(); },
53 },
54 ptr_
55 );
56 }
57
58 constexpr const T* get() const noexcept {
59 return (const_cast<UniqueOrRawPtr*>(this)->get()); // NOLINT(*const-cast)
60 }
61
62 constexpr bool operator==(T* ptr) const noexcept {
63 return get() == ptr;
64 }
65
66 constexpr bool operator!=(T* ptr) const noexcept {
67 return get() != ptr;
68 }
69
70private:
71 std::variant<T*, std::unique_ptr<T>> ptr_{nullptr};
72};
73
74} // namespace opcua::detail