/* * Copyright (C) 2014 Pavel Kirienko */ #pragma once #include #include #include namespace uavcan { class UAVCAN_EXPORT IMarshalBuffer : public ITransferBuffer { public: virtual const uint8_t* getDataPtr() const = 0; virtual unsigned getDataLength() const = 0; }; class UAVCAN_EXPORT IMarshalBufferProvider { public: virtual ~IMarshalBufferProvider() { } virtual IMarshalBuffer* getBuffer(unsigned size) = 0; }; template class UAVCAN_EXPORT MarshalBufferProvider : public IMarshalBufferProvider { class Buffer : public IMarshalBuffer { StaticTransferBuffer buf_; virtual int read(unsigned offset, uint8_t* data, unsigned len) const { return buf_.read(offset, data, len); } virtual int write(unsigned offset, const uint8_t* data, unsigned len) { return buf_.write(offset, data, len); } virtual const uint8_t* getDataPtr() const { return buf_.getRawPtr(); } virtual unsigned getDataLength() const { return buf_.getMaxWritePos(); } public: void reset() { buf_.reset(); } }; Buffer buffer_; public: enum { MaxSize = MaxSize_ }; virtual IMarshalBuffer* getBuffer(unsigned size) { if (size > MaxSize) { return NULL; } buffer_.reset(); return &buffer_; } }; }