Initial commit

This commit is contained in:
gaztin committed 2026-07-11 19:53:00 +02:00
commit d1890b6e18
16 files changed
+702

No files matched your search

+69
View File
@@ -0,0 +1,69 @@
#include "file-stream.h"
#include "core-library/io/io-helper.h"
#include <system_error>
core::file_stream::~file_stream()
{
close();
}
core::file_stream::file_stream(file_stream&& other) noexcept
: m_file_handle(std::exchange(other.m_file_handle, nullptr))
{
}
core::file_stream& core::file_stream::operator=(file_stream&& other)
{
if (this != &other)
{
core::close_file(m_file_handle);
m_file_handle = std::exchange(other.m_file_handle, nullptr);
}
return *this;
}
core::file_stream core::file_stream::open_for_reading(const std::filesystem::path& file_path)
{
file_stream stream{};
stream.m_file_handle = core::open_file(file_path.string().c_str(), "rb");
return stream;
}
std::string core::file_stream::file_contents_as_string(const std::filesystem::path& file_path)
{
file_stream stream = open_for_reading(file_path);
return stream.read_all_as_string();
}
std::string core::file_stream::read_all_as_string()
{
if (!m_file_handle)
return {};
core::seek_file_to_end(m_file_handle);
const std::size_t file_size = static_cast<std::size_t>(core::get_file_offset(m_file_handle));
core::seek_file_to_beginning(m_file_handle);
if (file_size == 0)
return {};
std::string result(file_size, '\0');
core::read_from_file(&result[0], 1, file_size, m_file_handle);
return result;
}
void core::file_stream::close()
{
if (m_file_handle)
{
if (int result = std::fclose(m_file_handle); result != 0)
throw std::system_error(std::error_code{result, std::system_category()});
m_file_handle = nullptr;
}
}
+31
View File
@@ -0,0 +1,31 @@
#pragma once
#include <concepts>
#include <cstdio>
#include <filesystem>
#include <string>
#include <type_traits>
namespace core {
class file_stream
{
public:
file_stream(const file_stream&) = delete;
file_stream& operator=(const file_stream&) = delete;
file_stream(file_stream&&) noexcept;
file_stream& operator=(file_stream&&);
~file_stream();
static file_stream open_for_reading(const std::filesystem::path& file_path);
static std::string file_contents_as_string(const std::filesystem::path& file_path);
std::string read_all_as_string();
void close();
private:
file_stream() = default;
FILE* m_file_handle{};
};
}
+72
View File
@@ -0,0 +1,72 @@
#include "io-helper.h"
#include <system_error>
std::FILE* core::open_file(const char* file_path, const char* mode)
{
std::FILE* file = std::fopen(file_path, mode);
if (!file)
throw std::system_error(errno, std::system_category());
return file;
}
void core::seek_file_to_beginning(std::FILE* file, long offset)
{
const int result = std::fseek(file, offset, SEEK_SET);
if (result != 0)
throw std::system_error(errno, std::system_category());
}
void core::seek_file_relatively(std::FILE* file, long offset)
{
const int result = std::fseek(file, offset, SEEK_CUR);
if (result != 0)
throw std::system_error(errno, std::system_category());
}
void core::seek_file_to_end(std::FILE* file, long offset)
{
const int result = std::fseek(file, offset, SEEK_END);
if (result != 0)
throw std::system_error(errno, std::system_category());
}
long core::get_file_offset(std::FILE* file)
{
const long offset = std::ftell(file);
if (offset < 0)
throw std::system_error(errno, std::system_category());
return offset;
}
std::size_t core::read_from_file(void* buffer, std::size_t size, std::size_t count, std::FILE* file)
{
const std::size_t objects_read = std::fread(buffer, size, count, file);
if (objects_read < count)
{
if (std::feof(file))
throw std::runtime_error("Failed to read from file: End-of-file reached.");
else
throw std::runtime_error("Failed to read from file: Unknown error.");
}
return objects_read;
}
std::size_t core::write_to_file(const void* buffer, std::size_t size, std::size_t count, std::FILE* file)
{
const std::size_t objects_written = std::fwrite(buffer, size, count, file);
if (objects_written < count)
throw std::runtime_error("Failed to write to file.");
return objects_written;
}
void core::close_file(std::FILE* file)
{
int result = std::fclose(file);
if (result != 0)
throw std::runtime_error("Failed to close file.");
}
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#include <cstdio>
#include <string_view>
namespace core {
extern std::FILE* open_file(const char* file_path, const char* mode);
extern void seek_file_to_beginning(std::FILE* file, long offset = 0);
extern void seek_file_relatively(std::FILE* file, long offset);
extern void seek_file_to_end(std::FILE* file, long offset = 0);
extern long get_file_offset(std::FILE* file);
extern std::size_t read_from_file(void* buffer, std::size_t size, std::size_t count, std::FILE* file);
extern std::size_t write_to_file(const void* buffer, std::size_t size, std::size_t count, std::FILE* file);
extern void close_file(std::FILE* file);
}