annotate foosdk/sdk/pfc/other.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 #include "avltree.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
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 //warning: not multi-thread-safe
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 template<typename t_base>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class instanceTracker : public t_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 typedef instanceTracker<t_base> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 template<typename ... args_t> instanceTracker( args_t && ... args) : t_base(std::forward<args_t>(args) ...) {g_list += this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 instanceTracker(const t_self & p_other) : t_base( (const t_base &)p_other) {g_list += this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 ~instanceTracker() {g_list -= this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 typedef pfc::avltree_t<t_self*> t_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 static const t_list & instanceList() {return g_list;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 template<typename t_callback> static void forEach(t_callback && p_callback) {instanceList().enumerate(p_callback);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 static t_list g_list;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 template<typename t_base>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 typename instanceTracker<t_base>::t_list instanceTracker<t_base>::g_list;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //warning: not multi-thread-safe
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 template<typename TClass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 class instanceTrackerV2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 typedef instanceTrackerV2<TClass> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 instanceTrackerV2(const t_self & p_other) {g_list += static_cast<TClass*>(this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 instanceTrackerV2() {g_list += static_cast<TClass*>(this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 ~instanceTrackerV2() {g_list -= static_cast<TClass*>(this);}
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 typedef pfc::avltree_t<TClass*> t_instanceList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 static const t_instanceList & instanceList() {return g_list;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 template<typename t_callback> static void forEach(t_callback && p_callback) {instanceList().enumerate(p_callback);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 static t_instanceList g_list;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 template<typename TClass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 typename instanceTrackerV2<TClass>::t_instanceList instanceTrackerV2<TClass>::g_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 struct objDestructNotifyData {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 bool m_flag;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 objDestructNotifyData * m_next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 class objDestructNotify {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 objDestructNotify() : m_data() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 ~objDestructNotify() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 set();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void set() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 objDestructNotifyData * w = m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 while(w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 w->m_flag = true; w = w->m_next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
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 objDestructNotifyData * m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 };
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 class objDestructNotifyScope : private objDestructNotifyData {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 objDestructNotifyScope(objDestructNotify &obj) : m_obj(&obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 m_next = m_obj->m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 m_obj->m_data = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 ~objDestructNotifyScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (!m_flag) m_obj->m_data = m_next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 bool get() const {return m_flag;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 PFC_CLASS_NOT_COPYABLE_EX(objDestructNotifyScope)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 objDestructNotify * m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }