From eab4b33a9a1dec27cc00af10ebd70b5e2dcc04fe Mon Sep 17 00:00:00 2001 From: Avril Date: Sun, 29 Nov 2020 17:25:35 +0000 Subject: [PATCH] fsvec impl start --- include/fsvec.hpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++ src/fsvec.cpp | 57 ++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 include/fsvec.hpp create mode 100644 src/fsvec.cpp diff --git a/include/fsvec.hpp b/include/fsvec.hpp new file mode 100644 index 0000000..48fd2e5 --- /dev/null +++ b/include/fsvec.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include + +#include + +struct file_back_buffer +{ + const static constexpr std::size_t DEFAULT_CAP = 1024; + typedef std::uint8_t byte; + + file_back_buffer(); + file_back_buffer(std::size_t cap); + file_back_buffer(const file_back_buffer& c) = delete; + inline file_back_buffer(file_back_buffer&& m) : inner(std::move(m.inner)){} + + void push_buf(byte* buf, std::size_t len); + byte* back(std::size_t len); + const byte* back(std::size_t len) const; + void pop_n(std::size_t len); + + ~file_back_buffer(); +private: + struct impl; + std::unique_ptr inner; +}; + +namespace { + template + inline const T* _die_if_null(const T* input, const char* msg) + { + if(!input) panic(msg); + return input; + } + template + inline T* _die_if_null(T* input, const char* msg) + { + if(!input) panic(msg); + return input; + } +} + +template +struct file_vector +{ + inline file_vector(){} + inline file_vector(std::size_t cap) : inserter(file_back_buffer(cap)), len(0) {} + inline file_vector(const file_vector& c) = delete; + inline file_vector(file_vector&& m) : inserter(std::move(m.inserter)), len(m.len) {} + + inline void push_back(T&& value) + { + inserter.push_buf((file_back_buffer::byte*)&value, sizeof(T)); + len += 1; + } + inline T& back() + { + if(!len) panic("back() called on empty file_vector"); + return *_die_if_null((T*)inserter.back(sizeof(T)), "file_vector::back() returned null pointer"); + } + inline const T& back() const + { + if(!len) panic("back() called on empty file_vector"); + return *_die_if_null((const T*)inserter.back(sizeof(T)), "file_vector::back() (const) returned null pointer"); + } + inline void pop_back() + { + if(!len) return; + + inserter.pop_n(sizeof(T)); + len-=1; + } +private: + file_back_buffer inserter; + std::uint64_t len; +}; diff --git a/src/fsvec.cpp b/src/fsvec.cpp new file mode 100644 index 0000000..2811afd --- /dev/null +++ b/src/fsvec.cpp @@ -0,0 +1,57 @@ +#include + +#define FB file_back_buffer +using std::size_t; + +struct temp_file +{ + inline temp_file() + { + // Create random new file + } + inline temp_file(const temp_file& c) = delete; + inline temp_file(temp_file&& m) : name(m.name) { m.name= nullptr; } + inline temp_file(const char* name) : name(name) {} + inline ~temp_file() + { + if(name) name = nullptr; + } + +private: + const char* name; +}; + +struct FB::impl +{ + size_t cap; + temp_file file; +}; + +FB::FB(size_t cap) : inner(std::make_unique()) +{ + // Set cap + inner->cap = cap; + // Open `inner->file` + +} +FB::FB() : FB(DEFAULT_CAP){} + +void FB::push_buf(byte* buf, size_t len) +{ + +} + +FB::byte* FB::back(size_t len) +{ + return nullptr; +} + +const FB::byte* FB::back(size_t len) const +{ + return nullptr; +} + +void FB::pop_n(size_t len) +{ + +}