aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/allocator
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory/allocator')
-rw-r--r--arch/x86_64/src/memory/allocator/area_frame_allocator.cpp2
-rw-r--r--arch/x86_64/src/memory/allocator/physical_frame.cpp123
2 files changed, 124 insertions, 1 deletions
diff --git a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
index 1e87147..5d56a2a 100644
--- a/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
+++ b/arch/x86_64/src/memory/allocator/area_frame_allocator.cpp
@@ -8,7 +8,7 @@
namespace teachos::arch::memory::allocator
{
- area_frame_allocator::area_frame_allocator(multiboot::memory_information mem_info)
+ area_frame_allocator::area_frame_allocator(multiboot::memory_information const & mem_info)
: next_free_frame(0U)
, current_area(std::nullopt)
, memory_areas(mem_info.begin_area, mem_info.end_area)
diff --git a/arch/x86_64/src/memory/allocator/physical_frame.cpp b/arch/x86_64/src/memory/allocator/physical_frame.cpp
index bef9322..9307602 100644
--- a/arch/x86_64/src/memory/allocator/physical_frame.cpp
+++ b/arch/x86_64/src/memory/allocator/physical_frame.cpp
@@ -14,4 +14,127 @@ namespace teachos::arch::memory::allocator
}
auto physical_frame::start_address() const -> physical_address { return frame_number * PAGE_FRAME_SIZE; }
+
+ /**
+ * @brief Constructor.
+ *
+ * @param value Underlying value the iterator should point too
+ */
+ physical_frame_iterator::physical_frame_iterator(physical_frame_iterator::value_type value)
+ : value(value)
+ {
+ // Nothing to do
+ }
+
+ /**
+ * @brief Dereferences the initally given pointer to its value.
+ *
+ * @return Reference to the value.
+ */
+ auto physical_frame_iterator::operator*() -> physical_frame_iterator::value_type & { return value; }
+
+ /**
+ * @brief Get underlying value, which is the intially passed pointer.
+ *
+ * @return Underlying value passed intially.
+ */
+ auto physical_frame_iterator::operator->() -> physical_frame_iterator::value_type * { return &value; }
+
+ /**
+ * @brief Post increment operator. Returns a copy of the value.
+ *
+ * @return Copy of the incremented underlying address.
+ */
+ auto physical_frame_iterator::operator++(int) -> physical_frame_iterator
+ {
+ physical_frame_iterator const old_value = *this;
+ ++value.frame_number;
+ return old_value;
+ }
+
+ /**
+ * @brief Pre increment operator. Returns a reference to the changed value.
+ *
+ * @return Reference to the incremented underlying address.
+ */
+ auto physical_frame_iterator::operator++() -> physical_frame_iterator &
+ {
+ ++value.frame_number;
+ return *this;
+ }
+
+ /**
+ * @brief Addition assignment operator. Returns a reference to the changed value.
+ *
+ * @param operand Value we want to add to the underlying address.
+ * @return Reference to the changed underlying address.
+ */
+ auto
+ physical_frame_iterator::operator+=(physical_frame_iterator::difference_type operand) -> physical_frame_iterator &
+ {
+ value.frame_number += operand;
+ return *this;
+ }
+
+ /**
+ * @brief Subtraction assignment operator. Returns a reference to the changed value.
+ *
+ * @param operand Value we want to subtract from the underlying address.
+ * @return Reference to the changed underlying address.
+ */
+ auto
+ physical_frame_iterator::operator-=(physical_frame_iterator::difference_type operand) -> physical_frame_iterator &
+ {
+ value.frame_number -= operand;
+ return *this;
+ }
+
+ /**
+ * @brief Addition operator. Returns the changed value.
+ *
+ * @param operand Value we want to add to a copy of the underlying address.
+ * @return Copy of underlying address incremented by the given value.
+ */
+ auto
+ physical_frame_iterator::operator+(physical_frame_iterator::difference_type operand) const -> physical_frame_iterator
+ {
+ return physical_frame_iterator{physical_frame_iterator::value_type{value.frame_number + operand}};
+ }
+
+ /**
+ * @brief Subtraction operator. Returns the changed value.
+ *
+ * @param operand Value we want to subtrcat from a copy of the underlying address.
+ * @return Copy of underlying address decremented by the given value.
+ */
+ auto
+ physical_frame_iterator::operator-(physical_frame_iterator::difference_type operand) const -> physical_frame_iterator
+ {
+ return physical_frame_iterator{physical_frame_iterator::value_type{value.frame_number - operand}};
+ }
+
+ /**
+ * @brief Subtraction operator. Returns the size difference between two iterators.
+ *
+ * @param other Other iterator we want to substract the underlying address with ours.
+ * @return Size difference between the underlying address of this instance and the given iterator.
+ */
+ auto physical_frame_iterator::operator-(const physical_frame_iterator & other) const
+ -> physical_frame_iterator::difference_type
+ {
+ return value.frame_number - other.value.frame_number;
+ }
+
+ /**
+ * @brief Index operator overload. Returns a reference to the value at the given index. Simply returns the
+ * dereferenced underlying pointer incremented by the given index.
+ *
+ * @param index Index we want to access and get the value from.
+ * @return Reference to the value at the given index.
+ */
+ auto physical_frame_iterator::operator[](physical_frame_iterator::difference_type index) const
+ -> physical_frame_iterator::value_type
+ {
+ return physical_frame_iterator::value_type{value.frame_number + index};
+ }
} // namespace teachos::arch::memory::allocator