#pragma once #include namespace mlx { template CallOnExit::CallOnExit(F&& functor) : m_functor(std::move(functor)) {} template CallOnExit::~CallOnExit() { if(m_functor.has_value()) (*m_functor)(); } template void CallOnExit::CallAndReset() { if(m_functor.has_value()) (*m_functor)(); m_functor.reset(); } template void CallOnExit::Reset() { m_functor.reset(); } }