annotate foosdk/sdk/pfc/com_ptr_t.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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 template<typename what> static void _COM_AddRef(what * ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 if (ptr != NULL) ptr->AddRef();
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 template<typename what> static void _COM_Release(what * ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 if (ptr != NULL) ptr->Release();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class com_ptr_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 typedef com_ptr_t<T> t_self;
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 com_ptr_t( nullptr_t ) throw() : m_ptr() {}
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 com_ptr_t() throw() : m_ptr() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 template<typename source> inline com_ptr_t(source * p_ptr) throw() : m_ptr(p_ptr) {_COM_AddRef(m_ptr);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 com_ptr_t(const t_self & p_source) throw() : m_ptr(p_source.m_ptr) {_COM_AddRef(m_ptr);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 template<typename source> inline com_ptr_t(const com_ptr_t<source> & p_source) throw() : m_ptr(p_source.get_ptr()) {_COM_AddRef(m_ptr);}
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 inline ~com_ptr_t() throw() {_COM_Release(m_ptr);}
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 inline void copy(T * p_ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 _COM_Release(m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 m_ptr = p_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 _COM_AddRef(m_ptr);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 template<typename source> inline void copy(const com_ptr_t<source> & p_source) throw() {copy(p_source.get_ptr());}
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 inline void attach(T * p_ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 _COM_Release(m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_ptr = p_ptr;
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 inline const t_self & operator=(const t_self & p_source) throw() {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 inline const t_self & operator=(T* p_source) throw() {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 template<typename source> inline const t_self & operator=(const com_ptr_t<source> & p_source) throw() {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 template<typename source> inline const t_self & operator=(source * p_ptr) throw() {copy(p_ptr); return *this;}
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 inline void release() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 _COM_Release(m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 m_ptr = NULL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 inline T* operator->() const throw() {PFC_ASSERT(m_ptr);return m_ptr;}
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 inline T* get_ptr() const throw() {return m_ptr;}
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 inline T* duplicate_ptr() const throw() //should not be used ! temporary !
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 _COM_AddRef(m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return m_ptr;
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 inline T* detach() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 return replace_null_t(m_ptr);
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 inline bool is_valid() const throw() {return m_ptr != 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 inline bool is_empty() const throw() {return m_ptr == 0;}
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 inline bool operator==(const com_ptr_t<T> & p_item) const throw() {return m_ptr == p_item.m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 inline bool operator!=(const com_ptr_t<T> & p_item) const throw() {return m_ptr != p_item.m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 inline bool operator>(const com_ptr_t<T> & p_item) const throw() {return m_ptr > p_item.m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 inline bool operator<(const com_ptr_t<T> & p_item) const throw() {return m_ptr < p_item.m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 inline static void g_swap(com_ptr_t<T> & item1, com_ptr_t<T> & item2) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 pfc::swap_t(item1.m_ptr,item2.m_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
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 inline T** receive_ptr() throw() {release();return &m_ptr;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 inline void** receive_void_ptr() throw() {return (void**) receive_ptr();}
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 inline t_self & operator<<(t_self & p_source) throw() {attach(p_source.detach());return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 inline t_self & operator>>(t_self & p_dest) throw() {p_dest.attach(detach());return *this;}
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 T* m_ptr;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #endif