00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RAUL_EVENT_RING_BUFFER_HPP
00019 #define RAUL_EVENT_RING_BUFFER_HPP
00020
00021 #include <cassert>
00022 #include <algorithm>
00023 #include "raul/RingBuffer.hpp"
00024 #include "raul/TimeStamp.hpp"
00025
00026 namespace Raul {
00027
00028
00035 class EventRingBuffer : private Raul::RingBuffer {
00036 public:
00037
00040 explicit EventRingBuffer(size_t capacity)
00041 : RingBuffer(capacity)
00042 {}
00043
00044 size_t capacity() const { return _size; }
00045
00046 size_t write(TimeStamp time, size_t size, const uint8_t* buf);
00047 bool read(TimeStamp* time, size_t* size, uint8_t* buf);
00048 };
00049
00050
00051 inline bool
00052 EventRingBuffer::read(TimeStamp* time, size_t* size, uint8_t* buf)
00053 {
00054 bool success = RingBuffer::full_read(sizeof(TimeStamp), (uint8_t*)time);
00055 if (success)
00056 success = RingBuffer::full_read(sizeof(size_t), (uint8_t*)size);
00057 if (success)
00058 success = RingBuffer::full_read(*size, buf);
00059
00060 return success;
00061 }
00062
00063
00064 inline size_t
00065 EventRingBuffer::write(TimeStamp time, size_t size, const uint8_t* buf)
00066 {
00067 assert(size > 0);
00068
00069 if (write_space() < (sizeof(TimeStamp) + sizeof(size_t) + size)) {
00070 return 0;
00071 } else {
00072 RingBuffer::write(sizeof(TimeStamp), (uint8_t*)&time);
00073 RingBuffer::write(sizeof(size_t), (uint8_t*)&size);
00074 RingBuffer::write(size, buf);
00075 return size;
00076 }
00077 }
00078
00079
00080 }
00081
00082 #endif // RAUL_EVENT_RING_BUFFER_HPP
00083