aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/multiboot
diff options
context:
space:
mode:
authorFabian Imhof <fabian.imhof@ost.ch>2024-10-27 13:29:01 +0000
committerFabian Imhof <fabian.imhof@ost.ch>2024-10-27 13:29:01 +0000
commit181f35d20e315947fa3463d6774ca164c6a4bc0d (patch)
tree5ca45fbb92d3ae781296feda29dbed996d605199 /arch/x86_64/src/memory/multiboot
parent1518177efac38961a36db0bc40152d00c38e6281 (diff)
parentbecb1ce0abdaf4e6ad08bb6db7c706dd13a1294b (diff)
downloadteachos-181f35d20e315947fa3463d6774ca164c6a4bc0d.tar.xz
teachos-181f35d20e315947fa3463d6774ca164c6a4bc0d.zip
Merge branch 'feat_memory_manager' of ssh://gitlab.ost.ch:45022/teachos/kernel into feat_memory_manager
Diffstat (limited to 'arch/x86_64/src/memory/multiboot')
-rw-r--r--arch/x86_64/src/memory/multiboot/memory_map.cpp59
1 files changed, 54 insertions, 5 deletions
diff --git a/arch/x86_64/src/memory/multiboot/memory_map.cpp b/arch/x86_64/src/memory/multiboot/memory_map.cpp
index 6b1d1d4..b5e2759 100644
--- a/arch/x86_64/src/memory/multiboot/memory_map.cpp
+++ b/arch/x86_64/src/memory/multiboot/memory_map.cpp
@@ -1,19 +1,24 @@
#include "arch/memory/multiboot/memory_map.hpp"
+#include "arch/exception_handling/assert.hpp"
+
namespace teachos::arch::memory::multiboot
{
- memory_area_iterator::memory_area_iterator(multiboot::memory_area * p)
+ memory_area_iterator::memory_area_iterator(value_type * p)
: ptr(p)
{
- // Nothing to do
+ exception_handling::assert(ptr, "[Memory Area] Attempted to pass nullptr as iterator");
}
- multiboot::memory_area & memory_area_iterator::operator*() const { return *ptr; }
+ auto memory_area_iterator::operator*() const -> value_type & { return *ptr; }
+
+ auto memory_area_iterator::operator->() const -> value_type * { return ptr; }
auto memory_area_iterator::operator++(int) -> memory_area_iterator
{
- ++(*this);
- return *this;
+ memory_area_iterator old_value = *this;
+ ++ptr;
+ return old_value;
}
auto memory_area_iterator::operator++() -> memory_area_iterator &
@@ -21,4 +26,48 @@ namespace teachos::arch::memory::multiboot
++ptr;
return *this;
}
+
+ auto memory_area_iterator::operator+=(difference_type value) -> memory_area_iterator &
+ {
+ ptr += value;
+ return *this;
+ }
+
+ auto memory_area_iterator::operator-=(difference_type value) -> memory_area_iterator &
+ {
+ ptr -= value;
+ return *this;
+ }
+
+ auto memory_area_iterator::operator+(difference_type value) const -> memory_area_iterator
+ {
+ return memory_area_iterator{ptr + value};
+ }
+
+ auto memory_area_iterator::operator-(difference_type value) const -> memory_area_iterator
+ {
+ return memory_area_iterator{ptr - value};
+ }
+
+ auto memory_area_iterator::operator-(const memory_area_iterator & other) const -> difference_type
+ {
+ return ptr - other.ptr;
+ }
+
+ auto memory_area_iterator::operator[](difference_type index) const -> value_type & { return *(ptr + index); }
+
+ memory_area_container::memory_area_container(memory_area * begin, std::size_t size)
+ : area_begin(begin)
+ , area_end(begin + size)
+ {
+ // Nothing to do
+ }
+
+ auto memory_area_container::begin() const -> multiboot::memory_area_iterator { return area_begin; }
+
+ auto memory_area_container::end() const -> multiboot::memory_area_iterator { return area_end; }
+
+ auto memory_area_container::size() const -> size_type { return std::distance(begin(), end()); }
+
+ auto memory_area_container::empty() const -> bool { return size() == 0; }
} // namespace teachos::arch::memory::multiboot