Skip to content

Commit 7dde50c

Browse files
committed
Refactor FileHandle to use char spans for writing
Changed writeAll and writeRange methods in FileHandle to accept std::span<const char> instead of std::span<const std::byte>. Mainly for compatbility.
1 parent 92d008a commit 7dde50c

File tree

2 files changed

+31
-25
lines changed

2 files changed

+31
-25
lines changed

src/VirtualFileSystem/FileHandle.cpp

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ FileOperationHandle FileHandle::readLine(size_t lineNumber) const {
5252
return FileOperationHandle::immediate(FileOpStatus::Failed);
5353
}
5454

55-
FileOperationHandle FileHandle::readLineBinary(size_t lineNumber, std::byte delimiter) const {
55+
FileOperationHandle FileHandle::readLineBinary(size_t lineNumber, char delimiter) const {
5656
if (!_backend) {
5757
return FileOperationHandle::immediate(FileOpStatus::Failed);
5858
}
@@ -72,25 +72,28 @@ FileOperationHandle FileHandle::readLineBinary(size_t lineNumber, std::byte deli
7272
}
7373
auto buf = rh.contentsBytes();
7474
size_t idx = 0;
75-
std::vector<std::byte> line;
75+
std::vector<char> line;
76+
auto charDelim = static_cast<std::byte>(static_cast<unsigned char>(delimiter));
7677
for (size_t i = 0; i < buf.size(); ++i) {
77-
if (buf[i] == delimiter) {
78+
if (buf[i] == charDelim) {
7879
if (idx == lineNumber) break; else { line.clear(); ++idx; continue; }
7980
}
80-
line.push_back(buf[i]);
81+
line.push_back(static_cast<char>(buf[i]));
8182
}
8283
if (idx != lineNumber) { s.complete(FileOpStatus::Partial); return; }
83-
s.bytes = std::move(line);
84+
s.bytes.assign(reinterpret_cast<const std::byte*>(line.data()),
85+
reinterpret_cast<const std::byte*>(line.data() + line.size()));
8486
s.complete(FileOpStatus::Complete);
8587
});
8688
}
8789

