Add a line content iterator.

This commit is contained in:
2026-07-28 18:01:48 +01:00
parent ed020792f6
commit 9c84118e63
9 changed files with 179 additions and 9 deletions
+5
View File
@@ -27,7 +27,12 @@ struct AppendBuffer : Buffer {
const char *read(uint32_t pos, uint32_t *out_len);
uint32_t count_lines(uint32_t pos, uint32_t length);
uint32_t next_newline(uint32_t pos);
uint32_t nth_newline(uint32_t pos, uint32_t n);
private:
inline uint32_t newline_value_at(uint32_t flat_index);
inline void new_text_chunk();
inline void new_line_chunk();
+2 -1
View File
@@ -5,6 +5,7 @@
struct Buffer {
virtual const char *read(uint32_t pos, uint32_t *out_len) = 0;
virtual uint32_t count_lines(uint32_t pos, uint32_t length) = 0;
virtual uint32_t next_newline(uint32_t pos) = 0;
virtual uint32_t nth_newline(uint32_t pos, uint32_t n) = 0;
virtual ~Buffer() = default;
};
+2
View File
@@ -27,4 +27,6 @@ struct OriginalBuffer : Buffer {
const char *read(uint32_t pos, uint32_t *out_len);
uint32_t count_lines(uint32_t pos, uint32_t length);
uint32_t next_newline(uint32_t pos);
uint32_t nth_newline(uint32_t pos, uint32_t n);
};
+26
View File
@@ -0,0 +1,26 @@
#pragma once
#include "pch.h"
#include "shard.h"
struct LineIterator {
Shard *root = nullptr;
std::vector<Branch *> stack;
Petal *petal = nullptr;
uint32_t petal_offset = 0;
LineIterator(Shard *r, uint32_t start_line);
~LineIterator();
LineIterator(const LineIterator &) = delete;
LineIterator &operator=(const LineIterator &) = delete;
LineIterator(LineIterator &&) = default;
LineIterator &operator=(LineIterator &&) = default;
void seek_line(uint32_t line_index);
bool next(std::string &line);
private:
void descend(Shard *s);
bool advance_petal();
};
+1
View File
@@ -2,6 +2,7 @@
#include "buffer/append.h"
#include "buffer/original.h"
#include "line_iter.h"
#include "pch.h"
#include "shard.h"