47 lines
1.1 KiB
C++
47 lines
1.1 KiB
C++
#pragma once
|
|||
|
|
|
||
|
|
#include <vector>
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <memory>
|
||
|
|
#include <utility>
|
||
|
|
|
||
|
|
namespace pdfengine {
|
||
|
|
|
||
|
|
class LayoutArena {
|
||
|
|
public:
|
||
|
|
explicit LayoutArena(size_t blockSizeBytes = 65536);
|
||
|
|
~LayoutArena();
|
||
|
|
|
||
|
|
// Disable copy
|
||
|
|
LayoutArena(const LayoutArena&) = delete;
|
||
|
|
LayoutArena& operator=(const LayoutArena&) = delete;
|
||
|
|
|
||
|
|
// Enable move
|
||
|
|
LayoutArena(LayoutArena&&) noexcept;
|
||
|
|
LayoutArena& operator=(LayoutArena&&) noexcept;
|
||
|
|
|
||
|
|
template <typename T, typename... Args>
|
||
|
|
T* allocate(Args&&... args) {
|
||
|
|
void* mem = allocateBytes(sizeof(T), alignof(T));
|
||
|
|
return ::new (mem) T(std::forward<Args>(args)...);
|
||
|
|
}
|
||
|
|
|
||
|
|
void* allocateBytes(size_t size, size_t alignment = alignof(std::max_align_t));
|
||
|
|
void clear() noexcept;
|
||
|
|
[[nodiscard]] size_t totalAllocatedBytes() const noexcept;
|
||
|
|
|
||
|
|
private:
|
||
|
|
struct Chunk {
|
||
|
|
std::unique_ptr<uint8_t[]> data;
|
||
|
|
size_t size = 0;
|
||
|
|
size_t used = 0;
|
||
|
|
};
|
||
|
|
|
||
|
|
size_t m_defaultChunkSize = 65536;
|
||
|
|
std::vector<Chunk> m_chunks;
|
||
|
|
size_t m_totalAllocated = 0;
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace pdfengine
|