annotate foosdk/sdk/pfc/rcptr.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 namespace pfc {
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 struct _rcptr_null;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 typedef _rcptr_null* t_rcptr_null;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 static const t_rcptr_null rcptr_null = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 class rc_container_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 long add_ref() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 return ++m_counter;
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 long release() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 long ret = --m_counter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 if (ret == 0) PFC_ASSERT_NO_EXCEPTION( delete this );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 virtual ~rc_container_base() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 refcounter m_counter;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 template<typename t_object>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 class rc_container_t : public rc_container_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 template<typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 rc_container_t(arg_t && ... arg) : m_object(std::forward<arg_t>(arg) ...) {}
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 t_object m_object;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 };
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 template<typename t_object>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class rcptr_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 typedef rcptr_t<t_object> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 typedef rc_container_base t_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 typedef rc_container_t<t_object> t_container_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 rcptr_t(t_rcptr_null) throw() {_clear();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 rcptr_t() throw() {_clear();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 rcptr_t(const t_self & p_source) throw() {__init(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 t_self const & operator=(const t_self & p_source) throw() {__copy(p_source); return *this;}
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 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 rcptr_t(const rcptr_t<t_source> & p_source) throw() {__init(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 const t_self & operator=(const rcptr_t<t_source> & p_source) throw() {__copy(p_source); return *this;}
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 rcptr_t(t_self && p_source) throw() {_move(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 const t_self & operator=(t_self && p_source) throw() {release(); _move(p_source); return *this;}
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 const t_self & operator=(t_rcptr_null) throw() {release(); return *this;}
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 /* template<typename t_object_cast>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 operator rcptr_t<t_object_cast>() const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 rcptr_t<t_object_cast> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if (is_valid()) temp.__set_from_cast(this->m_container,this->m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }*/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
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 template<typename t_other>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 bool operator==(const rcptr_t<t_other> & p_other) const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return m_container == p_other.__container();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
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 template<typename t_other>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 bool operator!=(const rcptr_t<t_other> & p_other) const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return m_container != p_other.__container();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void __set_from_cast(t_container * p_container,t_object * p_ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //addref first because in rare cases this is the same pointer as the one we currently own
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (p_container != NULL) p_container->add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 m_container = p_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 m_ptr = p_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 bool is_valid() const throw() {return m_container != NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 bool is_empty() const throw() {return m_container == NULL;}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 ~rcptr_t() throw() {release();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 void release() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 t_container * temp = m_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 m_ptr = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 m_container = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if (temp != NULL) temp->release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 template<typename t_object_cast>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 rcptr_t<t_object_cast> static_cast_t() const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 rcptr_t<t_object_cast> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (is_valid()) temp.__set_from_cast(this->m_container,static_cast<t_object_cast*>(this->m_ptr));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void new_t() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 on_new(new t_container_impl());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 template<typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 void new_t(arg_t && ... arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 on_new(new t_container_impl(std::forward<arg_t>(arg) ...));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 static t_self g_new_t() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 t_self temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 temp.new_t();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 template<typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 static t_self g_new_t(arg_t && ... arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 t_self temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 temp.new_t(std::forward<arg_t>(arg) ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 t_object & operator*() const throw() {return *this->m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 t_object * operator->() const throw() {return this->m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 t_container * __container() const throw() {return m_container;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 // FOR INTERNAL USE ONLY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 void _clear() throw() {m_container = NULL; m_ptr = NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 void __init(const rcptr_t<t_source> & p_source) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 m_container = p_source.__container();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 m_ptr = &*p_source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 if (m_container != NULL) m_container->add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 void _move(rcptr_t<t_source> & p_source) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 m_container = p_source.__container();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 m_ptr = &*p_source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 p_source._clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 void __copy(const rcptr_t<t_source> & p_source) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 __set_from_cast(p_source.__container(),&*p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 void on_new(t_container_impl * p_container) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 this->release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 p_container->add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 this->m_ptr = &p_container->m_object;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 this->m_container = p_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 t_container * m_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 t_object * m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 template<typename t_object, typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 rcptr_t<t_object> rcnew_t(arg_t && ... arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 rcptr_t<t_object> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 temp.new_t(std::forward<arg_t>(arg) ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 class traits_rcptr : public traits_default {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 enum { realloc_safe = true, constructor_may_fail = false };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 template<typename T> class traits_t<rcptr_t<T> > : public traits_rcptr {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }