summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2017-05-18 13:42:56 +0200
committerGitHub <noreply@github.com>2017-05-18 13:42:56 +0200
commitc2854381b3250d4067ec051f7b8f198f4e414bf2 (patch)
tree4d15816d5b686d6574f872084864345de463273a
parent871b6b5517a8d4e7105a19e44b219a8283cb34f7 (diff)
parent803a54d93c78630929352d01a2ea7fcce0c5e590 (diff)
Merge pull request #8649 from neikeq/pr-ringbuffer-find
RingBuffer: Adds find() method
-rw-r--r--core/ring_buffer.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/core/ring_buffer.h b/core/ring_buffer.h
index d5085e9560..8b32bb5e10 100644
--- a/core/ring_buffer.h
+++ b/core/ring_buffer.h
@@ -101,6 +101,32 @@ public:
return p_size;
};
+ int find(const T &t, int p_offset, int p_max_size) {
+
+ int left = data_left();
+ if ((p_offset + p_max_size) > left) {
+ p_max_size -= left - p_offset;
+ if (p_max_size <= 0)
+ return 0;
+ }
+ p_max_size = MIN(left, p_max_size);
+ int pos = read_pos;
+ inc(pos, p_offset);
+ int to_read = p_max_size;
+ while (to_read) {
+ int end = pos + to_read;
+ end = MIN(end, size());
+ int total = end - pos;
+ for (int i = 0; i < total; i++) {
+ if (data[pos + i] == t)
+ return i + (p_max_size - to_read);
+ };
+ to_read -= total;
+ pos = 0;
+ }
+ return -1;
+ }
+
inline int advance_read(int p_n) {
p_n = MIN(p_n, data_left());
inc(read_pos, p_n);