#ifndef STA_RTOS_HANDLE_HPP #define STA_RTOS_HANDLE_HPP #include /** * @defgroup STA_RTOS_HANDLE Handle * @ingroup STA_RTOS_API * @brief Helper for managing access to RTOS handles. */ namespace sta { /** * @brief Helper for managing access to RTOS handles. * * @tparam T CMSIS RTOS2 handle type * * @ingroup STA_RTOS_HANDLE */ template class RtosHandle { public: using handle_type = T; /**< Handle type */ // TODO Support integer type with sizeof(T) == sizeof(void *) static_assert(std::is_same::value, "Only compatible with void * handle types"); /** * @brief Helper type for deferred handle evaluation. */ struct Deferred { /// @brief Handle variable address type handle_type * pointer; /** * @brief Construct from handle address. * * @param handlePointer Handle variable address */ Deferred(handle_type * handlePointer); }; public: /** * @brief Construct handle from value. * * @param handle Handle value */ RtosHandle(handle_type handle); /** * @brief Construct handle with deferred evaluation. * * @param handle Handle variable address */ RtosHandle(Deferred handle); /** * @brief Access handle value. * * If the deferred ctor was used the handle value is * evaluated on the first call to this method. * * @return Handle value */ handle_type get(); private: handle_type handle_; /**< Handle value or variable address */ bool deferred_; /**< Is handle evaluation deferred */ }; } // namespace sta #include #endif // STA_RTOS_HANDLE_HPP