-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathborrowed.h
More file actions
37 lines (27 loc) · 935 Bytes
/
Copy pathborrowed.h
File metadata and controls
37 lines (27 loc) · 935 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma once
#include <cassert>
#include <type_traits>
template <typename T> class Borrowed {
public:
explicit Borrowed(T& ref) noexcept : ptr_(&ref) {}
Borrowed(T&&) = delete;
Borrowed(std::nullptr_t) = delete;
explicit Borrowed(T* ptr) noexcept : ptr_(ptr) {
assert(ptr != nullptr && "Borrowed<T> requires a non-null pointer");
}
Borrowed(const Borrowed&) = default;
Borrowed& operator=(const Borrowed&) = default;
Borrowed(Borrowed&&) = default;
Borrowed& operator=(Borrowed&&) = default;
T& get() const noexcept { return *ptr_; }
T* operator->() const noexcept { return ptr_; }
T& operator*() const noexcept { return *ptr_; }
template <typename U> operator Borrowed<const U>() const noexcept {
return Borrowed<const U>(*ptr_);
}
private:
T* ptr_;
};
template <typename T> Borrowed<T> borrow(T& ref) noexcept {
return Borrowed<T>(ref);
}