/** * @file SerialLinkedListAdapter.h * @brief This file defines the SerialLinkedListAdapter class. * @date 22.07.2014 * @author baetz */ #ifndef SERIALLINKEDLISTADAPTER_H_ #define SERIALLINKEDLISTADAPTER_H_ #include #include #include #include //This is where we need the SerializeAdapter! template class SerialLinkedListAdapter: public SinglyLinkedList, public SerializeIF { public: SerialLinkedListAdapter(typename LinkedElement::Iterator start, bool printCount = false) : SinglyLinkedList(start), printCount(printCount) { } SerialLinkedListAdapter(LinkedElement* first, bool printCount = false) : SinglyLinkedList(first), printCount(printCount) { } SerialLinkedListAdapter(bool printCount = false) : SinglyLinkedList(), printCount(printCount) { } virtual ReturnValue_t serialize(uint8_t** buffer, uint32_t* size, const uint32_t max_size, bool bigEndian) const { if (printCount) { count_t mySize = SinglyLinkedList::getSize(); ReturnValue_t result = SerializeAdapter::serialize(&mySize, buffer, size, max_size, bigEndian); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } } return serialize(SinglyLinkedList::start, buffer, size, max_size, bigEndian); } static ReturnValue_t serialize(const LinkedElement* element, uint8_t** buffer, uint32_t* size, const uint32_t max_size, bool bigEndian) { ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; while ((result == HasReturnvaluesIF::RETURN_OK) && (element != NULL)) { result = element->value->serialize(buffer, size, max_size, bigEndian); element = element->getNext(); } return result; } virtual uint32_t getSerializedSize() const { if (printCount) { return SerialLinkedListAdapter::getSerializedSize() + sizeof(count_t); } else { return getSerializedSize(SinglyLinkedList::start); } } static uint32_t getSerializedSize(const LinkedElement *element) { uint32_t size = 0; while (element != NULL) { size += element->value->getSerializedSize(); element = element->getNext(); } return size; } virtual ReturnValue_t deSerialize(const uint8_t** buffer, int32_t* size, bool bigEndian) { return deSerialize(SinglyLinkedList::start, buffer, size, bigEndian); } static ReturnValue_t deSerialize(LinkedElement* element, const uint8_t** buffer, int32_t* size, bool bigEndian) { ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; while ((result == HasReturnvaluesIF::RETURN_OK) && (element != NULL)) { result = element->value->deSerialize(buffer, size, bigEndian); element = element->getNext(); } return result; } bool printCount; }; #endif /* SERIALLINKEDLISTADAPTER_H_ */