Mercurial > foo_out_sdl
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/pfc/other.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,86 @@ +#pragma once + +#include "avltree.h" + +namespace pfc { + + //warning: not multi-thread-safe + template<typename t_base> + class instanceTracker : public t_base { + private: + typedef instanceTracker<t_base> t_self; + public: + template<typename ... args_t> instanceTracker( args_t && ... args) : t_base(std::forward<args_t>(args) ...) {g_list += this; } + + instanceTracker(const t_self & p_other) : t_base( (const t_base &)p_other) {g_list += this;} + ~instanceTracker() {g_list -= this;} + + typedef pfc::avltree_t<t_self*> t_list; + static const t_list & instanceList() {return g_list;} + template<typename t_callback> static void forEach(t_callback && p_callback) {instanceList().enumerate(p_callback);} + private: + static t_list g_list; + }; + + template<typename t_base> + typename instanceTracker<t_base>::t_list instanceTracker<t_base>::g_list; + + + //warning: not multi-thread-safe + template<typename TClass> + class instanceTrackerV2 { + private: + typedef instanceTrackerV2<TClass> t_self; + public: + instanceTrackerV2(const t_self & p_other) {g_list += static_cast<TClass*>(this);} + instanceTrackerV2() {g_list += static_cast<TClass*>(this);} + ~instanceTrackerV2() {g_list -= static_cast<TClass*>(this);} + + typedef pfc::avltree_t<TClass*> t_instanceList; + static const t_instanceList & instanceList() {return g_list;} + template<typename t_callback> static void forEach(t_callback && p_callback) {instanceList().enumerate(p_callback);} + private: + static t_instanceList g_list; + }; + + template<typename TClass> + typename instanceTrackerV2<TClass>::t_instanceList instanceTrackerV2<TClass>::g_list; + + + struct objDestructNotifyData { + bool m_flag; + objDestructNotifyData * m_next; + + }; + class objDestructNotify { + public: + objDestructNotify() : m_data() {} + ~objDestructNotify() { + set(); + } + + void set() { + objDestructNotifyData * w = m_data; + while(w) { + w->m_flag = true; w = w->m_next; + } + } + objDestructNotifyData * m_data; + }; + + class objDestructNotifyScope : private objDestructNotifyData { + public: + objDestructNotifyScope(objDestructNotify &obj) : m_obj(&obj) { + m_next = m_obj->m_data; + m_obj->m_data = this; + } + ~objDestructNotifyScope() { + if (!m_flag) m_obj->m_data = m_next; + } + bool get() const {return m_flag;} + PFC_CLASS_NOT_COPYABLE_EX(objDestructNotifyScope) + private: + objDestructNotify * m_obj; + + }; +}
