Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
view_pool.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <memory>
5#include <type_traits>
6#include <typeindex>
7#include <typeinfo>
8#include <unordered_map>
9#include <utility>
10#include <vector>
11
12#include <pulp/view/view.hpp>
13
14namespace pulp::view {
15
40class ViewPool {
41public:
44 static constexpr std::size_t kDefaultPerClassCap = 32;
45
46 ViewPool() = default;
47 explicit ViewPool(std::size_t per_class_cap) : per_class_cap_(per_class_cap) {}
48
49 ViewPool(const ViewPool&) = delete;
50 ViewPool& operator=(const ViewPool&) = delete;
51
61 template <class T, class Factory>
62 std::unique_ptr<T> acquire(Factory&& make) {
63 static_assert(std::is_base_of_v<View, T>,
64 "ViewPool::acquire<T>: T must derive from pulp::view::View");
65 if (auto recycled = take(std::type_index(typeid(T)))) {
66 recycled->prepare_for_reuse();
67 return std::unique_ptr<T>(static_cast<T*>(recycled.release()));
68 }
69 return std::forward<Factory>(make)();
70 }
71
76 std::unique_ptr<View> acquire(std::type_index key);
77
84 void release(std::unique_ptr<View> view);
85
88 void set_per_class_cap(std::size_t cap) { per_class_cap_ = cap; }
89 std::size_t per_class_cap() const { return per_class_cap_; }
90
92 void clear() { free_lists_.clear(); }
93
95 std::size_t size(std::type_index key) const {
96 auto it = free_lists_.find(key);
97 return it == free_lists_.end() ? 0 : it->second.size();
98 }
99
101 std::size_t total_size() const {
102 std::size_t n = 0;
103 for (const auto& [key, list] : free_lists_) n += list.size();
104 return n;
105 }
106
107private:
110 std::unique_ptr<View> take(std::type_index key);
111
112 std::size_t per_class_cap_ = kDefaultPerClassCap;
113 std::unordered_map<std::type_index, std::vector<std::unique_ptr<View>>> free_lists_;
114};
115
116} // namespace pulp::view
std::size_t total_size() const
Total pooled instances across all classes (introspection / tests).
Definition view_pool.hpp:101
std::unique_ptr< View > acquire(std::type_index key)
Type-erased acquire for callers that do not know the concrete row/cell type at compile time (VirtualL...
ViewPool(const ViewPool &)=delete
static constexpr std::size_t kDefaultPerClassCap
Default per-class free-list cap.
Definition view_pool.hpp:44
void set_per_class_cap(std::size_t cap)
Set the maximum number of pooled instances per class.
Definition view_pool.hpp:88
std::size_t per_class_cap() const
Definition view_pool.hpp:89
ViewPool & operator=(const ViewPool &)=delete
std::size_t size(std::type_index key) const
Number of pooled instances of a given class (introspection / tests).
Definition view_pool.hpp:95
ViewPool(std::size_t per_class_cap)
Definition view_pool.hpp:47
void release(std::unique_ptr< View > view)
Return a view to the pool.
std::unique_ptr< T > acquire(Factory &&make)
Acquire a T.
Definition view_pool.hpp:62
void clear()
Drop every pooled instance across all classes.
Definition view_pool.hpp:92
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
@ n
Definition input_events.hpp:40