Cleanup namespace and api.
This commit is contained in:
@@ -8,7 +8,7 @@ struct OriginalBuffer : Buffer {
|
||||
uint64_t len;
|
||||
int fd = -1;
|
||||
|
||||
OriginalBuffer();
|
||||
OriginalBuffer(std::filesystem::path base_dir);
|
||||
~OriginalBuffer();
|
||||
|
||||
void initialize();
|
||||
|
||||
+11
-10
@@ -24,6 +24,17 @@ struct Shard {
|
||||
|
||||
static void retain(Shard *n);
|
||||
static void release(Shard *n);
|
||||
|
||||
static Shard *from_file(std::filesystem::path path, OriginalBuffer *b);
|
||||
static std::vector<Shard *> from_swap(std::filesystem::path path, OriginalBuffer *b);
|
||||
static Shard *new_empty(OriginalBuffer *b);
|
||||
|
||||
static std::pair<Shard *, Shard *> split(Shard *n, uint64_t offset);
|
||||
static Shard *concat(Shard *left, Shard *right);
|
||||
static Shard *merge(Shard *a, Shard *b);
|
||||
static Shard *merge_leaves(Shard *a, Shard *b);
|
||||
static Shard *append_leaf(Shard *root, Shard *leaf);
|
||||
static Shard *build_balanced(Shard **pieces, uint64_t lo, uint64_t hi);
|
||||
};
|
||||
|
||||
struct Branch : Shard {
|
||||
@@ -52,13 +63,3 @@ struct Petal : Shard {
|
||||
: Shard(ShardKind::Petal, length, lines, 1),
|
||||
source(source), pos(pos) {};
|
||||
};
|
||||
|
||||
Shard *create_file_shards(std::string &path, OriginalBuffer *b);
|
||||
Shard *create_swap_shards(std::string &path, OriginalBuffer *b);
|
||||
|
||||
std::pair<Shard *, Shard *> split_shard(Shard *n, uint64_t offset);
|
||||
Shard *concat_shard(Shard *left, Shard *right);
|
||||
Shard *merge(Shard *a, Shard *b);
|
||||
Shard *merge_leaves(Shard *a, Shard *b);
|
||||
Shard *append_leaf(Shard *root, Shard *leaf);
|
||||
Shard *build_balanced(Shard **pieces, uint64_t lo, uint64_t hi);
|
||||
|
||||
+5
-3
@@ -44,8 +44,10 @@ struct Vase {
|
||||
OriginalBuffer *original;
|
||||
AppendBuffer *append;
|
||||
Shard *root;
|
||||
std::filesystem::path path;
|
||||
std::filesystem::path swapdir;
|
||||
|
||||
Vase(std::string path);
|
||||
Vase(std::filesystem::path path, std::filesystem::path swapdir);
|
||||
|
||||
~Vase();
|
||||
|
||||
@@ -82,8 +84,8 @@ struct Vase {
|
||||
void snapshot();
|
||||
void prune_history(uint64_t n);
|
||||
|
||||
bool save(std::string path);
|
||||
bool save_swap(std::string path);
|
||||
bool save();
|
||||
bool save_swap();
|
||||
|
||||
uint64_t offset_of(Point point);
|
||||
Point point_of(uint64_t offset);
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
throw std::runtime_error("Please give filename.");
|
||||
|
||||
Vase vase = Vase(std::string(argv[1]));
|
||||
Vase vase = Vase(argv[1], "/tmp");
|
||||
|
||||
Point p = {500, 1000};
|
||||
vase.insert(&p, 'x');
|
||||
|
||||
@@ -13,6 +13,8 @@ AppendBuffer::~AppendBuffer() {
|
||||
uint64_t AppendBuffer::append(char c) {
|
||||
if (t_offset == APPEND_CHUNK_SIZE) {
|
||||
t_current = (TChunk *)malloc(sizeof(TChunk));
|
||||
if (!t_current)
|
||||
throw std::runtime_error("malloc failed");
|
||||
buf.push_back(t_current);
|
||||
t_offset = 0;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
#include "vase/buffer/original.h"
|
||||
#include "io/file.h"
|
||||
|
||||
OriginalBuffer::OriginalBuffer() {
|
||||
char tmp_path[] = "/tmp/tbuf.XXXXXX";
|
||||
fd = mkstemp(tmp_path);
|
||||
OriginalBuffer::OriginalBuffer(std::filesystem::path base_dir) {
|
||||
if (!std::filesystem::exists(base_dir) || !std::filesystem::is_directory(base_dir))
|
||||
throw std::runtime_error("Swap directory does not exist or is not a directory.");
|
||||
base_dir /= "tbuf.XXXXXX";
|
||||
auto s = base_dir.string();
|
||||
std::vector<char> mutable_path(s.begin(), s.end());
|
||||
mutable_path.push_back('\0');
|
||||
fd = mkstemp(mutable_path.data());
|
||||
if (fd == -1)
|
||||
exit(1);
|
||||
unlink(tmp_path);
|
||||
throw std::runtime_error("mkstemp failed");
|
||||
unlink(mutable_path.data());
|
||||
}
|
||||
|
||||
OriginalBuffer::~OriginalBuffer() {
|
||||
|
||||
+10
-13
@@ -87,7 +87,7 @@ Shard *balance(Shard *node) {
|
||||
return node;
|
||||
}
|
||||
|
||||
Shard *merge(Shard *a, Shard *b) {
|
||||
Shard *Shard::merge(Shard *a, Shard *b) {
|
||||
if (!a)
|
||||
return b ? (Shard::retain(b), b) : nullptr;
|
||||
if (!b)
|
||||
@@ -112,7 +112,7 @@ Shard *merge(Shard *a, Shard *b) {
|
||||
return balance(new Branch(a, b));
|
||||
}
|
||||
|
||||
std::pair<Shard *, Shard *> split_shard(Shard *n, uint64_t offset) {
|
||||
std::pair<Shard *, Shard *> Shard::split(Shard *n, uint64_t offset) {
|
||||
if (!n)
|
||||
return {nullptr, nullptr};
|
||||
if (offset == 0) {
|
||||
@@ -127,12 +127,12 @@ std::pair<Shard *, Shard *> split_shard(Shard *n, uint64_t offset) {
|
||||
if (n->kind == Shard::ShardKind::Branch) {
|
||||
Branch *b = (Branch *)n;
|
||||
if (offset < b->left->length) {
|
||||
auto [a, b2] = split_shard(b->left, offset);
|
||||
auto [a, b2] = split(b->left, offset);
|
||||
Shard *right = merge(b2, b->right);
|
||||
Shard::release(b2);
|
||||
return {a, right};
|
||||
} else {
|
||||
auto [a, b2] = split_shard(b->right, offset - b->left->length);
|
||||
auto [a, b2] = split(b->right, offset - b->left->length);
|
||||
Shard *left = merge(b->left, a);
|
||||
Shard::release(a);
|
||||
return {left, b2};
|
||||
@@ -177,7 +177,7 @@ std::pair<Shard *, Shard *> split_shard(Shard *n, uint64_t offset) {
|
||||
}
|
||||
}
|
||||
|
||||
Shard *merge_leaves(Shard *a, Shard *b) {
|
||||
Shard *Shard::merge_leaves(Shard *a, Shard *b) {
|
||||
if (a->kind != Shard::ShardKind::Petal || b->kind != Shard::ShardKind::Petal)
|
||||
return merge(a, b);
|
||||
Petal *pa = (Petal *)a;
|
||||
@@ -192,7 +192,7 @@ Shard *merge_leaves(Shard *a, Shard *b) {
|
||||
);
|
||||
}
|
||||
|
||||
Shard *append_leaf(Shard *root, Shard *leaf) {
|
||||
Shard *Shard::append_leaf(Shard *root, Shard *leaf) {
|
||||
if (!root)
|
||||
return leaf;
|
||||
if (root->kind == Shard::ShardKind::Petal && root->length < PETAL_SIZE_MAX)
|
||||
@@ -204,11 +204,11 @@ Shard *append_leaf(Shard *root, Shard *leaf) {
|
||||
return out;
|
||||
}
|
||||
|
||||
Shard *concat_shard(Shard *left, Shard *right) {
|
||||
Shard *Shard::concat(Shard *left, Shard *right) {
|
||||
return merge(left, right);
|
||||
}
|
||||
|
||||
Shard *build_balanced(Shard **pieces, uint64_t lo, uint64_t hi) {
|
||||
Shard *Shard::build_balanced(Shard **pieces, uint64_t lo, uint64_t hi) {
|
||||
if (hi - lo == 1)
|
||||
return pieces[lo];
|
||||
size_t mid = lo + (hi - lo) / 2;
|
||||
@@ -220,18 +220,15 @@ Shard *build_balanced(Shard **pieces, uint64_t lo, uint64_t hi) {
|
||||
return node;
|
||||
}
|
||||
|
||||
Shard *create_file_shards(std::string &path, OriginalBuffer *o) {
|
||||
Shard *Shard::from_file(std::filesystem::path path, OriginalBuffer *o) {
|
||||
int dest_fd = o->fd;
|
||||
if (dest_fd == -1)
|
||||
return nullptr;
|
||||
int src_fd = open(path.c_str(), O_RDONLY);
|
||||
if (src_fd == -1)
|
||||
return nullptr;
|
||||
struct stat st;
|
||||
if (fstat(src_fd, &st) == -1)
|
||||
return nullptr;
|
||||
|
||||
uint64_t total = (uint64_t)st.st_size;
|
||||
uint64_t total = std::filesystem::file_size(path);
|
||||
std::vector<Shard *> pieces;
|
||||
uint64_t pos = 0;
|
||||
pieces.reserve((total + PETAL_SIZE_MAX - 1) / PETAL_SIZE_MAX);
|
||||
|
||||
+23
-17
@@ -2,10 +2,16 @@
|
||||
#include "utils/utils.h"
|
||||
#include "vase/iterators/line.h"
|
||||
|
||||
Vase::Vase(std::string path) {
|
||||
Vase::Vase(std::filesystem::path path, std::filesystem::path swapdir)
|
||||
: path(path), swapdir(swapdir) {
|
||||
if (!std::filesystem::exists(swapdir) || !std::filesystem::is_directory(swapdir))
|
||||
throw std::runtime_error("Swap directory does not exist or is not a directory.");
|
||||
append = new AppendBuffer();
|
||||
original = new OriginalBuffer();
|
||||
root = create_file_shards(path, original);
|
||||
original = new OriginalBuffer(swapdir);
|
||||
if (std::filesystem::is_regular_file(path))
|
||||
root = Shard::from_file(path, original);
|
||||
else
|
||||
root = Shard::new_empty(original);
|
||||
history.push_back(root);
|
||||
Shard::retain(root);
|
||||
history_top = 0;
|
||||
@@ -94,7 +100,7 @@ void Vase::prune_history(uint64_t n) {
|
||||
history_top -= n;
|
||||
}
|
||||
|
||||
bool Vase::save(std::string path) {
|
||||
bool Vase::save() {
|
||||
std::ofstream file(path, std::ios::binary);
|
||||
if (!file)
|
||||
return false;
|
||||
@@ -110,7 +116,7 @@ bool Vase::save(std::string path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Vase::save_swap(std::string path) {
|
||||
bool Vase::save_swap() {
|
||||
}
|
||||
|
||||
void Vase::insert(Point *point, char key) {
|
||||
@@ -120,9 +126,9 @@ void Vase::insert(Point *point, char key) {
|
||||
point->col++;
|
||||
uint64_t pos = append->append(key);
|
||||
Shard *inserted = new Petal(1, key == '\n', append, pos);
|
||||
auto [left, right] = split_shard(root, offset_of(*point));
|
||||
Shard *left2 = append_leaf(left, inserted);
|
||||
Shard *new_root = concat_shard(left2, right);
|
||||
auto [left, right] = Shard::split(root, offset_of(*point));
|
||||
Shard *left2 = Shard::append_leaf(left, inserted);
|
||||
Shard *new_root = Shard::concat(left2, right);
|
||||
Shard::release(left);
|
||||
Shard::release(right);
|
||||
Shard::release(left2);
|
||||
@@ -168,9 +174,9 @@ void Vase::_insert(Point *point, const char *data, uint64_t len) {
|
||||
point->col += col;
|
||||
}
|
||||
Shard *inserted = new Petal(len, lines, append, pos);
|
||||
auto [left, right] = split_shard(root, offset);
|
||||
Shard *left2 = append_leaf(left, inserted);
|
||||
Shard *new_root = concat_shard(left2, right);
|
||||
auto [left, right] = Shard::split(root, offset);
|
||||
Shard *left2 = Shard::append_leaf(left, inserted);
|
||||
Shard *new_root = Shard::concat(left2, right);
|
||||
Shard::release(left);
|
||||
Shard::release(right);
|
||||
Shard::release(left2);
|
||||
@@ -193,9 +199,9 @@ void Vase::erase(Point *point, uint64_t amount, Direction dir) {
|
||||
if (start_offset > end_offset)
|
||||
std::swap(start_offset, end_offset);
|
||||
uint64_t count = end_offset - start_offset;
|
||||
auto [a, b] = split_shard(root, start_offset);
|
||||
auto [d, c] = split_shard(b, count);
|
||||
Shard *new_root = concat_shard(a, c);
|
||||
auto [a, b] = Shard::split(root, start_offset);
|
||||
auto [d, c] = Shard::split(b, count);
|
||||
Shard *new_root = Shard::concat(a, c);
|
||||
Shard::release(a);
|
||||
Shard::release(b);
|
||||
Shard::release(c);
|
||||
@@ -212,9 +218,9 @@ void Vase::erase(Range range) {
|
||||
uint64_t start_offset = offset_of(start);
|
||||
uint64_t end_offset = offset_of(end);
|
||||
uint64_t count = end_offset - start_offset;
|
||||
auto [a, b] = split_shard(root, start_offset);
|
||||
auto [d, c] = split_shard(b, count);
|
||||
Shard *new_root = concat_shard(a, c);
|
||||
auto [a, b] = Shard::split(root, start_offset);
|
||||
auto [d, c] = Shard::split(b, count);
|
||||
Shard *new_root = Shard::concat(a, c);
|
||||
Shard::release(a);
|
||||
Shard::release(b);
|
||||
Shard::release(c);
|
||||
|
||||
Reference in New Issue
Block a user