Merge pull request 'FIFO is StaticFIFO now, new FIFO using vector' (#127) from KSat/fsfw:mueller_FIFO_static_normal into master
Reviewed-on: fsfw/fsfw#127
This commit is contained in:
commit
b3d08cd40b
42
container/DynamicFIFO.h
Normal file
42
container/DynamicFIFO.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#ifndef FSFW_CONTAINER_DYNAMICFIFO_H_
|
||||||
|
#define FSFW_CONTAINER_DYNAMICFIFO_H_
|
||||||
|
|
||||||
|
#include "FIFOBase.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Simple First-In-First-Out data structure. The maximum size
|
||||||
|
* can be set in the constructor.
|
||||||
|
* @details
|
||||||
|
* The maximum capacity can be determined at run-time, so this container
|
||||||
|
* performs dynamic memory allocation!
|
||||||
|
* The public interface of FIFOBase exposes the user interface for the FIFO.
|
||||||
|
* @tparam T Entry Type
|
||||||
|
* @tparam capacity Maximum capacity
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
class DynamicFIFO: public FIFOBase<T> {
|
||||||
|
public:
|
||||||
|
DynamicFIFO(size_t maxCapacity): FIFOBase<T>(nullptr, maxCapacity),
|
||||||
|
fifoVector(maxCapacity) {
|
||||||
|
// trying to pass the pointer of the uninitialized vector
|
||||||
|
// to the FIFOBase constructor directly lead to a super evil bug.
|
||||||
|
// So we do it like this now.
|
||||||
|
this->setContainer(fifoVector.data());
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Custom copy constructor which prevents setting the
|
||||||
|
* underlying pointer wrong.
|
||||||
|
*/
|
||||||
|
DynamicFIFO(const DynamicFIFO& other): FIFOBase<T>(other),
|
||||||
|
fifoVector(other.maxCapacity) {
|
||||||
|
this->setContainer(fifoVector.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<T> fifoVector;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FSFW_CONTAINER_DYNAMICFIFO_H_ */
|
@ -1,82 +1,35 @@
|
|||||||
#ifndef FIFO_H_
|
#ifndef FSFW_CONTAINER_FIFO_H_
|
||||||
#define FIFO_H_
|
#define FSFW_CONTAINER_FIFO_H_
|
||||||
|
|
||||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
#include "FIFOBase.h"
|
||||||
|
#include <array>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Simple First-In-First-Out data structure
|
* @brief Simple First-In-First-Out data structure with size fixed at
|
||||||
|
* compile time
|
||||||
|
* @details
|
||||||
|
* Performs no dynamic memory allocation.
|
||||||
|
* The public interface of FIFOBase exposes the user interface for the FIFO.
|
||||||
* @tparam T Entry Type
|
* @tparam T Entry Type
|
||||||
* @tparam capacity Maximum capacity
|
* @tparam capacity Maximum capacity
|
||||||
*/
|
*/
|
||||||
template<typename T, uint8_t capacity>
|
template<typename T, size_t capacity>
|
||||||
class FIFO {
|
class FIFO: public FIFOBase<T> {
|
||||||
private:
|
|
||||||
uint8_t readIndex, writeIndex, currentSize;
|
|
||||||
T data[capacity];
|
|
||||||
|
|
||||||
uint8_t next(uint8_t current) {
|
|
||||||
++current;
|
|
||||||
if (current == capacity) {
|
|
||||||
current = 0;
|
|
||||||
}
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
public:
|
public:
|
||||||
FIFO() :
|
FIFO(): FIFOBase<T>(nullptr, capacity) {
|
||||||
readIndex(0), writeIndex(0), currentSize(0) {
|
this->setContainer(fifoArray.data());
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Custom copy constructor to set pointer correctly.
|
||||||
|
* @param other
|
||||||
|
*/
|
||||||
|
FIFO(const FIFO& other): FIFOBase<T>(other) {
|
||||||
|
this->setContainer(fifoArray.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool empty() {
|
private:
|
||||||
return (currentSize == 0);
|
std::array<T, capacity> fifoArray;
|
||||||
}
|
|
||||||
|
|
||||||
bool full() {
|
|
||||||
return (currentSize == capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t size(){
|
|
||||||
return currentSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t insert(T value) {
|
|
||||||
if (full()) {
|
|
||||||
return FULL;
|
|
||||||
} else {
|
|
||||||
data[writeIndex] = value;
|
|
||||||
writeIndex = next(writeIndex);
|
|
||||||
++currentSize;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t retrieve(T *value) {
|
|
||||||
if (empty()) {
|
|
||||||
return EMPTY;
|
|
||||||
} else {
|
|
||||||
*value = data[readIndex];
|
|
||||||
readIndex = next(readIndex);
|
|
||||||
--currentSize;
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t peek(T * value) {
|
|
||||||
if(empty()) {
|
|
||||||
return EMPTY;
|
|
||||||
} else {
|
|
||||||
*value = data[readIndex];
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t pop() {
|
|
||||||
T value;
|
|
||||||
return this->retrieve(&value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::FIFO_CLASS;
|
|
||||||
static const ReturnValue_t FULL = MAKE_RETURN_CODE(1);
|
|
||||||
static const ReturnValue_t EMPTY = MAKE_RETURN_CODE(2);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FIFO_H_ */
|
#endif /* FSFW_CONTAINER_FIFO_H_ */
|
||||||
|
65
container/FIFOBase.h
Normal file
65
container/FIFOBase.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#ifndef FSFW_CONTAINER_FIFOBASE_H_
|
||||||
|
#define FSFW_CONTAINER_FIFOBASE_H_
|
||||||
|
|
||||||
|
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class FIFOBase {
|
||||||
|
public:
|
||||||
|
static const uint8_t INTERFACE_ID = CLASS_ID::FIFO_CLASS;
|
||||||
|
static const ReturnValue_t FULL = MAKE_RETURN_CODE(1);
|
||||||
|
static const ReturnValue_t EMPTY = MAKE_RETURN_CODE(2);
|
||||||
|
|
||||||
|
/** Default ctor, takes pointer to first entry of underlying container
|
||||||
|
* and maximum capacity */
|
||||||
|
FIFOBase(T* values, const size_t maxCapacity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert value into FIFO
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t insert(T value);
|
||||||
|
/**
|
||||||
|
* Retrieve item from FIFO. This removes the item from the FIFO.
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t retrieve(T *value);
|
||||||
|
/**
|
||||||
|
* Retrieve item from FIFO without removing it from FIFO.
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t peek(T * value);
|
||||||
|
/**
|
||||||
|
* Remove item from FIFO.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ReturnValue_t pop();
|
||||||
|
|
||||||
|
bool empty();
|
||||||
|
bool full();
|
||||||
|
size_t size();
|
||||||
|
|
||||||
|
|
||||||
|
size_t getMaxCapacity() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void setContainer(T* data);
|
||||||
|
size_t maxCapacity = 0;
|
||||||
|
|
||||||
|
T* values;
|
||||||
|
|
||||||
|
size_t readIndex = 0;
|
||||||
|
size_t writeIndex = 0;
|
||||||
|
size_t currentSize = 0;
|
||||||
|
|
||||||
|
size_t next(size_t current);
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "FIFOBase.tpp"
|
||||||
|
|
||||||
|
#endif /* FSFW_CONTAINER_FIFOBASE_H_ */
|
87
container/FIFOBase.tpp
Normal file
87
container/FIFOBase.tpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef FSFW_CONTAINER_FIFOBASE_TPP_
|
||||||
|
#define FSFW_CONTAINER_FIFOBASE_TPP_
|
||||||
|
|
||||||
|
#ifndef FSFW_CONTAINER_FIFOBASE_H_
|
||||||
|
#error Include FIFOBase.h before FIFOBase.tpp!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline FIFOBase<T>::FIFOBase(T* values, const size_t maxCapacity):
|
||||||
|
maxCapacity(maxCapacity), values(values){};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ReturnValue_t FIFOBase<T>::insert(T value) {
|
||||||
|
if (full()) {
|
||||||
|
return FULL;
|
||||||
|
} else {
|
||||||
|
values[writeIndex] = value;
|
||||||
|
writeIndex = next(writeIndex);
|
||||||
|
++currentSize;
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ReturnValue_t FIFOBase<T>::retrieve(T* value) {
|
||||||
|
if (empty()) {
|
||||||
|
return EMPTY;
|
||||||
|
} else {
|
||||||
|
*value = values[readIndex];
|
||||||
|
readIndex = next(readIndex);
|
||||||
|
--currentSize;
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ReturnValue_t FIFOBase<T>::peek(T* value) {
|
||||||
|
if(empty()) {
|
||||||
|
return EMPTY;
|
||||||
|
} else {
|
||||||
|
*value = values[readIndex];
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline ReturnValue_t FIFOBase<T>::pop() {
|
||||||
|
T value;
|
||||||
|
return this->retrieve(&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool FIFOBase<T>::empty() {
|
||||||
|
return (currentSize == 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool FIFOBase<T>::full() {
|
||||||
|
return (currentSize == maxCapacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline size_t FIFOBase<T>::size() {
|
||||||
|
return currentSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline size_t FIFOBase<T>::next(size_t current) {
|
||||||
|
++current;
|
||||||
|
if (current == maxCapacity) {
|
||||||
|
current = 0;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline size_t FIFOBase<T>::getMaxCapacity() const {
|
||||||
|
return maxCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void FIFOBase<T>::setContainer(T *data) {
|
||||||
|
this->values = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef FRAMEWORK_TMTCSERVICES_COMMANDINGSERVICEBASE_H_
|
#ifndef FSFW_TMTCSERVICES_COMMANDINGSERVICEBASE_H_
|
||||||
#define FRAMEWORK_TMTCSERVICES_COMMANDINGSERVICEBASE_H_
|
#define FSFW_TMTCSERVICES_COMMANDINGSERVICEBASE_H_
|
||||||
|
|
||||||
#include "../objectmanager/SystemObject.h"
|
#include "../objectmanager/SystemObject.h"
|
||||||
#include "../storagemanager/StorageManagerIF.h"
|
#include "../storagemanager/StorageManagerIF.h"
|
||||||
@ -345,4 +345,4 @@ private:
|
|||||||
void checkTimeout();
|
void checkTimeout();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* COMMANDINGSERVICEBASE_H_ */
|
#endif /* FSFW_TMTCSERVICES_COMMANDINGSERVICEBASE_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user