#pragma once #include namespace mlx { template NonOwningPtr::NonOwningPtr(T* ptr) : p_ptr(ptr) {} template NonOwningPtr::NonOwningPtr(NonOwningPtr&& ptr) noexcept : p_ptr(ptr.p_ptr) { ptr.p_ptr = nullptr; } template NonOwningPtr& NonOwningPtr::operator=(T* ptr) { p_ptr = ptr; return *this; } template NonOwningPtr& NonOwningPtr::operator=(NonOwningPtr&& ptr) noexcept { p_ptr = ptr.p_ptr; ptr.p_ptr = nullptr; return *this; } template NonOwningPtr::operator bool() const noexcept { return p_ptr != nullptr; } template T* NonOwningPtr::Get() const noexcept { return p_ptr; } template T* NonOwningPtr::operator->() const noexcept { return p_ptr; } template T& NonOwningPtr::operator*() const noexcept { return *p_ptr; } }