roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
ringbuffer.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstring>
4#include <memory>
5
6#include "roo_io/base/byte.h"
7
8namespace roo_io {
9
11 public:
13 : buf_(new byte[capacity]), capacity_(capacity), head_(0), used_(0) {}
14
15 size_t capacity() const { return capacity_; }
16 size_t used() const { return used_; }
17 size_t free() const { return capacity_ - used_; }
18
19 bool full() const { return used_ == capacity_; }
20 bool empty() const { return used_ == 0; }
21
22 void clear() {
23 head_ = 0;
24 used_ = 0;
25 }
26
27 // Writes up to 'len' bytes, but no more than the current value of free(), to
28 // the ringbuffer. Returns the count of bytes written.
29 size_t write(const byte* data, size_t len) {
30 size_t maxlen = free();
31 if (len > maxlen) len = maxlen;
32 if (len == 0) return 0;
33 size_t pos = write_pos();
34 size_t split = capacity_ - pos;
35 if (len < split) {
36 // Fits; just write and return.
37 memcpy(&buf_[pos], data, len);
38 } else {
39 // Break into two pieces.
40 memcpy(&buf_[pos], data, split);
41 memcpy(&buf_[0], data + split, len - split);
42 }
43 used_ += len;
44 return len;
45 }
46
47 // Writes a single byte to the ringbuffer. Returns true if successful, or
48 // false if the buffer is full.
49 bool write(byte b) {
50 if (used_ == capacity_) return false;
51 buf_[write_pos()] = b;
52 used_++;
53 return true;
54 }
55
56 // Reads a single byte from the ringbuffer. Returns true if successful, or
57 // false if the buffer is empty.
58 bool read(byte* b) {
59 if (used_ == 0) return false;
60 *b = buf_[head_];
61 head_++;
62 if (head_ == capacity_) head_ = 0;
63 used_--;
64 return true;
65 }
66
67 // Reads up to 'len' bytes, but no more than the current value of used(), from
68 // the ringbuffer. Returns the count of bytes read.
69 size_t read(byte* data, size_t len) {
70 if (len > used_) len = used_;
71 if (len == 0) return 0;
72 size_t split = capacity_ - head_;
73 if (len < split) {
74 memcpy(data, &buf_[head_], len);
75 head_ += len;
76 } else {
77 memcpy(data, &buf_[head_], split);
78 memcpy(data + split, &buf_[0], len - split);
79 head_ = len - split;
80 }
81 used_ -= len;
82 return len;
83 }
84
85 private:
86 size_t write_pos() const {
87 size_t pos = head_ + used_;
88 if (pos >= capacity_) pos -= capacity_;
89 return pos;
90 }
91
92 std::unique_ptr<byte[]> buf_;
93 size_t capacity_;
94 size_t head_;
95 size_t used_;
96};
97
98} // namespace roo_io
size_t write(const byte *data, size_t len)
Definition ringbuffer.h:29
size_t read(byte *data, size_t len)
Definition ringbuffer.h:69
size_t used() const
Definition ringbuffer.h:16
size_t capacity() const
Definition ringbuffer.h:15
bool write(byte b)
Definition ringbuffer.h:49
bool empty() const
Definition ringbuffer.h:20
bool read(byte *b)
Definition ringbuffer.h:58
size_t free() const
Definition ringbuffer.h:17
bool full() const
Definition ringbuffer.h:19
RingBuffer(size_t capacity)
Definition ringbuffer.h:12
Definition byte.h:6
roo::basic_string_view< CharT, Traits > basic_string_view
Definition string_view.h:8
roo::byte byte
Definition byte.h:8