From f304d049d18cece2ec67813250c08ae5a987c2e3 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Mon, 10 Mar 2025 13:25:09 +0100 Subject: [PATCH] testing usage of linkedlists for cbor decoder singleton --- src/cbor/MessageDecoder.cpp | 32 +++++++++++++++++++++----------- src/cbor/MessageDecoder.h | 8 ++++++-- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/cbor/MessageDecoder.cpp b/src/cbor/MessageDecoder.cpp index ae630cd..c912903 100644 --- a/src/cbor/MessageDecoder.cpp +++ b/src/cbor/MessageDecoder.cpp @@ -31,21 +31,21 @@ MessageDecoder::Status CBORMessageDecoderSingleton::decode(Message* msg, const u return MessageDecoder::Status::Error; } - auto decoder_it = decoders.begin(); + struct llnode* decoder_it = decoders; - for(; decoder_it != decoders.end(); decoder_it++) { - if(decoder_it->first == tag) { + for(; decoder_it != nullptr; decoder_it = decoder_it->next) { + if(decoder_it->tag == tag) { break; } } // check if message.id exists on the decoders list or return error - if(decoder_it == decoders.end()) { + if(decoder_it == nullptr) { return MessageDecoder::Status::Error; } // encode the message - if(decoder_it->second->_decode(&iter, msg) == MessageDecoder::Status::Error) { + if(decoder_it->decoder->_decode(&iter, msg) == MessageDecoder::Status::Error) { return MessageDecoder::Status::Error; } @@ -59,17 +59,27 @@ CBORMessageDecoderSingleton& CBORMessageDecoderSingleton::getInstance() { } void CBORMessageDecoderSingleton::append(CBORTag tag, CBORMessageDecoderInterface* decoder) { - auto decoder_it = decoders.begin(); + struct llnode* decoder_it = decoders; - for(; decoder_it != decoders.end(); decoder_it++) { - if(decoder_it->first == tag) { + for(; decoder_it != nullptr; decoder_it = decoder_it->next) { + if(decoder_it->tag == tag) { return; } } - decoders.push_back( - std::make_pair(tag, decoder) - ); + struct llnode* next = new llnode; + + next->tag = tag; + next->decoder = decoder; + + // this is the first element + if(decoders == nullptr) { + decoders = next; + } else { + decoders_last->next = next; + } + + decoders_last = next; } CBORMessageDecoderInterface::CBORMessageDecoderInterface(const CBORTag tag, const MessageId id) diff --git a/src/cbor/MessageDecoder.h b/src/cbor/MessageDecoder.h index 1a9bf58..a722f0e 100644 --- a/src/cbor/MessageDecoder.h +++ b/src/cbor/MessageDecoder.h @@ -107,9 +107,13 @@ class CBORMessageDecoderSingleton: public MessageDecoder { */ MessageDecoder::Status decode(Message* msg, const uint8_t* const buf, size_t &len); private: - CBORMessageDecoderSingleton() {} + CBORMessageDecoderSingleton(): decoders(nullptr), decoders_last(nullptr) { } - std::vector> decoders; + struct llnode { + struct llnode* next; + CBORTag tag; + CBORMessageDecoderInterface* decoder; + } *decoders, *decoders_last; }; /**