52struct _weak:
public std::weak_ptr<T> {
54 using super = std::weak_ptr<T>;
57 using super::weak_ptr;
59 _weak(
const _weak<T>& v)
noexcept: std::weak_ptr<T>(v) {}
60 _weak(_weak<T>&& v)
noexcept: std::weak_ptr<T>(std::move(v)) {}
61 _weak(
const std::weak_ptr<T>& v): std::weak_ptr<T>(v) {}
62 _weak(std::weak_ptr<T>&& v)
noexcept: std::weak_ptr<T>(std::move(v)) {}
64 _<T> lock()
const noexcept {
65 return static_cast<_<T>>(super::lock());
68 _weak& operator=(
const std::weak_ptr<T>& v)
noexcept {
69 super::weak_ptr::operator=(v);
73 _weak& operator=(std::weak_ptr<T>&& v)
noexcept {
74 super::weak_ptr::operator=(std::move(v));
78 _weak& operator=(
const _weak<T>& v)
noexcept {
79 super::weak_ptr::operator=(v);
83 _weak& operator=(_weak<T>&& v)
noexcept {
84 super::weak_ptr::operator=(std::move(v));
88 _weak& operator=(
const std::shared_ptr<T>& v)
noexcept {
89 super::weak_ptr::operator=(v);
93 _weak& operator=(std::shared_ptr<T>&& v)
noexcept {
94 super::weak_ptr::operator=(std::move(v));
98 _weak& operator=(
const _<T>& v)
noexcept {
99 super::weak_ptr::operator=(v);
103 _weak& operator=(
_<T>&& v)
noexcept {
104 super::weak_ptr::operator=(std::move(v));
214class _ :
public std::shared_ptr<T>
218 using super = std::shared_ptr<T>;
220 _(T* raw, std::nullopt_t): std::shared_ptr<T>(raw) {
224#ifdef AUI_SHARED_PTR_FIND_INSTANCES
225 friend API_AUI_CORE
void aui::impl::shared_ptr::printAllInstancesOf(
void* ptrToSharedPtr)
noexcept;
226 struct InstanceDescriber;
230 struct InstanceDescriber {
235 InstanceDescriber(_<T>* self): stacktrace(_<T>::makeStacktrace()), self(self), pointingTo(self->get()) {
236 if (pointingTo ==
nullptr)
return;
237 std::unique_lock lock(aui::impl::shared_ptr::instances().sync);
238 aui::impl::shared_ptr::instances().map[pointingTo].insert(self);
242 InstanceDescriber(
const InstanceDescriber&) =
delete;
243 InstanceDescriber(InstanceDescriber&&) =
delete;
245 ~InstanceDescriber() {
246 if (pointingTo ==
nullptr)
return;
247 auto& inst = aui::impl::shared_ptr::instances();
248 std::unique_lock lock(inst.sync);
249 if (
auto mapIt = inst.map.find(pointingTo); mapIt != inst.map.end()) {
250 auto setIt = mapIt->second.find(self);
252 mapIt->second.erase(setIt);
253 if (mapIt->second.empty()) {
259 } mInstanceDescriber =
this;
267#ifdef AUI_SHARED_PTR_FIND_INSTANCES
268 void printAllInstances() {
269 aui::impl::shared_ptr::printAllInstancesOf(
this);
271 void printAllInstances()
const {
272 const_cast<_<T>&
>(*this).printAllInstances();
276 using std::shared_ptr<T>::shared_ptr;
278 _(
const std::shared_ptr<T>& v): std::shared_ptr<T>(v) {}
279 _(std::shared_ptr<T>&& v)
noexcept: std::shared_ptr<T>(std::move(v)) {}
280 _(
const _& v): std::shared_ptr<T>(v) {}
281 _(_&& v)
noexcept: std::shared_ptr<T>(std::move(v)) {}
282 _(
const std::weak_ptr<T>& v): std::shared_ptr<T>(v) {}
283 _(
const _weak<T>& v): std::shared_ptr<T>(v) {}
285 _& operator=(
const _& rhs)
noexcept {
286 std::shared_ptr<T>::operator=(rhs);
290 _& operator=(_&& rhs)
noexcept {
291 std::shared_ptr<T>::operator=(std::forward<_>(rhs));
310 template<
typename SignalField,
typename Object,
typename Function>
311 inline _<T>& connect(SignalField signalField, Object
object, Function&& function);
313 template<
typename SignalField,
typename Function>
314 inline _<T>& connect(SignalField signalField, Function&& function);
317 template <
typename Functor>
318 const _<T>& operator^(Functor&& functor)
const {
330 std::add_lvalue_reference_t<T>
value() const noexcept {
332 AUI_ASSERTX(super::get() !=
nullptr,
"an attempt to dereference a null pointer");
334 return *super::get();
344 std::add_lvalue_reference_t<T>
operator*() const noexcept {
360 auto begin() const requires requires(T& t) { t.begin(); } {
361 return super::operator->()->begin();
363 auto end() const requires requires(T& t) {
t.end(); } {
364 return super::operator->()->end();
366 auto begin()
requires requires(T&
t) {
t.begin(); } {
367 return super::operator->()->begin();
369 auto end()
requires requires(T&
t) {
t.end(); } {
370 return super::operator->()->end();
375 template<
typename Arg>
376 requires requires (T&& l, Arg&& r) { std::forward<T>(l) << std::forward<Arg>(r); }
377 const _<T>& operator<<(Arg&& value)
const {
378 (*super::get()) << std::forward<Arg>(value);
382 template<
typename Arg>
383 _<T>& operator<<(Arg&& value) {
384 (*super::get()) << std::forward<Arg>(value);
388 template<
typename... Arg>
389 auto operator()(Arg&&... value)
const requires std::is_invocable_v<T, Arg...> {
390 return (*super::get())(std::forward<Arg>(value)...);
393 template<
typename Arg>
394 requires requires (T&& l, Arg&& r) { std::forward<T>(l) + std::forward<Arg>(r); }
395 const _<T>& operator+(Arg&& value)
const {
396 (*super::get()) + std::forward<Arg>(value);
400 template<
typename Arg>
401 requires requires (T&& l, Arg&& r) { std::forward<T>(l) & std::forward<Arg>(r); }
402 const _<T>& operator&(Arg&& value)
const {
403 (*super::get()) & std::forward<Arg>(value);
407 template<
typename Arg>
408 requires requires (T&& l, Arg&& r) { std::forward<T>(l) | std::forward<Arg>(r); }
409 const _<T>& operator|(Arg&& value)
const {
410 (*super::get()) | std::forward<Arg>(value);
414 template<
typename Arg>
415 _<T>& operator+(Arg&& value) {
416 (*super::get()) + std::forward<Arg>(value);
420 template<
typename Arg>
421 const _<T>& operator*(Arg&& value) {
422 (*super::get()) * std::forward<Arg>(value);
426 template<
typename Arg>
427 requires requires (T&& l, Arg&& r) { std::forward<T>(l) - std::forward<Arg>(r); }
428 const _<T>& operator-(Arg&& value)
const {
429 (*super::get()) - std::forward<Arg>(value);
433 template<
typename Arg>
434 _<T>& operator-(Arg&& value) {
435 (*super::get()) - std::forward<Arg>(value);
439 template<
typename Arg>
440 requires requires (T&& l, Arg&& r) { std::forward<T>(l) >> std::forward<Arg>(r); }
442 (*super::get()) >> std::forward<Arg>(value);
446 template<
typename...Args>
447 _<T>& operator()(
const Args&... value) {
448 (*super::get())(value...);
451 template<
typename...Args>
452 auto operator()(Args&&... value) {
453 return (*super::get())(std::forward<Args>(value)...);