From 2185c25f12b39a04f6dba9245dbda2f5c41e5eba Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 8 Dec 2023 22:42:15 -0600 Subject: [PATCH] added Queue.h --- hello_world/usb/wrappers/Queue.h | 85 ++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 hello_world/usb/wrappers/Queue.h diff --git a/hello_world/usb/wrappers/Queue.h b/hello_world/usb/wrappers/Queue.h new file mode 100644 index 0000000..ef629e5 --- /dev/null +++ b/hello_world/usb/wrappers/Queue.h @@ -0,0 +1,85 @@ +#ifndef H_97BF73781549459A88697C808E132C22 +#define H_97BF73781549459A88697C808E132C22 + +#include "pico/util/queue.h" +#include +//#include + +template +class Queue +{ + private: + queue_t queue; + + public: + static constexpr bool wrapped = !std::is_pod(); + Queue(uint size) + { + if constexpr (wrapped) + { + queue_init(&queue, sizeof(T*), size); + } + else + { + queue_init(&queue, sizeof(T), size); + } + } + bool try_add(T *item) + { + if constexpr (wrapped) + { + T* temp = new T(*item); + return queue_try_add(&queue, &temp); + } + else + { + return queue_try_add(&queue, item); + } + } + void blocking_add(T* item) + { + if constexpr (wrapped) + { + T* temp = new T(*item); + queue_add_blocking(&queue, &temp); + } + else + { + queue_add_blocking(&queue, item); + } + } + bool try_remove(T* item) + { + if constexpr (wrapped) + { + T** temp; + bool success = queue_try_remove(&queue, temp); + if (success) + *item = **temp; + return success; + } + else + { + return queue_try_remove(&queue, item); + } + } + void blocking_remove(T* item) + { + if constexpr (wrapped) + { + T** temp; + queue_remove_blocking(&queue, temp); + *item = **temp; + } + else + { + queue_remove_blocking(&queue, item); + } + } + ~Queue() + { + queue_free(&queue); + } +}; + +#endif //H_97BF73781549459A88697C808E132C22