annotate foosdk/sdk/pfc/pool.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 "synchro.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <list>
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 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 template<typename obj_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class objPool {
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 objPool() : m_maxCount(pfc_infinite) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 typedef std::shared_ptr<obj_t> objRef_t;
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 objRef_t get() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 insync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 auto i = m_pool.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if ( i == m_pool.end() ) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 auto ret = *i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 m_pool.erase(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 objRef_t make() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 auto obj = get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 if ( ! obj ) obj = std::make_shared<obj_t>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 return obj;
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 void setMaxCount(size_t c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 insync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 m_maxCount = c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void put(objRef_t obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 insync(m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 if ( m_pool.size() < m_maxCount ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 m_pool.push_back(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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 size_t m_maxCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 std::list<objRef_t> m_pool;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 critical_section m_sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }