Files
pico-examples/hello_world/usb/wrappers/Queue.h
2023-12-08 22:42:15 -06:00

86 lines
2.0 KiB
C++

#ifndef H_97BF73781549459A88697C808E132C22
#define H_97BF73781549459A88697C808E132C22
#include "pico/util/queue.h"
#include <type_traits>
//#include <utility>
template <typename T>
class Queue
{
private:
queue_t queue;
public:
static constexpr bool wrapped = !std::is_pod<T>();
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