10 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
16 explicit Ptr(std::nullptr_t =
nullptr)
noexcept;
17 explicit Ptr(
Object* object_ptr)
noexcept;
19 Ptr(
Ptr const& other)
noexcept;
25 template<
typename Derived>
requires std::is_base_of_v<Object, Derived>
27 template<
typename Derived>
requires std::is_base_of_v<Object, Derived>
30 template<
typename Self>
34 template<
typename Self>
35 auto operator->(
this Self& self)
noexcept {
return self.raw_ptr(); }
37 template<
typename Self>
38 auto operator==(
this Self
const& self, std::nullptr_t)
noexcept ->
bool {
return self.raw_ptr() ==
nullptr; }
50 explicit
Ptr(std::nullptr_t =
nullptr) noexcept;
53 auto operator=(
Ptr const& other) noexcept ->
Ptr&;
58 auto operator=(
Ptr&& other) noexcept ->
Ptr&;
62 template<typename Derived> requires std::is_base_of_v<
Object, Derived>
63 auto operator=(
Ptr<Derived const> const& other) noexcept ->
Ptr&;
83 _ptr->rc_sub(RCPassKey{});
95 : _ptr{ object_ptr->rc_claim(RCPassKey{}) }
101 : _ptr{ other->rc_add(RCPassKey{}) }
108 if (
this != ice::addressof(other))
110 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
112 prev->rc_sub(RCPassKey{});
115 _ptr = other->rc_add(RCPassKey{});
116 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
123 : _ptr{ std::exchange(other._ptr,
nullptr) }
125 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
131 if (
this != ice::addressof(other))
133 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
135 prev->rc_sub(RCPassKey{});
138 _ptr = ice::exchange(other._ptr,
nullptr);
139 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
145 template<
typename Derived>
requires std::is_base_of_v<Object, Derived>
147 : _ptr{ other.raw_ptr()->rc_add(RCPassKey{}) }
149 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
153 template<
typename Derived>
requires std::is_base_of_v<Object, Derived>
156 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
158 prev->rc_sub(RCPassKey{});
161 _ptr = other.raw_ptr()->rc_add(RCPassKey{});
162 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
173 _ptr->rc_sub(RCPassKey{});
177 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
183 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
185 : _ptr{ other._ptr->rc_add(RCPassKey{}) }
189 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
192 if (
this != ice::addressof(other))
194 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
196 prev->rc_sub(RCPassKey{});
199 _ptr = other._ptr->rc_add(RCPassKey{});
200 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
205 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
207 : _ptr{ other->rc_add(RCPassKey{}) }
211 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
214 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
216 prev->rc_sub(RCPassKey{});
219 _ptr = other->rc_add(RCPassKey{});
220 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
224 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
226 : _ptr{ std::exchange(other._ptr,
nullptr) }
228 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
231 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
234 if (
this != ice::addressof(other))
236 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
238 prev->rc_sub(RCPassKey{});
241 _ptr = ice::exchange(other._ptr,
nullptr);
242 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
247 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
249 : _ptr{ std::exchange(other._ptr,
nullptr) }
251 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
254 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
257 if (
this != ice::addressof(other))
259 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
261 prev->rc_sub(RCPassKey{});
264 _ptr = ice::exchange(other._ptr,
nullptr);
265 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
270 template<
typename Object>
requires ice::concepts::IsRefCounted<Object>
271 template<
typename Derived>
requires std::is_base_of_v<Object, Derived>
274 if (
Object* prev = ice::exchange(_ptr,
nullptr); prev !=
nullptr)
276 prev->rc_sub(RCPassKey{});
279 _ptr = other.raw_ptr()->rc_add(RCPassKey{});
280 ICE_ASSERT_CORE(_ptr ==
nullptr || _ptr->rc_unclaimed(RCPassKey{}) ==
false);
#define ICE_ASSERT_CORE(expression)
Definition assert_core.hxx:43
auto raw_ptr() const noexcept -> Object const *
Definition ptr.hxx:66
auto operator->() const noexcept -> Object const *
Definition ptr.hxx:68
auto operator==(std::nullptr_t) const noexcept -> bool
Definition ptr.hxx:70
Ptr(std::nullptr_t=nullptr) noexcept
auto operator==(this Self const &self, std::nullptr_t) noexcept -> bool
Definition ptr.hxx:38
Ptr(std::nullptr_t=nullptr) noexcept
Definition ptr.hxx:88
auto operator=(Ptr const &other) noexcept -> Ptr &
Definition ptr.hxx:106
auto operator->(this Self &self) noexcept
Definition ptr.hxx:35
~Ptr() noexcept
Definition ptr.hxx:79
auto raw_ptr(this Self &self) noexcept -> Object *
Definition ptr.hxx:32
Definition refcounted.hxx:82
Definition refcounted.hxx:28
SPDX-License-Identifier: MIT.
Definition array.hxx:12
@ Object
Definition config_types.hxx:30