1#ifndef IPPL_BUFFER_HANDLER_HPP
2#define IPPL_BUFFER_HANDLER_HPP
6 template <
typename MemorySpace>
7 DefaultBufferHandler<MemorySpace>::~DefaultBufferHandler() {}
9 template <
typename MemorySpace>
10 typename DefaultBufferHandler<MemorySpace>::buffer_type
12 size_type requiredSize =
static_cast<size_type
>(size * overallocation);
14 auto freeBuffer = findFreeBuffer(requiredSize);
15 if (freeBuffer !=
nullptr) {
16 return getFreeBuffer(freeBuffer);
19 if (!free_buffers.empty()) {
20 return reallocateLargestFreeBuffer(requiredSize);
23 return allocateNewBuffer(requiredSize);
26 template <
typename MemorySpace>
28 if (isBufferUsed(buffer)) {
29 releaseUsedBuffer(buffer);
33 template <
typename MemorySpace>
35 free_buffers.insert(used_buffers.begin(), used_buffers.end());
38 freeSize_m += usedSize_m;
42 template <
typename MemorySpace>
51 template <
typename MemorySpace>
52 typename DefaultBufferHandler<MemorySpace>::size_type
57 template <
typename MemorySpace>
58 typename DefaultBufferHandler<MemorySpace>::size_type
63 template <
typename MemorySpace>
65 const buffer_type& rhs) {
66 if (lhs->getBufferSize() != rhs->getBufferSize()) {
67 return lhs->getBufferSize() < rhs->getBufferSize();
74 template <
typename MemorySpace>
75 bool DefaultBufferHandler<MemorySpace>::isBufferUsed(buffer_type buffer)
const {
76 return used_buffers.find(buffer) != used_buffers.end();
79 template <
typename MemorySpace>
80 void DefaultBufferHandler<MemorySpace>::releaseUsedBuffer(buffer_type buffer) {
81 auto it = used_buffers.find(buffer);
83 usedSize_m -= buffer->getBufferSize();
84 freeSize_m += buffer->getBufferSize();
86 used_buffers.erase(it);
87 free_buffers.insert(buffer);
90 template <
typename MemorySpace>
91 typename DefaultBufferHandler<MemorySpace>::buffer_type
92 DefaultBufferHandler<MemorySpace>::findFreeBuffer(size_type requiredSize) {
93 auto it = findSmallestSufficientBuffer(requiredSize);
94 if (it != free_buffers.end()) {
100 template <
typename MemorySpace>
101 typename DefaultBufferHandler<MemorySpace>::buffer_set_type::iterator
102 DefaultBufferHandler<MemorySpace>::findSmallestSufficientBuffer(size_type requiredSize) {
103 return std::find_if(free_buffers.begin(), free_buffers.end(),
104 [requiredSize](
const buffer_type& buffer) {
105 return buffer->getBufferSize() >= requiredSize;
109 template <
typename MemorySpace>
110 typename DefaultBufferHandler<MemorySpace>::buffer_type
111 DefaultBufferHandler<MemorySpace>::getFreeBuffer(buffer_type buffer) {
112 freeSize_m -= buffer->getBufferSize();
113 usedSize_m += buffer->getBufferSize();
115 free_buffers.erase(buffer);
116 used_buffers.insert(buffer);
120 template <
typename MemorySpace>
121 typename DefaultBufferHandler<MemorySpace>::buffer_type
122 DefaultBufferHandler<MemorySpace>::reallocateLargestFreeBuffer(size_type requiredSize) {
123 auto largest_it = std::prev(free_buffers.end());
124 buffer_type buffer = *largest_it;
126 freeSize_m -= buffer->getBufferSize();
127 usedSize_m += requiredSize;
129 free_buffers.erase(buffer);
130 buffer->reallocBuffer(requiredSize);
132 used_buffers.insert(buffer);
136 template <
typename MemorySpace>
137 typename DefaultBufferHandler<MemorySpace>::buffer_type
138 DefaultBufferHandler<MemorySpace>::allocateNewBuffer(size_type requiredSize) {
139 buffer_type newBuffer = std::make_shared<archive_type>(requiredSize);
141 usedSize_m += newBuffer->getBufferSize();
142 used_buffers.insert(newBuffer);
Concrete implementation of BufferHandler for managing memory buffers.
Definition BufferHandler.h:95
size_type getUsedSize() const override
Gets the size of all buffers in use.
Definition BufferHandler.hpp:53
void deleteAllBuffers() override
Deletes all buffers.
Definition BufferHandler.hpp:43
void freeBuffer(buffer_type buffer) override
Frees a specified buffer.
Definition BufferHandler.hpp:27
buffer_type getBuffer(size_type size, double overallocation) override
Acquires a buffer of at least the specified size.
Definition BufferHandler.hpp:11
void freeAllBuffers() override
Frees all currently used buffers.
Definition BufferHandler.hpp:34
size_type getFreeSize() const override
Gets the size of all free buffers.
Definition BufferHandler.hpp:59