blob: e30a4c0f5ff33b12ed124e63c5dc58e8dd288ece [file] [log] [blame]
Brian Silverman9d0a90a2014-01-01 17:35:59 -08001#include <memory>
2
3#include "aos/atom_code/ipc_lib/queue.h"
4
5namespace aos {
6namespace internal {
7
8template<typename T>
9class queue_free {
10 public:
11 queue_free(RawQueue *queue) : queue_(queue) {}
12
13 void operator()(const T *message) {
14 queue_->FreeMessage(static_cast<const void *>(message));
15 }
16
17 private:
18 RawQueue *const queue_;
19};
20
21} // namespace internal
22
23template<typename T>
24class unique_message_ptr : public ::std::unique_ptr<T, ::aos::internal::queue_free<T>> {
25 public:
26 unique_message_ptr(RawQueue *queue, T *message = NULL)
27 : ::std::unique_ptr<T, ::aos::internal::queue_free<T>>(message, ::aos::internal::queue_free<T>(queue)) {}
28
29 // Perfectly forward this so that the move functionality of ::std::unique_ptr
30 // works.
31 template <typename... Args>
32 unique_message_ptr<T> &operator=(Args &&... args) {
33 ::std::unique_ptr<T, ::aos::internal::queue_free<T>>::operator=(
34 ::std::forward<Args>(args)...);
35 return *this;
36 }
37};
38
39} // namespace aos