88-
FileOperationHandle FileHandle::writeAll(std::span<const std::byte> bytes) const {
90+
FileOperationHandle FileHandle::writeAll(std::span<const char> bytes) const {
8991
if (_backend && _vfs) {
9092
WriteOptions opts; opts.truncate = true;
91-
auto data = std::vector<std::byte>(bytes.begin(), bytes.end());
93+
auto data = std::vector<char>(bytes.begin(), bytes.end());
9294
return _vfs->submitSerialized(_meta.path, [opts, data=std::move(data)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
93-
auto inner = backend->writeFile(p, std::span<const std::byte>(data.data(), data.size()), opts);
95+
auto byteSpan = std::as_bytes(std::span<const char>(data.data(), data.size()));
96+
auto inner = backend->writeFile(p, byteSpan, opts);
9497
inner.wait();
9598
auto st = inner.status();
9699
if (st == FileOpStatus::Complete || st == FileOpStatus::Partial) {
@@ -107,14 +110,15 @@ FileOperationHandle FileHandle::writeAll(std::span<const std::byte> bytes) const
107110
return FileOperationHandle::immediate(FileOpStatus::Failed);
108111
}
109112

110-
FileOperationHandle FileHandle::writeAll(std::span<const std::byte> bytes, const WriteOptions& opts) const {
113+
FileOperationHandle FileHandle::writeAll(std::span<const char> bytes, const WriteOptions& opts) const {
111114
if (_backend && _vfs) {
112-
auto data = std::vector<std::byte>(bytes.begin(), bytes.end());
115+
auto data = std::vector<char>(bytes.begin(), bytes.end());
113116
return _vfs->submitSerialized(_meta.path, [opts, data=std::move(data)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
117+
auto byteSpan = std::as_bytes(std::span<const char>(data.data(), data.size()));
114118
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
115-
local->doWriteFile(s, p, std::span<const std::byte>(data.data(), data.size()), opts);
119+
local->doWriteFile(s, p, byteSpan, opts);
116120
} else {
117-
auto inner = backend->writeFile(p, std::span<const std::byte>(data.data(), data.size()), opts);
121+
auto inner = backend->writeFile(p, byteSpan, opts);
118122
inner.wait();
119123
auto st = inner.status();
120124
if (st == FileOpStatus::Complete || st == FileOpStatus::Partial) {
@@ -132,15 +136,16 @@ FileOperationHandle FileHandle::writeAll(std::span<const std::byte> bytes, const
132136
return FileOperationHandle::immediate(FileOpStatus::Failed);
133137
}
134138

135-
FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const std::byte> bytes) const {
139+
FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const char> bytes) const {
136140
WriteOptions opts; opts.offset = offset; opts.truncate = false;
137141
if (_backend && _vfs) {
138-
auto data = std::vector<std::byte>(bytes.begin(), bytes.end());
142+
auto data = std::vector<char>(bytes.begin(), bytes.end());
139143
return _vfs->submitSerialized(_meta.path, [opts, data=std::move(data)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
144+
auto byteSpan = std::as_bytes(std::span<const char>(data.data(), data.size()));
140145
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
141-
local->doWriteFile(s, p, std::span<const std::byte>(data.data(), data.size()), opts);
146+
local->doWriteFile(s, p, byteSpan, opts);
142147
} else {
143-
auto inner = backend->writeFile(p, std::span<const std::byte>(data.data(), data.size()), opts);
148+
auto inner = backend->writeFile(p, byteSpan, opts);
144149
inner.wait();
145150
auto st = inner.status();
146151
if (st == FileOpStatus::Complete || st == FileOpStatus::Partial) {
@@ -158,17 +163,18 @@ FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const std:
158163
return FileOperationHandle::immediate(FileOpStatus::Failed);
159164
}
160165

161-
FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const std::byte> bytes, const WriteOptions& opts) const {
166+
FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const char> bytes, const WriteOptions& opts) const {
162167
if (_backend && _vfs) {
163168
WriteOptions wopts = opts;
164169
wopts.offset = offset;
165170
wopts.truncate = false;
166-
auto data = std::vector<std::byte>(bytes.begin(), bytes.end());
171+
auto data = std::vector<char>(bytes.begin(), bytes.end());
167172
return _vfs->submitSerialized(_meta.path, [wopts, data=std::move(data)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
173+
auto byteSpan = std::as_bytes(std::span<const char>(data.data(), data.size()));
168174
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
169-
local->doWriteFile(s, p, std::span<const std::byte>(data.data(), data.size()), wopts);
175+
local->doWriteFile(s, p, byteSpan, wopts);
170176
} else {
171-
auto inner = backend->writeFile(p, std::span<const std::byte>(data.data(), data.size()), wopts);
177+
auto inner = backend->writeFile(p, byteSpan, wopts);
172178
inner.wait();
173179
auto st = inner.status();
174180
if (st == FileOpStatus::Complete || st == FileOpStatus::Partial) {

src/VirtualFileSystem/FileHandle.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class FileHandle {
103103
* @param delimiter Byte delimiter to split lines
104104
* @return Handle with raw bytes of the line
105105
*/
106-
FileOperationHandle readLineBinary(size_t lineNumber, std::byte delimiter) const;
106+
FileOperationHandle readLineBinary(size_t lineNumber, char delimiter) const;
107107

108108
// Writes
109109
/**
@@ -123,22 +123,22 @@ class FileHandle {
123123
* @param bytes Data to write
124124
* @return Handle for the asynchronous write
125125
*/
126-
FileOperationHandle writeAll(std::span<const std::byte> bytes) const;
126+
FileOperationHandle writeAll(std::span<const char> bytes) const;
127127
/**
128128
* @brief Writes raw bytes with explicit WriteOptions
129129
*/
130-
FileOperationHandle writeAll(std::span<const std::byte> bytes, const WriteOptions& opts) const;
130+
FileOperationHandle writeAll(std::span<const char> bytes, const WriteOptions& opts) const;
131131
/**
132132
* @brief Writes bytes starting at a specific offset
133133
* @param offset Byte offset to begin writing
134134
* @param bytes Data to write
135135
* @return Handle for the asynchronous write
136136
*/
137-
FileOperationHandle writeRange(uint64_t offset, std::span<const std::byte> bytes) const;
137+
FileOperationHandle writeRange(uint64_t offset, std::span<const char> bytes) const;
138138
/**
139139
* @brief Writes bytes at offset with explicit WriteOptions (offset is applied to opts)
140140
*/
141-
FileOperationHandle writeRange(uint64_t offset, std::span<const std::byte> bytes, const WriteOptions& opts) const;
141+
FileOperationHandle writeRange(uint64_t offset, std::span<const char> bytes, const WriteOptions& opts) const;
142142
/**
143143
* @brief Replaces a single line by index (0-based)
144144
*

0 commit comments

Comments
 (0)