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

View File

@ -115,7 +115,11 @@ public:
/**
* 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
{
enum { DataTypeMaxByteLen = BitLenToByteLen<DataStruct_::MaxBitLen>::Result };
@ -130,7 +134,7 @@ class UAVCAN_EXPORT TransferListenerInstantiationHelper
#endif
public:
typedef TransferListener<BufferSize, NumStaticBufs, NumStaticReceivers> Type;
typedef TransferListenerTemplate<BufferSize, NumStaticBufs, NumStaticReceivers> Type;
};

View File

@ -23,9 +23,9 @@ namespace uavcan
template <typename ServiceDataType>
class UAVCAN_EXPORT ServiceResponseTransferListenerInstantiationHelper
{
enum { DataTypeMaxByteLen = BitLenToByteLen<ServiceDataType::Response::MaxBitLen>::Result };
public:
typedef ServiceResponseTransferListener<DataTypeMaxByteLen> Type;
public: // so much templating it hurts
typedef typename TransferListenerInstantiationHelper<typename ServiceDataType::Response,
1, 1, ServiceResponseTransferListener>::Type Type;
};
/**

View File

@ -167,15 +167,13 @@ public:
/**
* This class should be derived by callers.
*/
template <unsigned MaxBufSize>
template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
class UAVCAN_EXPORT ServiceResponseTransferListener
#if UAVCAN_TINY
: public TransferListener<MaxBufSize, 0, 0>
#else
: public TransferListener<MaxBufSize, 1, 1>
#endif
: public TransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>
{
public:
typedef TransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers> BaseType;
struct ExpectedResponseParams
{
NodeID src_node_id;
@ -201,8 +199,6 @@ public:
};
private:
typedef TransferListener<MaxBufSize, 1, 1> BaseType;
ExpectedResponseParams response_params_;
void handleFrame(const RxFrame& frame);
@ -225,8 +221,8 @@ public:
/*
* ServiceResponseTransferListener<>
*/
template <unsigned MaxBufSize>
void ServiceResponseTransferListener<MaxBufSize>::handleFrame(const RxFrame& frame)
template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::handleFrame(const RxFrame& frame)
{
if (response_params_.match(frame))
{
@ -234,14 +230,15 @@ void ServiceResponseTransferListener<MaxBufSize>::handleFrame(const RxFrame& fra
}
}
template <unsigned MaxBufSize>
void ServiceResponseTransferListener<MaxBufSize>::setExpectedResponseParams(const ExpectedResponseParams& erp)
template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::setExpectedResponseParams(
const ExpectedResponseParams& erp)
{
response_params_ = erp;
}
template <unsigned MaxBufSize>
void ServiceResponseTransferListener<MaxBufSize>::stopAcceptingAnything()
template <unsigned MaxBufSize, unsigned NumStaticBufs, unsigned NumStaticReceivers>
void ServiceResponseTransferListener<MaxBufSize, NumStaticBufs, NumStaticReceivers>::stopAcceptingAnything()
{
response_params_ = ExpectedResponseParams();
}