diff --git a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp index b2f39faa2e..3fb166bf6a 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp @@ -335,7 +335,11 @@ class TransferBufferManager : public ITransferBufferManager, Noncopyable public: TransferBufferManager(IAllocator* allocator) : allocator_(allocator) - { } + { + assert(allocator); + StaticAssert<(MAX_BUF_SIZE > 0)>::check(); + StaticAssert<(NUM_STATIC_BUFS > 0)>::check(); + } ~TransferBufferManager() { @@ -425,4 +429,31 @@ public: } }; +template <> +class TransferBufferManager<0, 0> : public ITransferBufferManager +{ +public: + TransferBufferManager(IAllocator* allocator) + { + (void)allocator; + } + + TransferBufferBase* access(const TransferBufferManagerKey& key) + { + (void)key; + return NULL; + } + + TransferBufferBase* create(const TransferBufferManagerKey& key) + { + (void)key; + return NULL; + } + + void remove(const TransferBufferManagerKey& key) + { + (void)key; + } +}; + } diff --git a/libuavcan/test/transport/transfer_buffer.cpp b/libuavcan/test/transport/transfer_buffer.cpp index 6107fb783e..8c9e1278c7 100644 --- a/libuavcan/test/transport/transfer_buffer.cpp +++ b/libuavcan/test/transport/transfer_buffer.cpp @@ -338,3 +338,11 @@ TEST(TransferBufferManager, Basic) mgr.reset(); ASSERT_EQ(0, pool.getNumUsedBlocks()); } + + +TEST(TransferBufferManager, EmptySpecialization) +{ + uavcan::TransferBufferManager<0, 0> mgr(NULL); + (void)mgr; + ASSERT_GE(sizeof(void*), sizeof(mgr)); +}