LeechCraft 0.6.70-18808-g3467692359
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
trackingpointer.h
Go to the documentation of this file.
1/**********************************************************************
2 * LeechCraft - modular cross-platform feature rich internet client.
3 * Copyright (C) 2006-2014 Georg Rudoy
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7 **********************************************************************/
8
9#pragma once
10
11#include <functional>
12#include <stdexcept>
13#include <QObject>
14#include <QPointer>
15#include "sllconfig.h"
16
17namespace LC::Util
18{
19 struct UTIL_SLL_API BadTrackingPointerAccess : std::runtime_error
20 {
22 };
23
24 [[noreturn, gnu::cold]]
26
27 template<typename T, auto QObjectGetter = &T::GetQObject>
29 {
30 T *Ptr_ = nullptr;
31 QPointer<const QObject> Guard_;
32 public:
33 TrackingPointer () = default;
34
35 explicit (false) TrackingPointer (T *ptr)
36 : Ptr_ { ptr }
37 , Guard_ { ptr ? std::invoke (QObjectGetter, ptr) : nullptr }
38 {
39 }
40
41 TrackingPointer (const TrackingPointer&) = default;
43 TrackingPointer& operator= (const TrackingPointer&) = default;
44 TrackingPointer& operator= (TrackingPointer&&) = default;
45 ~TrackingPointer () = default;
46
47 bool operator== (const TrackingPointer& other) const
48 {
49 return Ptr_ == other.Ptr_;
50 }
51
52 explicit operator bool () const
53 {
54 return Guard_;
55 }
56
57 T* UnsafeGet () const
58 {
59 return Ptr_;
60 }
61
62 T* operator-> () const
63 {
64 if (!Guard_)
66 return Ptr_;
67 }
68
69 T& operator* () const
70 {
71 if (!Guard_)
73 return *Ptr_;
74 }
75 };
76}
TrackingPointer(TrackingPointer &&)=default
TrackingPointer(const TrackingPointer &)=default
bool operator==(const ModelIterator &left, const ModelIterator &right)
auto operator*(const F &function, const T &functor) -> decltype(Fmap(functor, function))
An operator-style alias for Fmap().
Definition functor.h:154
void ReportBadAccess()
#define UTIL_SLL_API
Definition sllconfig.h:16