Fixed template instantiation of ServiceResponseTransferListener<>

This commit is contained in:
Pavel Kirienko
2015-04-21 21:51:21 +03:00
parent 78e2351df5
commit 2dbf8cd432
3 changed files with 20 additions and 19 deletions
@@ -115,7 +115,11 @@ public:
/** /**
* This helper class does some compile-time magic on the transport layer machinery. For authorized personnel only. * This helper class does some compile-time magic on the transport layer machinery. For authorized personnel only.
*/ */
template <typename DataStruct_, unsigned NumStaticReceivers_, unsigned NumStaticBufs_> template <typename DataStruct_,
unsigned NumStaticReceivers_,
unsigned NumStaticBufs_,
template<unsigned, unsigned, unsigned> class TransferListenerTemplate = TransferListener
>
class UAVCAN_EXPORT TransferListenerInstantiationHelper class UAVCAN_EXPORT TransferListenerInstantiationHelper
{ {
enum { DataTypeMaxByteLen = BitLenToByteLen<DataStruct_::MaxBitLen>::Result }; enum { DataTypeMaxByteLen = BitLenToByteLen<DataStruct_::MaxBitLen>::Result };
@@ -130,7 +134,7 @@ class UAVCAN_EXPORT TransferListenerInstantiationHelper
#endif #endif
public: public:
typedef TransferListener<BufferSize, NumStaticBufs, NumStaticReceivers> Type; typedef TransferListenerTemplate<BufferSize, NumStaticBufs, NumStaticReceivers> Type;
}; };
@@ -23,9 +23,9 @@ namespace uavcan
template <typename ServiceDataType> template <typename ServiceDataType>
class UAVCAN_EXPORT ServiceResponseTransferListenerInstantiationHelper class UAVCAN_EXPORT ServiceResponseTransferListenerInstantiationHelper
{ {
enum { DataTypeMaxByteLen = BitLenToByteLen<ServiceDataType::Response::MaxBitLen>::Result }; public: // so much templating it hurts
public: typedef typename TransferListenerInstantiationHelper<typename ServiceDataType::Response,
typedef ServiceResponseTransferListener<DataTypeMaxByteLen> Type; 1, 1, ServiceResponseTransferListener>::Type Type;
}; };
/** /**
@@ -167,15 +167,13 @@ public:
/** /**
* This class should be derived by callers. * This class should be derived by callers.
*/ */
template <unsigned MaxBufSize> template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
class UAVCAN_EXPORT ServiceResponseTransferListener class UAVCAN_EXPORT ServiceResponseTransferListener
#if UAVCAN_TINY : public TransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>
: public TransferListener<MaxBufSize, 0, 0>
#else
: public TransferListener<MaxBufSize, 1, 1>
#endif
{ {
public: public:
typedef TransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers> BaseType;
struct ExpectedResponseParams struct ExpectedResponseParams
{ {
NodeID src_node_id; NodeID src_node_id;
@@ -201,8 +199,6 @@ public:
}; };
private: private:
typedef TransferListener<MaxBufSize, 1, 1> BaseType;
ExpectedResponseParams response_params_; ExpectedResponseParams response_params_;
void handleFrame(const RxFrame& frame); void handleFrame(const RxFrame& frame);
@@ -225,8 +221,8 @@ public:
/* /*
* ServiceResponseTransferListener<> * ServiceResponseTransferListener<>
*/ */
template <unsigned MaxBufSize> template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize>::handleFrame(const RxFrame& frame) void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::handleFrame(const RxFrame& frame)
{ {
if (response_params_.match(frame)) if (response_params_.match(frame))
{ {
@@ -234,14 +230,15 @@ void ServiceResponseTransferListener<MaxBufSize>::handleFrame(const RxFrame& fra
} }
} }
template <unsigned MaxBufSize> template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize>::setExpectedResponseParams(const ExpectedResponseParams& erp) void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::setExpectedResponseParams(
const ExpectedResponseParams& erp)
{ {
response_params_ = erp; response_params_ = erp;
} }
template <unsigned MaxBufSize> template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize>::stopAcceptingAnything() void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::stopAcceptingAnything()
{ {
response_params_ = ExpectedResponseParams(); response_params_ = ExpectedResponseParams();
} }