Skip to content

Commit d1c4176

Browse files
committed
Refactor file I/O to use uint8_t instead of std::byte
Replaces usage of std::byte with uint8_t for file read/write buffers and spans throughout the VirtualFileSystem module. This improves compatibility and simplifies buffer handling, given libdatachannel likes to complain about duplicate symbols.
1 parent 0848b27 commit d1c4176

File tree

8 files changed

+36
-38
lines changed

8 files changed

+36
-38
lines changed

src/VirtualFileSystem/FileHandle.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,14 @@ FileOperationHandle FileHandle::readLineBinary(size_t lineNumber, uint8_t delimi
7373
auto buf = rh.contentsBytes();
7474
size_t idx = 0;
7575
std::vector<uint8_t> line;
76-
auto byteDelim = static_cast<std::byte>(delimiter);
7776
for (size_t i = 0; i < buf.size(); ++i) {
78-
if (buf[i] == byteDelim) {
77+
if (buf[i] == delimiter) {
7978
if (idx == lineNumber) break; else { line.clear(); ++idx; continue; }
8079
}
81-
line.push_back(static_cast<uint8_t>(buf[i]));
80+
line.push_back(buf[i]);
8281
}
8382
if (idx != lineNumber) { s.complete(FileOpStatus::Partial); return; }
84-
s.bytes.assign(reinterpret_cast<const std::byte*>(line.data()),
85-
reinterpret_cast<const std::byte*>(line.data() + line.size()));
83+
s.bytes.assign(line.begin(), line.end());
8684
s.complete(FileOpStatus::Complete);
8785
});
8886
}
@@ -92,7 +90,7 @@ FileOperationHandle FileHandle::writeAll(std::span<const uint8_t> bytes) const {
9290
WriteOptions opts; opts.truncate = true;
9391
auto data = std::vector<uint8_t>(bytes.begin(), bytes.end());
9492
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 {
95-
auto byteSpan = std::as_bytes(std::span<const uint8_t>(data.data(), data.size()));
93+
auto byteSpan = std::span<const uint8_t>(data.data(), data.size());
9694
auto inner = backend->writeFile(p, byteSpan, opts);
9795
inner.wait();
9896
auto st = inner.status();
@@ -114,7 +112,7 @@ FileOperationHandle FileHandle::writeAll(std::span<const uint8_t> bytes, const W
114112
if (_backend && _vfs) {
115113
auto data = std::vector<uint8_t>(bytes.begin(), bytes.end());
116114
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 uint8_t>(data.data(), data.size()));
115+
auto byteSpan = std::span<const uint8_t>(data.data(), data.size());
118116
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
119117
local->doWriteFile(s, p, byteSpan, opts);
120118
} else {
@@ -141,7 +139,7 @@ FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const uint
141139
if (_backend && _vfs) {
142140
auto data = std::vector<uint8_t>(bytes.begin(), bytes.end());
143141
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 uint8_t>(data.data(), data.size()));
142+
auto byteSpan = std::span<const uint8_t>(data.data(), data.size());
145143
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
146144
local->doWriteFile(s, p, byteSpan, opts);
147145
} else {
@@ -170,7 +168,7 @@ FileOperationHandle FileHandle::writeRange(uint64_t offset, std::span<const uint
170168
wopts.truncate = false;
171169
auto data = std::vector<uint8_t>(bytes.begin(), bytes.end());
172170
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 uint8_t>(data.data(), data.size()));
171+
auto byteSpan = std::span<const uint8_t>(data.data(), data.size());
174172
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
175173
local->doWriteFile(s, p, byteSpan, wopts);
176174
} else {
@@ -222,7 +220,7 @@ FileOperationHandle FileHandle::writeAll(std::string_view text) const {
222220
WriteOptions opts; opts.truncate = true;
223221
auto textCopy = std::string(text);
224222
return _vfs->submitSerialized(_meta.path, [opts, textCopy=std::move(textCopy)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
225-
auto spanBytes = std::as_bytes(std::span<const char>(textCopy.data(), textCopy.size()));
223+
auto spanBytes = std::span<const uint8_t>(reinterpret_cast<const uint8_t*>(textCopy.data()), textCopy.size());
226224
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
227225
local->doWriteFile(s, p, spanBytes, opts);
228226
} else {
@@ -248,7 +246,7 @@ FileOperationHandle FileHandle::writeAll(std::string_view text, const WriteOptio
248246
if (_backend && _vfs) {
249247
auto textCopy = std::string(text);
250248
return _vfs->submitSerialized(_meta.path, [opts, textCopy=std::move(textCopy)](FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> backend, const std::string& p, const ExecContext&) mutable {
251-
auto spanBytes = std::as_bytes(std::span<const char>(textCopy.data(), textCopy.size()));
249+
auto spanBytes = std::span<const uint8_t>(reinterpret_cast<const uint8_t*>(textCopy.data()), textCopy.size());
252250
if (auto* local = dynamic_cast<LocalFileSystemBackend*>(backend.get())) {
253251
local->doWriteFile(s, p, spanBytes, opts);
254252
} else {

src/VirtualFileSystem/FileOperationHandle.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ FileOpStatus FileOperationHandle::status() const noexcept {
3535
return _s ? _s->st.load(std::memory_order_acquire) : FileOpStatus::Pending;
3636
}
3737

38-
std::span<const std::byte> FileOperationHandle::contentsBytes() const {
38+
std::span<const uint8_t> FileOperationHandle::contentsBytes() const {
3939
if (!_s) return {};
40-
40+
4141
// Ensure operation is complete before accessing data
4242
if (!_s->isComplete.load(std::memory_order_acquire)) {
4343
wait();
4444
}
45-
46-
return std::span<const std::byte>(_s->bytes.data(), _s->bytes.size());
45+
46+
return std::span<const uint8_t>(_s->bytes.data(), _s->bytes.size());
4747
}
4848

4949
std::string FileOperationHandle::contentsText() const {

src/VirtualFileSystem/FileOperationHandle.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class FileOperationHandle {
8989
FileOpStatus status() const noexcept;
9090

9191
// Read results (views) - only valid after wait()
92-
std::span<const std::byte> contentsBytes() const;
92+
std::span<const uint8_t> contentsBytes() const;
9393
std::string contentsText() const;
9494

9595
// Write results - only valid after wait()
@@ -134,7 +134,7 @@ class FileOperationHandle {
134134
std::function<void()> progress;
135135

136136
// Result data - only valid after completion
137-
std::vector<std::byte> bytes; // for reads
137+
std::vector<uint8_t> bytes; // for reads
138138
uint64_t wrote = 0; // for writes
139139
FileErrorInfo error; // error details if failed
140140
std::string text; // for text preview/read operations

src/VirtualFileSystem/FileStream.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ BufferedFileStream::BufferedFileStream(std::unique_ptr<FileStream> inner, size_t
1010
, _writeBuffer(bufferSize) {
1111
}
1212

13-
IoResult BufferedFileStream::read(std::span<std::byte> buffer) {
13+
IoResult BufferedFileStream::read(std::span<uint8_t> buffer) {
1414
IoResult result;
1515

1616
if (!good()) {
@@ -49,7 +49,7 @@ IoResult BufferedFileStream::read(std::span<std::byte> buffer) {
4949
return result;
5050
}
5151

52-
IoResult BufferedFileStream::write(std::span<const std::byte> data) {
52+
IoResult BufferedFileStream::write(std::span<const uint8_t> data) {
5353
IoResult result;
5454

5555
if (!good()) {
@@ -149,7 +149,7 @@ void BufferedFileStream::close() {
149149

150150
void BufferedFileStream::flushWriteBuffer() {
151151
if (_writePos > 0) {
152-
auto result = _inner->write(std::span<const std::byte>(_writeBuffer.data(), _writePos));
152+
auto result = _inner->write(std::span<const uint8_t>(_writeBuffer.data(), _writePos));
153153
_writePos = 0;
154154
_dirty = false;
155155
}

src/VirtualFileSystem/FileStream.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ class FileStream {
2323

2424
// Core I/O operations
2525
// Read into buffer, returns actual bytes read
26-
virtual IoResult read(std::span<std::byte> buffer) = 0;
27-
28-
// Write data, returns actual bytes written
29-
virtual IoResult write(std::span<const std::byte> data) = 0;
26+
virtual IoResult read(std::span<uint8_t> buffer) = 0;
27+
28+
// Write data, returns actual bytes written
29+
virtual IoResult write(std::span<const uint8_t> data) = 0;
3030

3131
// Positioning
3232
virtual bool seek(int64_t offset, std::ios_base::seekdir dir = std::ios_base::beg) = 0;
@@ -52,8 +52,8 @@ class BufferedFileStream : public FileStream {
5252
public:
5353
BufferedFileStream(std::unique_ptr<FileStream> inner, size_t bufferSize = 8192);
5454

55-
IoResult read(std::span<std::byte> buffer) override;
56-
IoResult write(std::span<const std::byte> data) override;
55+
IoResult read(std::span<uint8_t> buffer) override;
56+
IoResult write(std::span<const uint8_t> data) override;
5757
bool seek(int64_t offset, std::ios_base::seekdir dir) override;
5858
int64_t tell() const override;
5959
bool good() const override;
@@ -65,8 +65,8 @@ class BufferedFileStream : public FileStream {
6565

6666
private:
6767
std::unique_ptr<FileStream> _inner;
68-
std::vector<std::byte> _readBuffer;
69-
std::vector<std::byte> _writeBuffer;
68+
std::vector<uint8_t> _readBuffer;
69+
std::vector<uint8_t> _writeBuffer;
7070
size_t _readPos = 0;
7171
size_t _readSize = 0;
7272
size_t _writePos = 0;

src/VirtualFileSystem/IFileSystemBackend.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ class IFileSystemBackend {
197197
* @note Special files (FIFO, device, socket) are rejected with FileError::InvalidPath on Unix.
198198
* @note Set options.fsync=true for durability guarantee (Unix/POSIX only; forces data to disk).
199199
*/
200-
virtual FileOperationHandle writeFile(const std::string& path, std::span<const std::byte> data, WriteOptions options = {}) = 0;
200+
virtual FileOperationHandle writeFile(const std::string& path, std::span<const uint8_t> data, WriteOptions options = {}) = 0;
201201
/**
202202
* @brief Deletes a file
203203
* @param path Target path

src/VirtualFileSystem/LocalFileSystemBackend.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ class LocalFileStream : public FileStream {
287287
}
288288
}
289289

290-
IoResult read(std::span<std::byte> buffer) override {
290+
IoResult read(std::span<uint8_t> buffer) override {
291291
IoResult result;
292292

293293
if (!good() || buffer.empty()) {
@@ -306,7 +306,7 @@ class LocalFileStream : public FileStream {
306306
return result;
307307
}
308308

309-
IoResult write(std::span<const std::byte> data) override {
309+
IoResult write(std::span<const uint8_t> data) override {
310310
IoResult result;
311311

312312
if (!good() || data.empty()) {
@@ -410,7 +410,7 @@ FileOperationHandle LocalFileSystemBackend::submitWork(const std::string& path,
410410
}
411411

412412
// Synchronous operations for FileHandle via submitSerialized
413-
void LocalFileSystemBackend::doWriteFile(FileOperationHandle::OpState& s, const std::string& p, std::span<const std::byte> data, WriteOptions options) {
413+
void LocalFileSystemBackend::doWriteFile(FileOperationHandle::OpState& s, const std::string& p, std::span<const uint8_t> data, WriteOptions options) {
414414
// Check for special files (FIFO, device, socket) that shouldn't be written via file operations
415415
if (isSpecialFile(p)) {
416416
s.setError(FileError::InvalidPath, "Cannot perform file operations on special files (FIFO, device, socket)", p);
@@ -988,20 +988,20 @@ FileOperationHandle LocalFileSystemBackend::readFile(const std::string& path, Re
988988
});
989989
}
990990

991-
FileOperationHandle LocalFileSystemBackend::writeFile(const std::string& path, std::span<const std::byte> data, WriteOptions options) {
991+
FileOperationHandle LocalFileSystemBackend::writeFile(const std::string& path, std::span<const uint8_t> data, WriteOptions options) {
992992
// Route backend writes through VFS submitSerialized to honor advisory fallback policy and scope mapping.
993993
// Delegate the actual I/O to doWriteFile, which executes synchronously under the serialized section.
994994
if (_vfs) {
995-
auto buf = std::vector<std::byte>(data.begin(), data.end());
995+
auto buf = std::vector<uint8_t>(data.begin(), data.end());
996996
return _vfs->submitSerialized(path,
997997
[this, buf = std::move(buf), options]
998998
(FileOperationHandle::OpState& s, std::shared_ptr<IFileSystemBackend> /*backend*/, const std::string& p, const ExecContext& /*ctx*/) mutable {
999-
this->doWriteFile(s, p, std::span<const std::byte>(buf.data(), buf.size()), options);
999+
this->doWriteFile(s, p, std::span<const uint8_t>(buf.data(), buf.size()), options);
10001000
}
10011001
);
10021002
}
10031003
// Fallback: no VFS associated (rare). Execute synchronously via submitWork and doWriteFile.
1004-
return submitWork(path, [this, data = std::vector<std::byte>(data.begin(), data.end()), options]
1004+
return submitWork(path, [this, data = std::vector<uint8_t>(data.begin(), data.end()), options]
10051005
(FileOperationHandle::OpState& s, const std::string& p) mutable {
10061006

10071007
// Check for special files (FIFO, device, socket)

src/VirtualFileSystem/LocalFileSystemBackend.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class LocalFileSystemBackend : public IFileSystemBackend {
1212

1313
// Core file operations
1414
FileOperationHandle readFile(const std::string& path, ReadOptions options = {}) override;
15-
FileOperationHandle writeFile(const std::string& path, std::span<const std::byte> data, WriteOptions options = {}) override;
15+
FileOperationHandle writeFile(const std::string& path, std::span<const uint8_t> data, WriteOptions options = {}) override;
1616
FileOperationHandle deleteFile(const std::string& path) override;
1717
FileOperationHandle createFile(const std::string& path) override;
1818

@@ -48,7 +48,7 @@ class LocalFileSystemBackend : public IFileSystemBackend {
4848
AcquireWriteScopeResult acquireWriteScope(const std::string& path, AcquireScopeOptions options = {}) override;
4949

5050
// Synchronous operations for use by VFS submitSerialized (these execute inline, no async work)
51-
void doWriteFile(FileOperationHandle::OpState& s, const std::string& path, std::span<const std::byte> data, WriteOptions options);
51+
void doWriteFile(FileOperationHandle::OpState& s, const std::string& path, std::span<const uint8_t> data, WriteOptions options);
5252
void doDeleteFile(FileOperationHandle::OpState& s, const std::string& path);
5353
void doCreateFile(FileOperationHandle::OpState& s, const std::string& path);
5454
void doWriteLine(FileOperationHandle::OpState& s, const std::string& path, size_t lineNumber, std::string_view line);

0 commit comments

Comments
 (0)