Distributed Ranges
Loading...
Searching...
No Matches
device_ptr.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <type_traits>
8
9#include <sycl/sycl.hpp>
10
11#include <dr/sp/device_ref.hpp>
12
13namespace dr::sp {
14
15template <typename T>
16 requires(std::is_trivially_copyable_v<T> || std::is_void_v<T>)
18public:
19 using value_type = T;
20 using difference_type = std::ptrdiff_t;
21 using pointer = device_ptr<T>;
24 using iterator_category = std::random_access_iterator_tag;
26
27 device_ptr(T *pointer) noexcept : pointer_(pointer) {}
28 device_ptr() noexcept = default;
29 ~device_ptr() noexcept = default;
30 device_ptr(const device_ptr &) noexcept = default;
31 device_ptr &operator=(const device_ptr &) noexcept = default;
32
33 device_ptr(std::nullptr_t) noexcept : pointer_(nullptr) {}
34
35 device_ptr &operator=(std::nullptr_t) noexcept {
36 pointer_ = nullptr;
37 return *this;
38 }
39
40 operator device_ptr<void>() const noexcept
41 requires(!std::is_void_v<T>)
42 {
43 return device_ptr<void>(reinterpret_cast<void *>(pointer_));
44 }
45
46 operator device_ptr<const void>() const noexcept
47 requires(!std::is_void_v<T>)
48 {
49 return device_ptr<const void>(reinterpret_cast<const void *>(pointer_));
50 }
51
52 operator const_pointer() const noexcept
53 requires(!std::is_const_v<T>)
54 {
55 return const_pointer(pointer_);
56 }
57
58 bool operator==(std::nullptr_t) const noexcept { return pointer_ == nullptr; }
59 bool operator!=(std::nullptr_t) const noexcept { return pointer_ != nullptr; }
60
61 bool operator==(const device_ptr &) const noexcept = default;
62 bool operator!=(const device_ptr &) const noexcept = default;
63
64 pointer operator+(difference_type offset) const noexcept {
65 return pointer(pointer_ + offset);
66 }
67 pointer operator-(difference_type offset) const noexcept {
68 return pointer(pointer_ - offset);
69 }
70
71 difference_type operator-(const_pointer other) const noexcept
72 requires(!std::is_const_v<T>)
73 {
74 return pointer_ - other.pointer_;
75 }
76 difference_type operator-(pointer other) const noexcept {
77 return pointer_ - other.pointer_;
78 }
79
80 bool operator<(const_pointer other) const noexcept {
81 return pointer_ < other.pointer_;
82 }
83 bool operator>(const_pointer other) const noexcept {
84 return pointer_ > other.pointer_;
85 }
86 bool operator<=(const_pointer other) const noexcept {
87 return pointer_ <= other.pointer_;
88 }
89 bool operator>=(const_pointer other) const noexcept {
90 return pointer_ >= other.pointer_;
91 }
92
93 pointer &operator++() noexcept {
94 ++pointer_;
95 return *this;
96 }
97
98 pointer operator++(int) noexcept {
99 pointer other = *this;
100 ++(*this);
101 return other;
102 }
103
104 pointer &operator--() noexcept {
105 --pointer_;
106 return *this;
107 }
108
109 pointer operator--(int) noexcept {
110 pointer other = *this;
111 --(*this);
112 return other;
113 }
114
115 pointer &operator+=(difference_type offset) noexcept {
116 pointer_ += offset;
117 return *this;
118 }
119
120 pointer &operator-=(difference_type offset) noexcept {
121 pointer_ -= offset;
122 return *this;
123 }
124
125 reference operator*() const noexcept { return reference(pointer_); }
126
127 reference operator[](difference_type offset) const noexcept {
128 return reference(*(*this + offset));
129 }
130
131 T *get_raw_pointer() const noexcept { return pointer_; }
132
133 friend pointer operator+(difference_type n, pointer iter) { return iter + n; }
134
135 T *local() const noexcept { return pointer_; }
136
137 friend const_pointer;
138 friend nonconst_pointer;
139
140private:
141 T *pointer_;
142};
143
144} // namespace dr::sp
Definition: device_ptr.hpp:17
Definition: device_ref.hpp:15