diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2025-12-05 14:48:31 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2025-12-05 14:53:24 +0100 |
| commit | c01073b04a6dcdf067342cf17fe5363a66d85eed (patch) | |
| tree | a80e3c6652cffb501093e05199d03faf3c2f27e4 /libs/multiboot2 | |
| parent | 36cd516c84cf2edd16defcd39e99e2bee0bca892 (diff) | |
| download | teachos-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.hpp | 85 | ||||
| -rw-r--r-- | 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 <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()}; } }; |
