added Queue.h
This commit is contained in:
85
hello_world/usb/wrappers/Queue.h
Normal file
85
hello_world/usb/wrappers/Queue.h
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#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
|
||||||
Reference in New Issue
Block a user