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));
178class _ :
public std::shared_ptr<T>
182 using super = std::shared_ptr<T>;
184 _(T* raw, std::nullopt_t): std::shared_ptr<T>(raw) {
188#ifdef AUI_SHARED_PTR_FIND_INSTANCES
189 friend API_AUI_CORE
void aui::impl::shared_ptr::printAllInstancesOf(
void* ptrToSharedPtr)
noexcept;
190 struct InstanceDescriber;
194 struct InstanceDescriber {
199 InstanceDescriber(_<T>* self): stacktrace(_<T>::makeStacktrace()), self(self), pointingTo(self->get()) {
200 if (pointingTo ==
nullptr)
return;
201 std::unique_lock lock(aui::impl::shared_ptr::instances().sync);
202 aui::impl::shared_ptr::instances().map[pointingTo].insert(self);
206 InstanceDescriber(
const InstanceDescriber&) =
delete;
207 InstanceDescriber(InstanceDescriber&&) =
delete;
209 ~InstanceDescriber() {
210 if (pointingTo ==
nullptr)
return;
211 auto& inst = aui::impl::shared_ptr::instances();
212 std::unique_lock lock(inst.sync);
213 if (
auto mapIt = inst.map.find(pointingTo); mapIt != inst.map.end()) {
214 auto setIt = mapIt->second.find(self);
216 mapIt->second.erase(setIt);
217 if (mapIt->second.empty()) {
223 } mInstanceDescriber =
this;
231#ifdef AUI_SHARED_PTR_FIND_INSTANCES
232 void printAllInstances() {
233 aui::impl::shared_ptr::printAllInstancesOf(
this);
235 void printAllInstances()
const {
236 const_cast<_<T>&
>(*this).printAllInstances();
240 using std::shared_ptr<T>::shared_ptr;
242 _(
const std::shared_ptr<T>& v): std::shared_ptr<T>(v) {}
243 _(std::shared_ptr<T>&& v)
noexcept: std::shared_ptr<T>(std::move(v)) {}
244 _(
const _& v): std::shared_ptr<T>(v) {}
245 _(_&& v)
noexcept: std::shared_ptr<T>(std::move(v)) {}
246 _(
const std::weak_ptr<T>& v): std::shared_ptr<T>(v) {}
247 _(
const _weak<T>& v): std::shared_ptr<T>(v) {}
249 _& operator=(
const _& rhs)
noexcept {
250 std::shared_ptr<T>::operator=(rhs);
254 _& operator=(_&& rhs)
noexcept {
255 std::shared_ptr<T>::operator=(std::forward<_>(rhs));
274 template<
typename SignalField,
typename Object,
typename Function>
275 inline _<T>& connect(SignalField signalField, Object
object, Function&& function);
277 template<
typename SignalField,
typename Function>
278 inline _<T>& connect(SignalField signalField, Function&& function);
281 template <
typename Functor>
282 const _<T>& operator^(Functor&& functor)
const {
294 std::add_lvalue_reference_t<T>
value() const noexcept {
296 AUI_ASSERTX(super::get() !=
nullptr,
"an attempt to dereference a null pointer");
298 return *super::get();
308 std::add_lvalue_reference_t<T>
operator*() const noexcept {
324 auto begin() const requires requires(T& t) { t.begin(); } {
325 return super::operator->()->begin();
327 auto end() const requires requires(T& t) {
t.end(); } {
328 return super::operator->()->end();
330 auto begin()
requires requires(T&
t) {
t.begin(); } {
331 return super::operator->()->begin();
333 auto end()
requires requires(T&
t) {
t.end(); } {
334 return super::operator->()->end();
339 template<
typename Arg>
340 requires requires (T&& l, Arg&& r) { std::forward<T>(l) << std::forward<Arg>(r); }
341 const _<T>& operator<<(Arg&& value)
const {
342 (*super::get()) << std::forward<Arg>(value);
346 template<
typename Arg>
347 _<T>& operator<<(Arg&& value) {
348 (*super::get()) << std::forward<Arg>(value);
352 template<
typename... Arg>
353 auto operator()(Arg&&... value)
const requires std::is_invocable_v<T, Arg...> {
354 return (*super::get())(std::forward<Arg>(value)...);
357 template<
typename Arg>
358 requires requires (T&& l, Arg&& r) { std::forward<T>(l) + std::forward<Arg>(r); }
359 const _<T>& operator+(Arg&& value)
const {
360 (*super::get()) + std::forward<Arg>(value);
364 template<
typename Arg>
365 requires requires (T&& l, Arg&& r) { std::forward<T>(l) & std::forward<Arg>(r); }
366 const _<T>& operator&(Arg&& value)
const {
367 (*super::get()) & std::forward<Arg>(value);
371 template<
typename Arg>
372 requires requires (T&& l, Arg&& r) { std::forward<T>(l) | std::forward<Arg>(r); }
373 const _<T>& operator|(Arg&& value)
const {
374 (*super::get()) | std::forward<Arg>(value);
378 template<
typename Arg>
379 _<T>& operator+(Arg&& value) {
380 (*super::get()) + std::forward<Arg>(value);
384 template<
typename Arg>
385 const _<T>& operator*(Arg&& value) {
386 (*super::get()) * std::forward<Arg>(value);
390 template<
typename Arg>
391 requires requires (T&& l, Arg&& r) { std::forward<T>(l) - std::forward<Arg>(r); }
392 const _<T>& operator-(Arg&& value)
const {
393 (*super::get()) - std::forward<Arg>(value);
397 template<
typename Arg>
398 _<T>& operator-(Arg&& value) {
399 (*super::get()) - std::forward<Arg>(value);
403 template<
typename Arg>
404 requires requires (T&& l, Arg&& r) { std::forward<T>(l) >> std::forward<Arg>(r); }
405 const _<T>& operator>>(Arg&& value)
const {
406 (*super::get()) >> std::forward<Arg>(value);
410 template<
typename...Args>
411 _<T>& operator()(
const Args&... value) {
412 (*super::get())(value...);
415 template<
typename...Args>
416 auto operator()(Args&&... value) {
417 return (*super::get())(std::forward<Args>(value)...);