fsfw/datapool/PoolEntry.cpp

95 lines
2.4 KiB
C++
Raw Normal View History

2020-08-13 20:53:35 +02:00
#include "PoolEntry.h"
2020-09-06 15:23:38 +02:00
2020-08-13 20:53:35 +02:00
#include "../serviceinterface/ServiceInterfaceStream.h"
#include "../globalfunctions/arrayprinter.h"
2020-06-05 13:43:06 +02:00
#include <cstring>
template <typename T>
2020-06-05 13:43:06 +02:00
PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, uint8_t setLength,
bool setValid ) : length(setLength), valid(setValid) {
this->address = new T[this->length];
2020-05-08 14:38:10 +02:00
if(initValue.size() == 0) {
2020-06-05 13:43:06 +02:00
std::memset(this->address, 0, this->getByteSize());
}
else if (initValue.size() != setLength){
#if CPP_OSTREAM_ENABLED == 1
2020-06-05 13:43:06 +02:00
sif::warning << "PoolEntry: setLength is not equal to initializer list"
"length! Performing zero initialization with given setLength"
<< std::endl;
#endif
2020-06-05 13:43:06 +02:00
std::memset(this->address, 0, this->getByteSize());
2020-05-08 14:38:10 +02:00
}
else {
2020-06-05 13:43:06 +02:00
std::copy(initValue.begin(), initValue.end(), this->address);
2020-05-08 14:38:10 +02:00
}
}
template <typename T>
2020-06-05 13:43:06 +02:00
PoolEntry<T>::PoolEntry( T* initValue, uint8_t setLength, bool setValid ) :
length(setLength), valid(setValid) {
2020-05-08 14:38:10 +02:00
this->address = new T[this->length];
if (initValue != nullptr) {
2020-06-05 13:43:06 +02:00
std::memcpy(this->address, initValue, this->getByteSize() );
} else {
2020-06-05 13:43:06 +02:00
std::memset(this->address, 0, this->getByteSize() );
}
}
//As the data pool is global, this dtor is only be called on program exit.
//Warning! Never copy pool entries!
template <typename T>
PoolEntry<T>::~PoolEntry() {
delete[] this->address;
}
template <typename T>
uint16_t PoolEntry<T>::getByteSize() {
return ( sizeof(T) * this->length );
}
template <typename T>
uint8_t PoolEntry<T>::getSize() {
return this->length;
}
template <typename T>
void* PoolEntry<T>::getRawData() {
return this->address;
}
template <typename T>
2020-06-05 13:43:06 +02:00
void PoolEntry<T>::setValid(bool isValid) {
this->valid = isValid;
}
template <typename T>
2020-06-05 13:43:06 +02:00
bool PoolEntry<T>::getValid() {
return valid;
}
template <typename T>
void PoolEntry<T>::print() {
#if CPP_OSTREAM_ENABLED == 1
2020-06-05 13:43:06 +02:00
sif::debug << "Pool Entry Validity: " <<
(this->valid? " (valid) " : " (invalid) ") << std::endl;
#endif
2020-07-07 13:24:04 +02:00
arrayprinter::print(reinterpret_cast<uint8_t*>(address), length);
#if CPP_OSTREAM_ENABLED == 1
sif::debug << std::dec << std::endl;
#endif
}
template<typename T>
Type PoolEntry<T>::getType() {
return PodTypeConversion<T>::type;
}
template class PoolEntry<uint8_t>;
template class PoolEntry<uint16_t>;
template class PoolEntry<uint32_t>;
template class PoolEntry<int8_t>;
template class PoolEntry<int16_t>;
template class PoolEntry<int32_t>;
template class PoolEntry<float>;
template class PoolEntry<double>;