From c01073b04a6dcdf067342cf17fe5363a66d85eed Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 5 Dec 2025 14:48:31 +0100 Subject: multiboot2: add range support to VLA tags --- libs/multiboot2/include/multiboot2/impl/tag.hpp | 85 +++++++++++++++++++++- libs/multiboot2/include/multiboot2/information.hpp | 25 +------ 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 #include +#include #include namespace multiboot2::impl @@ -79,7 +80,18 @@ namespace multiboot2::impl template typename Range> struct vla_tag : tag { - using range_type = Range; + using range_type = Range; + + 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{} @@ -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(header); + auto raw = std::bit_cast(header); auto start = raw + sizeof(tag); return std::bit_cast(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 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()}; } }; -- cgit v1.2.3