aboutsummaryrefslogtreecommitdiff
path: root/libs/multiboot2
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-05 14:48:31 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-05 14:53:24 +0100
commitc01073b04a6dcdf067342cf17fe5363a66d85eed (patch)
treea80e3c6652cffb501093e05199d03faf3c2f27e4 /libs/multiboot2
parent36cd516c84cf2edd16defcd39e99e2bee0bca892 (diff)
downloadteachos-c01073b04a6dcdf067342cf17fe5363a66d85eed.tar.xz
teachos-c01073b04a6dcdf067342cf17fe5363a66d85eed.zip
multiboot2: add range support to VLA tags
Diffstat (limited to 'libs/multiboot2')
-rw-r--r--libs/multiboot2/include/multiboot2/impl/tag.hpp85
-rw-r--r--libs/multiboot2/include/multiboot2/information.hpp25
2 files changed, 84 insertions, 26 deletions
diff --git a/libs/multiboot2/include/multiboot2/impl/tag.hpp b/libs/multiboot2/include/multiboot2/impl/tag.hpp
index f151b54..5edcd6f 100644
--- a/libs/multiboot2/include/multiboot2/impl/tag.hpp
+++ b/libs/multiboot2/include/multiboot2/impl/tag.hpp
@@ -5,6 +5,7 @@
#include <bit>
#include <cstddef>
+#include <cstdint>
#include <string_view>
namespace multiboot2::impl
@@ -79,7 +80,18 @@ namespace multiboot2::impl
template<typename Data, typename VlaData, template<typename> typename Range>
struct vla_tag : tag<Data>
{
- using range_type = Range<VlaData>;
+ using range_type = Range<VlaData const>;
+
+ using iterator = range_type::const_iterator;
+ using const_iterator = range_type::const_iterator;
+ using reverse_iterator = range_type::const_reverse_iterator;
+ using const_reverse_iterator = range_type::const_reverse_iterator;
+ using size_type = range_type::size_type;
+ using difference_type = range_type::difference_type;
+ using reference = range_type::const_reference;
+ using const_reference = range_type::const_reference;
+ using pointer = range_type::const_pointer;
+ using const_pointer = range_type::const_pointer;
vla_tag()
: tag<Data>{}
@@ -91,10 +103,75 @@ namespace multiboot2::impl
, m_vla{vla_start(header), vla_size(header)}
{}
- protected:
+ [[nodiscard]] auto begin() const noexcept -> const_iterator
+ {
+ return m_vla.begin();
+ }
+
+ [[nodiscard]] auto end() const noexcept -> const_iterator
+ {
+ return m_vla.end();
+ }
+
+ [[nodiscard]] auto cbegin() const noexcept -> const_iterator
+ {
+ return begin();
+ }
+
+ [[nodiscard]] auto cend() const noexcept -> const_iterator
+ {
+ return end();
+ }
+
+ [[nodiscard]] auto rbegin() const noexcept -> const_reverse_iterator
+ {
+ return m_vla.rbegin();
+ }
+
+ [[nodiscard]] auto rend() const noexcept -> const_reverse_iterator
+ {
+ return m_vla.rend();
+ }
+
+ [[nodiscard]] auto crbegin() const noexcept -> const_reverse_iterator
+ {
+ return rbegin();
+ }
+
+ [[nodiscard]] auto crend() const noexcept -> const_reverse_iterator
+ {
+ return rend();
+ }
+
+ [[nodiscard]] auto front() const noexcept -> const_reference
+ {
+ return m_vla.front();
+ }
+
+ [[nodiscard]] auto back() const noexcept -> const_reference
+ {
+ return m_vla.back();
+ }
+
+ [[nodiscard]] auto size() const noexcept -> std::size_t
+ {
+ return m_vla.size();
+ }
+
+ [[nodiscard]] auto empty() const noexcept -> bool
+ {
+ return m_vla.empty();
+ }
+
+ [[nodiscard]] auto data() const noexcept -> const_pointer
+ {
+ return m_vla.data();
+ }
+
+ private:
auto static vla_start(tag_header const * header) noexcept -> VlaData *
{
- auto raw = std::bit_cast<std::byte const *>(header);
+ auto raw = std::bit_cast<std::uintptr_t>(header);
auto start = raw + sizeof(tag<Data>);
return std::bit_cast<VlaData *>(start);
}
@@ -107,7 +184,7 @@ namespace multiboot2::impl
return size;
}
- range_type const m_vla;
+ range_type m_vla;
};
} // namespace multiboot2::impl
diff --git a/libs/multiboot2/include/multiboot2/information.hpp b/libs/multiboot2/include/multiboot2/information.hpp
index 462528d..4be32aa 100644
--- a/libs/multiboot2/include/multiboot2/information.hpp
+++ b/libs/multiboot2/include/multiboot2/information.hpp
@@ -46,7 +46,7 @@ namespace multiboot2
*/
auto string() const noexcept -> range_type
{
- return m_vla;
+ return {data(), size()};
}
};
@@ -58,13 +58,6 @@ namespace multiboot2
{
using base = impl::vla_tag<impl::elf_symbols_data, elf::section_header<Format> const, std::span>;
using base::base;
-
- using iterator = base::range_type::iterator;
-
- auto data() const noexcept -> base::range_type
- {
- return this->m_vla;
- }
};
/**
@@ -79,7 +72,7 @@ namespace multiboot2
*/
auto string() const noexcept -> std::string_view
{
- return m_vla;
+ return {data(), size()};
}
};
@@ -90,24 +83,12 @@ namespace multiboot2
{
using vla_tag::vla_tag;
- using iterator = range_type::iterator;
-
- auto begin() const noexcept -> iterator
- {
- return regions().begin();
- }
-
- auto end() const noexcept -> iterator
- {
- return regions().end();
- }
-
/**
* @brief The available memory regions
*/
auto regions() const noexcept -> range_type
{
- return m_vla;
+ return {data(), size()};
}
};