2#ifndef LIBSBX_FILESYSTEM_FILE_BASE_HPP_
3#define LIBSBX_FILESYSTEM_FILE_BASE_HPP_
9#include <libsbx/utility/enum.hpp>
11#include <libsbx/filesystem/file_info.hpp>
13namespace sbx::filesystem {
25 enum class mode : std::uint8_t {
26 read = utility::bit_v<0>,
27 write = utility::bit_v<1>,
28 append = utility::bit_v<2>,
29 truncate = utility::bit_v<3>,
30 read_write = read | write
38 [[nodiscard]]
virtual auto info()
const ->
const file_info& = 0;
40 [[nodiscard]]
virtual auto size()
const -> std::uint64_t = 0;
42 [[nodiscard]]
virtual auto is_read_only()
const ->
bool = 0;
44 [[nodiscard]]
virtual auto open(mode mode) ->
bool = 0;
46 virtual auto close() ->
void = 0;
48 [[nodiscard]]
virtual auto is_open()
const ->
bool = 0;
50 virtual auto seek(std::uint64_t offset, origin origin) -> std::uint64_t = 0;
52 [[nodiscard]]
virtual auto tell()
const -> std::uint64_t = 0;
54 virtual auto read(std::span<uint8_t> buffer) -> std::uint64_t = 0;
56 virtual auto read(std::vector<std::uint8_t>& buffer, std::uint64_t size) -> std::uint64_t = 0;
58 virtual auto write(std::span<const std::uint8_t> buffer) -> std::uint64_t = 0;
60 virtual auto write(
const std::vector<std::uint8_t>& buffer) -> std::uint64_t = 0;
62 static auto mode_has_flag(mode file_mode, mode flag) ->
bool {
63 return (
static_cast<std::uint8_t
>(file_mode) &
static_cast<std::uint8_t
>(flag)) != 0;
66 [[nodiscard]]
static auto is_mode_valid(mode file_mode) ->
bool {
67 if (!mode_has_flag(file_mode, mode::read) && !mode_has_flag(file_mode, mode::write)) {
71 if (mode_has_flag(file_mode, mode::append) && !mode_has_flag(file_mode, mode::write)) {
75 if (mode_has_flag(file_mode, mode::truncate) && !mode_has_flag(file_mode, mode::write)) {
84using file_ptr = std::shared_ptr<file_base>;
85using file_weak_ptr = std::weak_ptr<file_base>;
87inline bool operator==(
const file_ptr& lhs,
const file_ptr& rhs) {
92 return lhs->info() == rhs->info();
Definition: file_base.hpp:15
Definition: file_info.hpp:10