diff --git a/AK/OwnPtr.h b/AK/OwnPtr.h index 1988b7169e..828aca3110 100644 --- a/AK/OwnPtr.h +++ b/AK/OwnPtr.h @@ -66,9 +66,6 @@ public: bool operator!() const { return !m_ptr; } - typedef T* OwnPtr::*UnspecifiedBoolType; - operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::m_ptr : nullptr; } - T* leak_ptr() { T* leakedPtr = m_ptr; @@ -85,6 +82,9 @@ public: T& operator*() { return *m_ptr; } const T& operator*() const { return *m_ptr; } + operator const T*() const { return m_ptr; } + operator T*() { return m_ptr; } + operator bool() { return !!m_ptr; } private: diff --git a/AK/RetainPtr.h b/AK/RetainPtr.h index be92b181f0..b23d070d2e 100644 --- a/AK/RetainPtr.h +++ b/AK/RetainPtr.h @@ -53,6 +53,14 @@ public: return *this; } + template + RetainPtr& operator=(Retained&& other) + { + release_if_not_null(m_ptr); + m_ptr = &other.leak_ref(); + return *this; + } + RetainPtr& operator=(T* ptr) { if (m_ptr != ptr) @@ -90,9 +98,6 @@ public: bool operator!() const { return !m_ptr; } - typedef T* RetainPtr::*UnspecifiedBoolType; - operator UnspecifiedBoolType() const { return m_ptr ? &RetainPtr::m_ptr : nullptr; } - T* leak_ref() { T* leakedPtr = m_ptr; @@ -109,8 +114,20 @@ public: T& operator*() { return *m_ptr; } const T& operator*() const { return *m_ptr; } + operator const T*() const { return m_ptr; } + operator T*() { return m_ptr; } + operator bool() { return !!m_ptr; } + bool operator==(std::nullptr_t) const { return !m_ptr; } + bool operator!=(std::nullptr_t) const { return m_ptr; } + + bool operator==(const RetainPtr& other) const { return m_ptr == other.m_ptr; } + bool operator!=(const RetainPtr& other) const { return m_ptr != other.m_ptr; } + + bool operator==(const T* other) const { return m_ptr == other; } + bool operator!=(const T* other) const { return m_ptr != other; } + bool is_null() const { return !m_ptr; } private: diff --git a/AK/Retained.h b/AK/Retained.h index ebf61bc468..10756d6440 100644 --- a/AK/Retained.h +++ b/AK/Retained.h @@ -107,6 +107,9 @@ public: CALLABLE_WHEN(unconsumed) T& operator*() { ASSERT(m_ptr); return *m_ptr; } CALLABLE_WHEN(unconsumed) const T& operator*() const { ASSERT(m_ptr); return *m_ptr; } + CALLABLE_WHEN(unconsumed) operator T*() { ASSERT(m_ptr); return m_ptr; } + CALLABLE_WHEN(unconsumed) operator const T*() const { ASSERT(m_ptr); return m_ptr; } + private: Retained() { } diff --git a/Applications/VisualBuilder/VBForm.cpp b/Applications/VisualBuilder/VBForm.cpp index bd39bf1174..bedcf849a9 100644 --- a/Applications/VisualBuilder/VBForm.cpp +++ b/Applications/VisualBuilder/VBForm.cpp @@ -81,7 +81,7 @@ void VBForm::second_paint_event(GPaintEvent& event) bool VBForm::is_selected(const VBWidget& widget) const { - return &widget == m_selected_widget.ptr(); + return &widget == m_selected_widget; } VBWidget* VBForm::widget_at(const Point& position) diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index bb481bce2d..811b6071b9 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -336,7 +336,7 @@ KResult VFS::rename(const String& old_path, const String& new_path, Inode& base) if (!new_inode_or_error.is_error()) { auto new_inode = new_inode_or_error.value(); // FIXME: Is this really correct? Check what other systems do. - if (new_inode.ptr() == old_inode.ptr()) + if (new_inode == old_inode) return KSuccess; if (new_inode->is_directory() && !old_inode->is_directory()) return KResult(-EISDIR); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 782e618aba..f10a42624d 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -121,7 +121,7 @@ bool Process::deallocate_region(Region& region) { InterruptDisabler disabler; for (int i = 0; i < m_regions.size(); ++i) { - if (m_regions[i].ptr() == ®ion) { + if (m_regions[i] == ®ion) { MM.unmap_region(region); m_regions.remove(i); return true; diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 06e9ef65ef..3956111d4a 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -142,7 +142,7 @@ auto MemoryManager::ensure_pte(PageDirectory& page_directory, LinearAddress ladd dbgprintf("MM: PDE %u not present (requested for L%x), allocating\n", page_directory_index, laddr.get()); #endif if (page_directory_index == 0) { - ASSERT(&page_directory == m_kernel_page_directory.ptr()); + ASSERT(&page_directory == m_kernel_page_directory); pde.set_page_table_base((dword)m_page_table_zero); pde.set_user_allowed(false); pde.set_present(true); @@ -153,7 +153,7 @@ auto MemoryManager::ensure_pte(PageDirectory& page_directory, LinearAddress ladd #ifdef MM_DEBUG dbgprintf("MM: PD K%x (%s) at P%x allocated page table #%u (for L%x) at P%x\n", &page_directory, - &page_directory == m_kernel_page_directory.ptr() ? "Kernel" : "User", + &page_directory == m_kernel_page_directory ? "Kernel" : "User", page_directory.cr3(), page_directory_index, laddr.get(), diff --git a/Kernel/VM/Region.h b/Kernel/VM/Region.h index 1ddc9b50ef..0f015126ac 100644 --- a/Kernel/VM/Region.h +++ b/Kernel/VM/Region.h @@ -68,7 +68,7 @@ public: void set_page_directory(PageDirectory& page_directory) { - ASSERT(!m_page_directory || m_page_directory.ptr() == &page_directory); + ASSERT(!m_page_directory || m_page_directory == &page_directory); m_page_directory = page_directory; } diff --git a/LibGUI/GAbstractView.cpp b/LibGUI/GAbstractView.cpp index 5c2c704342..3db6b00852 100644 --- a/LibGUI/GAbstractView.cpp +++ b/LibGUI/GAbstractView.cpp @@ -15,7 +15,7 @@ GAbstractView::~GAbstractView() void GAbstractView::set_model(RetainPtr&& model) { - if (model.ptr() == m_model.ptr()) + if (model == m_model) return; if (m_model) m_model->unregister_view(Badge(), *this); diff --git a/LibGUI/GButton.cpp b/LibGUI/GButton.cpp index 409cbcaa3b..534327df78 100644 --- a/LibGUI/GButton.cpp +++ b/LibGUI/GButton.cpp @@ -137,7 +137,7 @@ void GButton::set_action(GAction& action) void GButton::set_icon(RetainPtr&& icon) { - if (m_icon.ptr() == icon.ptr()) + if (m_icon == icon) return; m_icon = move(icon); update(); diff --git a/LibGUI/GLayout.cpp b/LibGUI/GLayout.cpp index 59d3690d1f..93fa45ab9e 100644 --- a/LibGUI/GLayout.cpp +++ b/LibGUI/GLayout.cpp @@ -11,14 +11,14 @@ GLayout::~GLayout() void GLayout::notify_adopted(Badge, GWidget& widget) { - if (m_owner.ptr() == &widget) + if (m_owner == &widget) return; m_owner = widget.make_weak_ptr(); } void GLayout::notify_disowned(Badge, GWidget& widget) { - ASSERT(m_owner.ptr() == &widget); + ASSERT(m_owner == &widget); m_owner.clear(); } @@ -43,7 +43,7 @@ void GLayout::add_widget(GWidget& widget) void GLayout::remove_widget(GWidget& widget) { m_entries.remove_first_matching([&] (auto& entry) { - return entry.widget.ptr() == &widget; + return entry.widget == &widget; }); if (m_owner) m_owner->notify_layout_changed(Badge()); diff --git a/LibGUI/GWidget.cpp b/LibGUI/GWidget.cpp index e4e0756b14..4bc8bb1c8e 100644 --- a/LibGUI/GWidget.cpp +++ b/LibGUI/GWidget.cpp @@ -120,8 +120,6 @@ void GWidget::handle_paint_event(GPaintEvent& event) void GWidget::set_layout(OwnPtr&& layout) { - if (m_layout.ptr() == layout.ptr()) - return; if (m_layout) m_layout->notify_disowned(Badge(), *this); m_layout = move(layout); diff --git a/LibGUI/GWindow.cpp b/LibGUI/GWindow.cpp index 5c94d49eae..f002078987 100644 --- a/LibGUI/GWindow.cpp +++ b/LibGUI/GWindow.cpp @@ -346,14 +346,14 @@ void GWindow::set_focused_widget(GWidget* widget) void GWindow::set_global_cursor_tracking_widget(GWidget* widget) { - if (widget == m_global_cursor_tracking_widget.ptr()) + if (widget == m_global_cursor_tracking_widget) return; m_global_cursor_tracking_widget = widget ? widget->make_weak_ptr() : nullptr; } void GWindow::set_automatic_cursor_tracking_widget(GWidget* widget) { - if (widget == m_automatic_cursor_tracking_widget.ptr()) + if (widget == m_automatic_cursor_tracking_widget) return; m_automatic_cursor_tracking_widget = widget ? widget->make_weak_ptr() : nullptr; } @@ -385,7 +385,7 @@ void GWindow::set_opacity(float opacity) void GWindow::set_hovered_widget(GWidget* widget) { - if (widget == m_hovered_widget.ptr()) + if (widget == m_hovered_widget) return; if (m_hovered_widget) diff --git a/Servers/WindowServer/WSMenu.cpp b/Servers/WindowServer/WSMenu.cpp index ca6df1afff..d9df790e24 100644 --- a/Servers/WindowServer/WSMenu.cpp +++ b/Servers/WindowServer/WSMenu.cpp @@ -92,7 +92,7 @@ void WSMenu::draw() for (auto& item : m_items) { if (item->type() == WSMenuItem::Text) { Color text_color = Color::Black; - if (item.ptr() == m_hovered_item) { + if (item == m_hovered_item) { painter.fill_rect(item->rect(), WSWindowManager::the().menu_selection_color()); text_color = Color::White; } diff --git a/Servers/WindowServer/WSWindowFrame.cpp b/Servers/WindowServer/WSWindowFrame.cpp index bdaf9996d4..01cee16907 100644 --- a/Servers/WindowServer/WSWindowFrame.cpp +++ b/Servers/WindowServer/WSWindowFrame.cpp @@ -146,17 +146,17 @@ void WSWindowFrame::paint(Painter& painter) auto& wm = WSWindowManager::the(); - if (&window == wm.m_highlight_window.ptr()) { + if (&window == wm.m_highlight_window) { border_color = wm.m_highlight_window_border_color; border_color2 = wm.m_highlight_window_border_color2; title_color = wm.m_highlight_window_title_color; middle_border_color = Color::White; - } else if (&window == wm.m_drag_window.ptr()) { + } else if (&window == wm.m_drag_window) { border_color = wm.m_dragging_window_border_color; border_color2 = wm.m_dragging_window_border_color2; title_color = wm.m_dragging_window_title_color; middle_border_color = Color::from_rgb(0xf9b36a); - } else if (&window == wm.m_active_window.ptr()) { + } else if (&window == wm.m_active_window) { border_color = wm.m_active_window_border_color; border_color2 = wm.m_active_window_border_color2; title_color = wm.m_active_window_title_color; diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index cfb07e3ad7..54e367d542 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -1010,7 +1010,7 @@ void WSWindowManager::on_message(const WSMessage& message) void WSWindowManager::set_highlight_window(WSWindow* window) { - if (window == m_highlight_window.ptr()) + if (window == m_highlight_window) return; if (auto* previous_highlight_window = m_highlight_window.ptr()) invalidate(*previous_highlight_window); @@ -1029,7 +1029,7 @@ void WSWindowManager::set_active_window(WSWindow* window) return; } - if (window == m_active_window.ptr()) + if (window == m_active_window) return; auto* previously_active_window = m_active_window.ptr(); @@ -1053,7 +1053,7 @@ void WSWindowManager::set_active_window(WSWindow* window) void WSWindowManager::set_hovered_window(WSWindow* window) { - if (m_hovered_window.ptr() == window) + if (m_hovered_window == window) return; if (m_hovered_window) diff --git a/Servers/WindowServer/WSWindowManager.h b/Servers/WindowServer/WSWindowManager.h index cf5b2a33de..26d35362f9 100644 --- a/Servers/WindowServer/WSWindowManager.h +++ b/Servers/WindowServer/WSWindowManager.h @@ -234,7 +234,7 @@ IterationDecision WSWindowManager::for_each_visible_window_of_type_from_back_to_ continue; if (window->type() != type) continue; - if (m_highlight_window.ptr() == window) { + if (m_highlight_window == window) { do_highlight_window_at_end = true; continue; } @@ -277,7 +277,7 @@ IterationDecision WSWindowManager::for_each_visible_window_of_type_from_front_to continue; if (window->type() != type) continue; - if (window == m_highlight_window.ptr()) + if (window == m_highlight_window) continue; if (callback(*window) == IterationDecision::Abort) return IterationDecision::Abort;