sitara_depot/components/free_rtos/ethernet_industry/eth_ecat_queue.hpp

123 lines
2.2 KiB
C++

/*
* eth_ecat_queue.hpp
*
* Created on: Jun 2, 2023
* Author: algin
*/
#ifndef FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_QUEUE_HPP_
#define FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_QUEUE_HPP_
#include <atomic>
namespace free_rtos {
namespace queue {
template<typename DataType>
class Queue;
template<typename DataType>
class QueueEntity {
public:
QueueEntity(DataType *data)
: data_{data} { }
DataType* get_data() {
return data_;
}
QueueEntity* get_next() {
return next_;
}
void set_next(QueueEntity &next) {
next_ = &next;
}
private:
DataType *data_{nullptr};
QueueEntity *next_{nullptr};
};
template<typename DataType>
class Queue {
public:
Queue() { }
explicit Queue(QueueEntity<DataType>& first)
: first_{&first}
, last_{&first} { }
Queue(QueueEntity<DataType>& first, QueueEntity<DataType>& next)
: first_{&first}
, last_{&next} {
first.set_next(next);
}
QueueEntity<DataType>* get_first() {
return first_;
}
QueueEntity<DataType>* get_last() {
return last_;
}
size_t get_size() {
return size_;
}
Queue& operator+(QueueEntity<DataType>& next) {
return append(&next);
}
Queue& operator+(DataType& data) {
return append(&data.get_queue_entity());
}
Queue& operator+(Queue& other) {
return append(other.get_first(), other.get_last(), other.get_size());
}
bool empty() {
return (first_ == nullptr);
}
void clear() {
first_ = nullptr;
last_ = nullptr;
size_ = 0;
}
private:
QueueEntity<DataType> *first_{nullptr};
QueueEntity<DataType> *last_{nullptr};
size_t size_{0};
Queue& append(QueueEntity<DataType> *other_first, QueueEntity<DataType> *other_last = nullptr, size_t other_size = 1) {
if(first_ == nullptr) {
first_ = other_first;
}
if(last_ != nullptr) {
last_->set_next(*other_first);
}
if(other_last == nullptr) {
last_ = other_first;
}else{
last_ = other_last;
}
size_ += other_size;
return *this;
}
};
}
}
#endif /* FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_QUEUE_HPP_ */