liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

commit c0a85970509d1ab9424cb7d8aaa2ac17956af869
parent 8f2ec1862e588f4e1aefd4c00cdd2726c15fd278
Author: Henry Wilson <henry@henryandlizzy.uk>
Date:   Fri,  9 Jan 2026 23:11:41 +0000

span: no longer implictly convertible from array

Diffstat:
Mexec.cpp | 2+-
Mlinux.hpp | 30+++++++++++++++++++++---------
Mls.cpp | 2+-
Mtee.cpp | 2+-
Dtest.cpp | 22----------------------
Mwriter.cpp | 19-------------------
6 files changed, 24 insertions(+), 53 deletions(-)

diff --git a/exec.cpp b/exec.cpp @@ -8,7 +8,7 @@ int main(int argc, char* argv[], char* envp[]) switch (execve(argv[1], argv + 1, envp).err()) { case errno_t::ENOENT: - *write(stderr, "ENOENT: No such file or directory\n"); + *write(stderr, "ENOENT: No such file or directory\n"_sp); break; default: __builtin_trap(); diff --git a/linux.hpp b/linux.hpp @@ -49,12 +49,12 @@ template <typename T> struct span { span() = default; - inline span(T* p, size_t n) noexcept + constexpr span(T* p, size_t n) noexcept : ptr{p} , len{n} {} - inline span(T* p, T* end) noexcept + constexpr span(T* p, T* end) noexcept : ptr{p} , len{static_cast<size_t>(end - p)} { @@ -62,35 +62,47 @@ struct span } template <size_t N> - inline span(T (&arr)[N]) noexcept + constexpr explicit span(T (&arr)[N]) noexcept : span{arr, N} {} - T* data() const noexcept - { - return ptr; - } size_t size() const noexcept { return len; } T* begin() const noexcept { - return data(); + return ptr; } T* end() const noexcept { return begin() + size(); } - T& operator[](size_t n) + T& operator[](size_t n) noexcept { + assert(n < len); return ptr[n]; } + + bool operator == (span<T> rhs) const noexcept + { + if (size() != rhs.size()) + return false; + for (size_t i = 0; i < size(); ++i) + if (ptr[i] != rhs[i]) + return false; + return true; + } private: T* ptr = nullptr; size_t len = 0; }; +constexpr span<char const> operator ""_sp(char const* begin, size_t size) noexcept +{ + return {begin, size}; +} + struct file { constexpr file() = default; diff --git a/ls.cpp b/ls.cpp @@ -28,7 +28,7 @@ int main() for (;;) { spanstack ios{span{ios_storage}}; - auto res = getdents64(*dir, buf); + auto res = getdents64(*dir, span{buf}); void* const end = buf + *res; if (end == buf) break; diff --git a/tee.cpp b/tee.cpp @@ -10,7 +10,7 @@ int main(int argc, char* argv[]) char buf[0x1000]; for (;;) { - auto n = *read(stdin, buf); + auto n = *read(stdin, span{buf}); if (not n) break; for (auto f : files) diff --git a/test.cpp b/test.cpp @@ -1,22 +0,0 @@ -#include "linux.hpp" - -char const rodata[] = "rodata\n"; -char data[] = "data\n"; -char bss[4]; - -void text() -{ - *write(stdout, {rodata, sizeof(rodata) - 1}); - *write(stdout, {data, sizeof(data) - 1}); - - bss[0] = 'b'; - bss[1] = 's'; - bss[2] = 's'; - bss[3] = '\n'; - *write(stdout, bss); -} - -int main() -{ - text(); -} diff --git a/writer.cpp b/writer.cpp @@ -39,25 +39,6 @@ private: vector<char> buffer; }; - -constexpr span<char const> operator ""_sp(char const* begin, size_t size) -{ - return {begin, size}; -} - -template <typename T> -bool operator == (span<T> lhs, span<T> rhs) -{ - if (lhs.size() != rhs.size()) - return false; - for (size_t i = 0; i < lhs.size(); ++i) - if (lhs[i] != rhs[i]) - return false; - return true; -} - - - void decimal(writer& w, uint64_t n) { char buf[20];