sandbox
Loading...
Searching...
No Matches
file_base.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_FILESYSTEM_FILE_BASE_HPP_
3#define LIBSBX_FILESYSTEM_FILE_BASE_HPP_
4
5#include <span>
6#include <vector>
7#include <memory>
8
9#include <libsbx/utility/enum.hpp>
10
11#include <libsbx/filesystem/file_info.hpp>
12
13namespace sbx::filesystem {
14
15class file_base {
16
17public:
18
19 enum class origin {
20 begin,
21 end,
22 set
23 }; // enum class origin
24
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
31 }; // enum class mode
32
33
34 file_base() = default;
35
36 virtual ~file_base() = default;
37
38 [[nodiscard]] virtual auto info() const -> const file_info& = 0;
39
40 [[nodiscard]] virtual auto size() const -> std::uint64_t = 0;
41
42 [[nodiscard]] virtual auto is_read_only() const -> bool = 0;
43
44 [[nodiscard]] virtual auto open(mode mode) -> bool = 0;
45
46 virtual auto close() -> void = 0;
47
48 [[nodiscard]] virtual auto is_open() const -> bool = 0;
49
50 virtual auto seek(std::uint64_t offset, origin origin) -> std::uint64_t = 0;
51
52 [[nodiscard]] virtual auto tell() const -> std::uint64_t = 0;
53
54 virtual auto read(std::span<uint8_t> buffer) -> std::uint64_t = 0;
55
56 virtual auto read(std::vector<std::uint8_t>& buffer, std::uint64_t size) -> std::uint64_t = 0;
57
58 virtual auto write(std::span<const std::uint8_t> buffer) -> std::uint64_t = 0;
59
60 virtual auto write(const std::vector<std::uint8_t>& buffer) -> std::uint64_t = 0;
61
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;
64 }
65
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)) {
68 return false;
69 }
70
71 if (mode_has_flag(file_mode, mode::append) && !mode_has_flag(file_mode, mode::write)) {
72 return false;
73 }
74
75 if (mode_has_flag(file_mode, mode::truncate) && !mode_has_flag(file_mode, mode::write)) {
76 return false;
77 }
78
79 return true;
80 }
81
82}; // class file
83
84using file_ptr = std::shared_ptr<file_base>;
85using file_weak_ptr = std::weak_ptr<file_base>;
86
87inline bool operator==(const file_ptr& lhs, const file_ptr& rhs) {
88 if (!lhs || !rhs) {
89 return false;
90 }
91
92 return lhs->info() == rhs->info();
93}
94
95} // namespace sbx::filesystem
96
97template<>
98struct sbx::utility::is_bit_field<sbx::filesystem::file_base::mode> : std::true_type { };
99
100#endif // LIBSBX_FILESYSTEM_FILE_BASE_HPP_
Definition: file_base.hpp:15
Definition: file_info.hpp:10
Definition: enum.hpp:29