open62541pp 0.20.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
7
8namespace opcua::detail {
9
10template <typename T>
11class UniqueOrRawPtr {
12public:
13 constexpr UniqueOrRawPtr() = default;
14
15 explicit constexpr UniqueOrRawPtr(std::unique_ptr<T>&& ptr) noexcept
16 : uniquePtr_{std::move(ptr)},
17 rawPtr_{uniquePtr_.get()} {}
18
19 explicit constexpr UniqueOrRawPtr(T* ptr) noexcept
20 : uniquePtr_{nullptr},
21 rawPtr_{ptr} {}
22
23 constexpr UniqueOrRawPtr& operator=(std::unique_ptr<T>&& ptr) noexcept {
24 uniquePtr_ = std::move(ptr);
25 rawPtr_ = uniquePtr_.get();
26 return *this;
27 }
28
29 constexpr UniqueOrRawPtr& operator=(T* ptr) noexcept {
30 uniquePtr_ = nullptr;
31 rawPtr_ = ptr;
32 return *this;
33 }
34
35 constexpr T& operator*() noexcept {
36 return *get();
37 }
38
39 constexpr const T& operator*() const noexcept {
40 return *get();
41 }
42
43 constexpr T* operator->() noexcept {
44 return get();
45 }
46
47 constexpr const T* operator->() const noexcept {
48 return get();
49 }
50
51 constexpr T* get() noexcept { // NOLINT(*exception-escape)
52 return rawPtr_;
53 }
54
55 constexpr const T* get() const noexcept {
56 return rawPtr_;
57 }
58
59 constexpr bool operator==(T* ptr) const noexcept {
60 return get() == ptr;
61 }
62
63 constexpr bool operator!=(T* ptr) const noexcept {
64 return get() != ptr;
65 }
66
67private:
68 std::unique_ptr<T> uniquePtr_;
69 T* rawPtr_{nullptr};
70};
71
72} // namespace opcua::detail