add gcount to fs utils

v1
Brett 2023-08-25 03:41:43 -04:00
parent 1b4e36416a
commit d3ed46686e
1 changed files with 37 additions and 13 deletions

View File

@ -11,7 +11,8 @@
#include <ios> #include <ios>
#include "memory.h" #include "memory.h"
namespace blt::fs { namespace blt::fs
{
/** /**
* A simple interface which provides a way of reading the next block of data from a resource. * A simple interface which provides a way of reading the next block of data from a resource.
@ -20,12 +21,14 @@ namespace blt::fs {
* Reading of a large number of bytes ( > block size) is guaranteed to not significantly increase the read time and will likely result in a * Reading of a large number of bytes ( > block size) is guaranteed to not significantly increase the read time and will likely result in a
* direct passthrough to the underlying system. Small reads will be buffered, hence the name "block" reader. * direct passthrough to the underlying system. Small reads will be buffered, hence the name "block" reader.
*/ */
class block_reader { class block_reader
{
protected: protected:
// 32768 block size seems the fastest on my system // 32768 block size seems the fastest on my system
unsigned long m_bufferSize; unsigned long m_bufferSize;
public: public:
explicit block_reader(size_t bufferSize): m_bufferSize(bufferSize) {} explicit block_reader(size_t bufferSize): m_bufferSize(bufferSize)
{}
/** /**
* Reads bytes from the internal filesystem implementation * Reads bytes from the internal filesystem implementation
@ -34,7 +37,11 @@ namespace blt::fs {
* @return status code. non-zero return codes indicates a failure has occurred. * @return status code. non-zero return codes indicates a failure has occurred.
*/ */
virtual int read(char* buffer, size_t bytes) = 0; virtual int read(char* buffer, size_t bytes) = 0;
virtual char get(){
virtual int gcount() = 0;
virtual char get()
{
char c[1]; char c[1];
read(c, 1); read(c, 1);
return c[0]; return c[0];
@ -44,11 +51,13 @@ namespace blt::fs {
/** /**
* A buffered block writer without a definite backend implementation. Exactly the same as a block_reader but for writing to the filesystem. * A buffered block writer without a definite backend implementation. Exactly the same as a block_reader but for writing to the filesystem.
*/ */
class block_writer { class block_writer
{
protected: protected:
unsigned long m_bufferSize; unsigned long m_bufferSize;
public: public:
explicit block_writer(unsigned long bufferSize): m_bufferSize(bufferSize) {} explicit block_writer(unsigned long bufferSize): m_bufferSize(bufferSize)
{}
/** /**
* Writes the bytes to the filesystem backend implementation * Writes the bytes to the filesystem backend implementation
@ -57,7 +66,9 @@ namespace blt::fs {
* @return non-zero code if failure * @return non-zero code if failure
*/ */
virtual int write(char* buffer, size_t bytes) = 0; virtual int write(char* buffer, size_t bytes) = 0;
virtual int put(char c){
virtual int put(char c)
{
char a[1]; char a[1];
a[0] = c; a[0] = c;
return write(a, 1); return write(a, 1);
@ -72,7 +83,8 @@ namespace blt::fs {
/** /**
* fstream implementation of the block reader. * fstream implementation of the block reader.
*/ */
class fstream_block_reader : public block_reader { class fstream_block_reader : public block_reader
{
private: private:
std::fstream& m_stream; std::fstream& m_stream;
char* m_buffer = nullptr; char* m_buffer = nullptr;
@ -90,20 +102,29 @@ namespace blt::fs {
int read(char* buffer, size_t bytes) override; int read(char* buffer, size_t bytes) override;
~fstream_block_reader() { int gcount() final {
return m_stream.gcount();
}
~fstream_block_reader()
{
delete[] m_buffer; delete[] m_buffer;
} }
}; };
class fstream_block_writer : public block_writer { class fstream_block_writer : public block_writer
{
private: private:
std::fstream& m_stream; std::fstream& m_stream;
char* m_buffer; char* m_buffer;
size_t writeIndex = 0; size_t writeIndex = 0;
void flush_internal(); void flush_internal();
public: public:
explicit fstream_block_writer(std::fstream& stream, size_t bufferSize = 131072): explicit fstream_block_writer(std::fstream& stream, size_t bufferSize = 131072):
block_writer(bufferSize), m_stream(stream), m_buffer(new char[bufferSize]) {} block_writer(bufferSize), m_stream(stream), m_buffer(new char[bufferSize])
{}
explicit fstream_block_writer(fstream_block_writer& copy) = delete; explicit fstream_block_writer(fstream_block_writer& copy) = delete;
@ -114,11 +135,14 @@ namespace blt::fs {
fstream_block_writer& operator=(const fstream_block_writer&& move) = delete; fstream_block_writer& operator=(const fstream_block_writer&& move) = delete;
int write(char* buffer, size_t bytes) override; int write(char* buffer, size_t bytes) override;
inline void flush() override {
inline void flush() override
{
flush_internal(); flush_internal();
} }
~fstream_block_writer() { ~fstream_block_writer()
{
flush_internal(); flush_internal();
delete[] m_buffer; delete[] m_buffer;
} }