annotate foosdk/sdk/pfc/weakRef.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 // PFC weakRef class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // Create weak references to objects that automatically become invalidated upon destruction of the object
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // Note that this is NOT thread safe and meant for single thread usage. If you require thread safety, provide your own means, such as mutexlocking of weakRef::get() and the destruction of your objects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <memory> // std::shared_ptr
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 typedef std::shared_ptr<const bool> weakRefKillSwitch_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 template<typename target_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 class weakRef {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 typedef weakRef<target_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 static self_t _make(target_t * target, weakRefKillSwitch_t ks) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 self_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 ret.m_target = target;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 ret.m_ks = ks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 bool isValid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 return m_ks && !*m_ks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 target_t * get() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 if (!isValid()) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 return m_target;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 target_t * operator() () const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 target_t * m_target = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 weakRefKillSwitch_t m_ks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 template<typename class_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 class weakRefTarget {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 weakRefTarget() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 typedef weakRef<class_t> weakRef_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 weakRef<class_t> weakRef() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 PFC_ASSERT(!*m_ks);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 class_t * ptr = static_cast<class_t*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 return weakRef_t::_make(ptr, m_ks);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 // Optional: explicitly invalidates all weak references to this object. Called implicitly by the destructor, but you can do it yourself earlier.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void weakRefShutdown() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 *m_ks = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 ~weakRefTarget() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 weakRefShutdown();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 // Optional: obtain a reference to the killswitch if you wish to use it directly
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 weakRefKillSwitch_t weakRefKS() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 return m_ks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 std::shared_ptr<bool> m_ks = std::make_shared<bool>(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 weakRefTarget(const weakRefTarget &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void operator=(const weakRefTarget &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }