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:
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];