blob: e30a4c0f5ff33b12ed124e63c5dc58e8dd288ece [file] [log] [blame]
#include <memory>
#include "aos/atom_code/ipc_lib/queue.h"
namespace aos {
namespace internal {
template<typename T>
class queue_free {
public:
queue_free(RawQueue *queue) : queue_(queue) {}
void operator()(const T *message) {
queue_->FreeMessage(static_cast<const void *>(message));
}
private:
RawQueue *const queue_;
};
} // namespace internal
template<typename T>
class unique_message_ptr : public ::std::unique_ptr<T, ::aos::internal::queue_free<T>> {
public:
unique_message_ptr(RawQueue *queue, T *message = NULL)
: ::std::unique_ptr<T, ::aos::internal::queue_free<T>>(message, ::aos::internal::queue_free<T>(queue)) {}
// Perfectly forward this so that the move functionality of ::std::unique_ptr
// works.
template <typename... Args>
unique_message_ptr<T> &operator=(Args &&... args) {
::std::unique_ptr<T, ::aos::internal::queue_free<T>>::operator=(
::std::forward<Args>(args)...);
return *this;
}
};
} // namespace aos