#ifndef OSDEV_COMPONENTS_MQTT_SCOPEGUARD_H #define OSDEV_COMPONENTS_MQTT_SCOPEGUARD_H // std #include #include "macrodefs.h" #include "utils.h" #define OSDEV_COMPONENTS_SCOPEGUARD(variableName, ...) \ osdev::components::mqtt::ScopeGuard OSDEV_COMPONENTS_COMBINE(Scope__Guard__##variableName##__, __LINE__)(__VA_ARGS__); \ osdev::components::mqtt::apply_unused_parameters(OSDEV_COMPONENTS_COMBINE(Scope__Guard__##variableName##__, __LINE__)); namespace osdev { namespace components { namespace mqtt { using CleanUpFunction = std::function; /** * @brief Ensures that a cleanup function is called at the end of the current scope. */ class ScopeGuard { public: /** * @brief Constructs an empty scopeguard. * The scopeguard can be set by moving another ScopeGuard into this one. */ ScopeGuard(); /** * @brief Constructs a RAII instance that will call cleanupFunc in it's destructor. * @param cleanupFunc The cleanup function to call at the end of the current scope. * This cleanup function must not throw exceptions. If it does, the behavior is undefined. */ ScopeGuard(const CleanUpFunction& cleanupFunc); // Movable, not copyable ScopeGuard(const ScopeGuard&) = delete; ScopeGuard& operator=(const ScopeGuard&) = delete; ScopeGuard(ScopeGuard&&) = default; ScopeGuard& operator=(ScopeGuard&&) = default; ~ScopeGuard() noexcept; private: CleanUpFunction m_cleanupFunc; }; } // End namespace mqtt } // End namespace components } // End namespace osdev #endif // OSDEV_COMPONENTS_MQTT_SCOPEGUARD_H