47 lines
919 B
C++

#ifndef STA_RTOS_HANDLE_TPP
#define STA_RTOS_HANDLE_TPP
#ifndef STA_RTOS_HANDLE_HPP
# error "Internal header. Use <sta/rtos/handle.hpp> instead."
#endif // !STA_RTOS_HANDLE_HPP
#include <sta/debug/assert.hpp>
namespace sta
{
template <typename T>
RtosHandle<T>::Deferred::Deferred(handle_type * handlePointer)
: pointer{handlePointer}
{}
template <typename T>
RtosHandle<T>::RtosHandle(handle_type handle)
: handle_{handle}, deferred_{false}
{}
template <typename T>
RtosHandle<T>::RtosHandle(Deferred handle)
: handle_{handle.pointer}, deferred_{true}
{
STA_ASSERT(handle.pointer != nullptr);
}
template <typename T>
typename RtosHandle<T>::handle_type RtosHandle<T>::get()
{
if (deferred_)
{
// Dereference void ** in handle
handle_ = *reinterpret_cast<handle_type *>(handle_);
deferred_ = false;
}
return handle_;
}
} // namespace sta
#endif // STA_RTOS_HANDLE_TPP