1#ifndef IPPL_BUFFER_HANDLER_HPP
2#define IPPL_BUFFER_HANDLER_HPP
6 template <
typename MemorySpace>
9 template <
typename MemorySpace>
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>
57 template <
typename MemorySpace>
63 template <
typename MemorySpace>
66 if (lhs->getBufferSize() != rhs->getBufferSize()) {
67 return lhs->getBufferSize() < rhs->getBufferSize();
74 template <
typename MemorySpace>
76 return used_buffers.find(buffer) != used_buffers.end();
79 template <
typename MemorySpace>
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>
93 auto it = findSmallestSufficientBuffer(requiredSize);
94 if (it != free_buffers.end()) {
100 template <
typename MemorySpace>
103 return std::find_if(free_buffers.begin(), free_buffers.end(),
105 return buffer->getBufferSize() >= requiredSize;
109 template <
typename MemorySpace>
112 freeSize_m -= buffer->getBufferSize();
113 usedSize_m += buffer->getBufferSize();
115 free_buffers.erase(buffer);
116 used_buffers.insert(buffer);
120 template <
typename MemorySpace>
123 auto largest_it = std::prev(free_buffers.end());
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>
139 buffer_type newBuffer = std::make_shared<archive_type>(requiredSize);
141 usedSize_m += newBuffer->getBufferSize();
142 used_buffers.insert(newBuffer);
Implementations for FFT constructor/destructor and transforms.
ippl::detail::size_type size_type
std::shared_ptr< archive_type > buffer_type
Concrete implementation of BufferHandler for managing memory buffers.
void releaseUsedBuffer(buffer_type buffer)
buffer_type reallocateLargestFreeBuffer(size_type requiredSize)
buffer_type getFreeBuffer(buffer_type buffer)
size_type getUsedSize() const override
Frees a specified buffer.
void deleteAllBuffers() override
Frees a specified buffer.
~DefaultBufferHandler() override
bool isBufferUsed(buffer_type buffer) const
static bool bufferSizeComparator(const buffer_type &lhs, const buffer_type &rhs)
buffer_type findFreeBuffer(size_type requiredSize)
void freeBuffer(buffer_type buffer) override
Frees a specified buffer.
buffer_type getBuffer(size_type size, double overallocation) override
Acquires a buffer of at least the specified size.
buffer_type allocateNewBuffer(size_type requiredSize)
void freeAllBuffers() override
Frees a specified buffer.
buffer_set_type::iterator findSmallestSufficientBuffer(size_type requiredSize)
size_type getFreeSize() const override
Frees a specified buffer.