Moving source map to Function.
This commit is contained in:
@@ -68,7 +68,7 @@ void* Arena::Alloc(size_t size) {
|
||||
|
||||
void Arena::Rewind(size_t size) { active_chunk_->offset -= size; }
|
||||
|
||||
void* Arena::CloneContents() {
|
||||
size_t Arena::CalculateSize() {
|
||||
size_t total_length = 0;
|
||||
Chunk* chunk = head_chunk_;
|
||||
while (chunk) {
|
||||
@@ -78,9 +78,14 @@ void* Arena::CloneContents() {
|
||||
}
|
||||
chunk = chunk->next;
|
||||
}
|
||||
return total_length;
|
||||
}
|
||||
|
||||
void* Arena::CloneContents() {
|
||||
size_t total_length = CalculateSize();
|
||||
void* result = malloc(total_length);
|
||||
uint8_t* p = (uint8_t*)result;
|
||||
chunk = head_chunk_;
|
||||
Chunk* chunk = head_chunk_;
|
||||
while (chunk) {
|
||||
std::memcpy(p, chunk->buffer, chunk->offset);
|
||||
p += chunk->offset;
|
||||
@@ -92,6 +97,19 @@ void* Arena::CloneContents() {
|
||||
return result;
|
||||
}
|
||||
|
||||
void Arena::CloneContents(void* buffer, size_t buffer_length) {
|
||||
uint8_t* p = (uint8_t*)buffer;
|
||||
Chunk* chunk = head_chunk_;
|
||||
while (chunk) {
|
||||
std::memcpy(p, chunk->buffer, chunk->offset);
|
||||
p += chunk->offset;
|
||||
if (chunk == active_chunk_) {
|
||||
break;
|
||||
}
|
||||
chunk = chunk->next;
|
||||
}
|
||||
}
|
||||
|
||||
Arena::Chunk::Chunk(size_t chunk_size)
|
||||
: next(nullptr), capacity(chunk_size), buffer(0), offset(0) {
|
||||
buffer = reinterpret_cast<uint8_t*>(malloc(capacity));
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
namespace xe {
|
||||
|
||||
@@ -31,6 +32,11 @@ class Arena {
|
||||
void Rewind(size_t size);
|
||||
|
||||
void* CloneContents();
|
||||
template <typename T>
|
||||
void CloneContents(std::vector<T>& buffer) {
|
||||
buffer.resize(CalculateSize() / sizeof(T));
|
||||
CloneContents(buffer.data(), buffer.size() * sizeof(T));
|
||||
}
|
||||
|
||||
private:
|
||||
class Chunk {
|
||||
@@ -45,7 +51,9 @@ class Arena {
|
||||
size_t offset;
|
||||
};
|
||||
|
||||
private:
|
||||
size_t CalculateSize();
|
||||
void CloneContents(void* buffer, size_t buffer_length);
|
||||
|
||||
size_t chunk_size_;
|
||||
Chunk* head_chunk_;
|
||||
Chunk* active_chunk_;
|
||||
|
||||
Reference in New Issue
Block a user