annotate foosdk/sdk/pfc/autoref.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 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "ptrholder.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 // autoref<> : turn arbitrary ptr that needs to be delete'd into a shared_ptr<> alike
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 template<typename obj_t> class autoref {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 autoref() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 autoref(std::nullptr_t) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 autoref(obj_t * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 attach(source);
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 void attach(obj_t * source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 PFC_ASSERT( source != nullptr );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 m_obj = std::make_shared<holder_t>(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 void reset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_obj.reset();
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 obj_t * operator->() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 return m_obj->get_ptr();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 obj_t * get() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (! m_obj ) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return m_obj->get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
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 operator bool() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return !!m_obj;
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 typedef pfc::ptrholder_t< obj_t > holder_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 std::shared_ptr< holder_t > m_obj;
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 }