From dd38c38ff2ee91cc22114eeb0ff13170204c596f Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Tue, 8 Apr 2014 21:27:35 +0400 Subject: [PATCH] Out of line methods in transfer_listener.hpp --- .../uavcan/transport/transfer_listener.hpp | 148 +++++++++++------- 1 file changed, 89 insertions(+), 59 deletions(-) diff --git a/libuavcan/include/uavcan/transport/transfer_listener.hpp b/libuavcan/include/uavcan/transport/transfer_listener.hpp index d5dbda115a..b59094dfc9 100644 --- a/libuavcan/include/uavcan/transport/transfer_listener.hpp +++ b/libuavcan/include/uavcan/transport/transfer_listener.hpp @@ -135,54 +135,13 @@ class UAVCAN_EXPORT TransferListener : public TransferListenerBase , bufmgr_(bufmgr) { } - bool operator()(const TransferBufferManagerKey& key, const TransferReceiver& value) const - { - if (value.isTimedOut(ts_)) - { - UAVCAN_TRACE("TransferListener", "Timed out receiver: %s", key.toString().c_str()); - /* - * TransferReceivers do not own their buffers - this helps the Map<> container to copy them - * around quickly and safely (using default assignment operator). Downside is that we need to - * destroy the buffers manually. - * Maybe it is not good that the predicate has side effects, but I ran out of better ideas. - */ - bufmgr_.remove(key); - return true; - } - return false; - } + bool operator()(const TransferBufferManagerKey& key, const TransferReceiver& value) const; }; - void cleanup(MonotonicTime ts) - { - receivers_.removeWhere(TimedOutReceiverPredicate(ts, bufmgr_)); - assert(receivers_.isEmpty() ? bufmgr_.isEmpty() : 1); - } + void cleanup(MonotonicTime ts); protected: - void handleFrame(const RxFrame& frame) - { - const TransferBufferManagerKey key(frame.getSrcNodeID(), frame.getTransferType()); - - TransferReceiver* recv = receivers_.access(key); - if (recv == NULL) - { - if (!frame.isFirst()) - { - return; - } - - TransferReceiver new_recv; - recv = receivers_.insert(key, new_recv); - if (recv == NULL) - { - UAVCAN_TRACE("TransferListener", "Receiver registration failed; frame %s", frame.toString().c_str()); - return; - } - } - TransferBufferAccessor tba(bufmgr_, key); - handleReception(*recv, frame, tba); - } + void handleFrame(const RxFrame& frame); public: TransferListener(TransferPerfCounter& perf, const DataTypeDescriptor& data_type, IAllocator& allocator) @@ -236,13 +195,7 @@ private: ExpectedResponseParams response_params_; - void handleFrame(const RxFrame& frame) - { - if (response_params_.match(frame)) - { - BaseType::handleFrame(frame); - } - } + void handleFrame(const RxFrame& frame); public: ServiceResponseTransferListener(TransferPerfCounter& perf, const DataTypeDescriptor& data_type, @@ -250,17 +203,94 @@ public: : BaseType(perf, data_type, allocator) { } - void setExpectedResponseParams(const ExpectedResponseParams& erp) - { - response_params_ = erp; - } + void setExpectedResponseParams(const ExpectedResponseParams& erp); const ExpectedResponseParams& getExpectedResponseParams() const { return response_params_; } - void stopAcceptingAnything() - { - response_params_ = ExpectedResponseParams(); - } + void stopAcceptingAnything(); }; +// ---------------------------------------------------------------------------- + +/* + * TransferListener<>::TimedOutReceiverPredicate + */ +template +bool TransferListener::TimedOutReceiverPredicate::operator() +(const TransferBufferManagerKey& key, const TransferReceiver& value) const +{ + if (value.isTimedOut(ts_)) + { + UAVCAN_TRACE("TransferListener", "Timed out receiver: %s", key.toString().c_str()); + /* + * TransferReceivers do not own their buffers - this helps the Map<> container to copy them + * around quickly and safely (using default assignment operator). Downside is that we need to + * destroy the buffers manually. + * Maybe it is not good that the predicate has side effects, but I ran out of better ideas. + */ + bufmgr_.remove(key); + return true; + } + return false; +} + +/* + * TransferListener<> + */ +template +void TransferListener::cleanup(MonotonicTime ts) +{ + receivers_.removeWhere(TimedOutReceiverPredicate(ts, bufmgr_)); + assert(receivers_.isEmpty() ? bufmgr_.isEmpty() : 1); +} + +template +void TransferListener::handleFrame(const RxFrame& frame) +{ + const TransferBufferManagerKey key(frame.getSrcNodeID(), frame.getTransferType()); + + TransferReceiver* recv = receivers_.access(key); + if (recv == NULL) + { + if (!frame.isFirst()) + { + return; + } + + TransferReceiver new_recv; + recv = receivers_.insert(key, new_recv); + if (recv == NULL) + { + UAVCAN_TRACE("TransferListener", "Receiver registration failed; frame %s", frame.toString().c_str()); + return; + } + } + TransferBufferAccessor tba(bufmgr_, key); + handleReception(*recv, frame, tba); +} + +/* + * ServiceResponseTransferListener<> + */ +template +void ServiceResponseTransferListener::handleFrame(const RxFrame& frame) +{ + if (response_params_.match(frame)) + { + BaseType::handleFrame(frame); + } +} + +template +void ServiceResponseTransferListener::setExpectedResponseParams(const ExpectedResponseParams& erp) +{ + response_params_ = erp; +} + +template +void ServiceResponseTransferListener::stopAcceptingAnything() +{ + response_params_ = ExpectedResponseParams(); +} + }